node.js - Hur man använder yarn add/npm install med monorepos
Jag behöver ladda ner ett node-paket från ett privat monorepo på GitHub, liknande detta:
monorepoProject
--- subProjectA
--- subProjectB
Och både subProjectA och subProjectB är TypeScript-projekt, som ser ut som diagrammet nedan:
subProjectB:
--- dist
--- src
--- index.ts
--- myCode.ts
--- package.json
--- README.md
--- tsconfig.json
Detta är projektets länk:
https://github.com/company/monorepoProject
För att klona via SSH:
git clone [email :company/monorepoProject.git
Jag försökte använda gitpkg på detta sätt:
yarn add 'https://gitpkg.now.sh/company/monorepoProject/subProjectB?commitHash123123'
men jag hade ingen framgång. Vad kan jag göra för att ladda ner ett nodpaket från en undermapp på Github?
Svar #1
Låt oss använda mitt monorepo, https://github.com/codsen/codsen — ett monorepo med en massa npm-paket — som ett exempel.
Kort sagt, det beror på vad du menar med "behöver ladda ner". Dessutom, behöver du skript/UMD/IIFE eller en ESM/CJS-byggnad.
Om du vill bidra, klona hela monorepot på GitHub, arbeta med det specifika delpaketet (cd till packages/* och använd paketets npm-skript såsom test osv). Till exempel kan du se att några personer har forkade mitt monorepo. De skulle experimentera och ibland skapa en PR från sin fork.
Om du vill använda ett av monorepos delprogram, teoretiskt sett borde underhållare publicera det på npm och du skulle använda det från npm, via normal npm i-process. Så, du behöver inte plocka ut paketet ur monorepo från första början.
Om det inte är möjligt att använda npm, och du har ett fungerande monorepo, kan du teoretiskt skapa symboliska länkar från roten av varje paket manuellt in i projektets node_modules. Det är smutsigt men det är möjligt. Exempel är så här: ln -s /Users/roy/packages/detergent /Users/roy/packages/object-all-values-equal-to/node_modules/detergent (här skapar jag en symbolisk länk till detergent i object-all-values-equal-to node_modules, så att detergent kan användas som ett beroende).
Nu är det osannolikt, men om du på något sätt verkligen behöver plocka ut programmet ur monorepot, låt oss säga att det inte har publicerats till npm, kanske det är för internt bruk. I så fall, kontrollera licensen, om det är en tillåtande open source-licens kan du git-klona hela monorepot, kopiera de filer du behöver in i ditt projekt — bara se till att korrekt attribuera skaparen (vanligtvis, kopiera deras MIT-licens under din MIT-licens, i samma fil och eventuellt nämna vilka filer som är deras) — se till att licensen är Open Source, till exempel MIT (kolla i package.json). Utmaningen kommer vara att fixa saknade imports men det kan göras.
Till exempel, jag har underhållsskript - om du vill ta dem och använda dem i ditt monorepo, skulle du behöva kopiera och klistra in relevanta filer och ge kredit genom att behålla min MIT-licens tillsammans med din licens.
Om du behöver ett monorepo-baserat paket för att driva ditt webbprojekt, skulle du normalt konsumera det paketet från npm och använda bundlers som webpack. I små projekt kan du tycka att det går snabbare att hämta UMD/IIFE-skriptet, antingen direkt från CDN eller spara det som en lokal fil. Till exempel bygger, committar och publicerar jag IIFE-bygg av icke-CLI:er, de är tillgängliga från JSDelivr och andra. Till exempel, <script src="https://cdn.jsdelivr.net/npm/detergent/dist/detergent.umd.js"></script>.
Också, när du säger "privat monorepo" skulle jag först förstå det som stängt-källkod-projekt, de "privata paketen" som npm använder termen. Det påverkar inte hela konsumtionsfrågan, bara sekretess och juridiska aspekter. Men kanske menade du "personligt monorepo" eller "någons monorepo"?
Om det är ett riktigt privat monorepo, ett verkligt privat, sluten källkods företags paket, skulle du behöva ställa in autentiseringsuppgifter, se npm-sidan.
Också, när du nämnde GitPkg. Jag kollade det, det är konstigt. Låt oss ta min monorepo som exempel, säg att du ville hämta detergent-paketet från git. Tja, dåliga nyheter, jag committar inte byggartefakterna (dist/), jag committar bara källfilerna, så något i stil med npm install 'https://gitpkg.now.sh/codsen/codsen/packages/detergent?main' är inte möjligt eftersom detergent-the-program kommer från git-ignorerade (men inte npm-ignorerade) dist/-mappen. Men jsDelivr plockar upp paket som tidigare publicerats till npm, till exempel, se https://www.jsdelivr.com/package/npm/detergent?path=dist — notera UMD- och ESM-byggnaderna, men de kommer från npm, det är inte att konsumera från GitHub.