zou moeten proberen leer hoe je een Gatsby Themaproject kunt opzetten met Lerna: deze handleiding zal je helpen begrijpen wat een mono-repo is en hoe je het kunt beheren met Lerna met behulp van NPM in plaats van Yarn Workspaces.
Index
- Wat is Lerna en waarom is het proberen waard?
- Lerna instellen met NPM uit de shell
- Steigermappen en bestanden met shell
- Lerna
- Kies uw aanpak
- orkestreer alles met Lerna bootstrap
- commando ‘ s en scripts
- Update Wizard
Wat is Lerna en waarom het de moeite waard is om te proberen?
ik begon de Gatsby Theme Authoring course van Jason Lengstorf (@jlengstorf) te volgen en besefte al snel dat ik niets weet over ‘Yarn Workspaces’. Het is een mooie manier om een mono-repo te beheren.: een repository die meer dan één project binnen heeft en afhankelijkheden kan delen.
door doppelmutzi uit doppelmutzi.github.io:
dergelijke projecten worden werkruimten of pakketten genoemd. In tegenstelling, het gebruik van meerdere repositories met elke repository behuizing Slechts één project wordt een Multi-Repo aanpak genoemd.
een ding dat me verbaasde met de mono-repo aanpak was dat mijn pakketten / werkruimten lokaal dezelfde node_modules
afhankelijkheden kunnen delen. Dit bespaart me tijd en fysieke ruimte.
lerna en yarn workspaces geven ons de mogelijkheid om bibliotheken en apps in één repo te bouwen zonder ons te dwingen om te publiceren naar npm of andere registers. Het mooie achter deze technologieën is dat ze pakketafhankelijkheden kunnen vinden door pakket te analyseren.json-bestanden in de hoofdmap van elk project. Hierdoor maken deze tools het overbodig om handmatig symlinks te maken of direct een “low-level” NPM-koppeling te gebruiken.
nu, zelfs als u al yarn workspaces
gebruikt, denk ik dat Lerna het proberen waard is omdat het een reeks vantages biedt. Naast je kon Lerna gebruiken met garen werkbladen:
met één lerna commando kun je door alle of bepaalde pakketten heen itereren, waarbij je een reeks bewerkingen uitvoert (zoals linten, testen en bouwen) op elk pakket. Daardoor, het compliment garen werkruimten die neemt de afhankelijkheid management proces.
dus uiteindelijk heb ik besloten om Lerna te leren-sorry voor de tong twister – maar ik wilde niet overschakelen naar garen (omdat ik ben gewoon comfortabel met npm). Hier is hoe ik erin geslaagd om het te laten werken:
Lerna instellen met NPM uit de shell
Maak een map aan voor uw project en voer het in met dit commando:
mkdir try-lernacd try-lerna
u kunt Lerna globaal installeren (npm i -g lerna
) of gebruiken met npx.
-
Init lerna
npx lerna init --independent
dit zal:
-
init
een git repository - Maak een
package.json
- Maak een
lerna.json
- Maak een
packages
map (hier kunt u uw werkbladen plaatsen).
Packages is hoe lerna werkruimtes aanroept.
u kunt de pakketten rangschikken zoals u wilt, als u dat wilt kunt u alle pakketten in de hoofdmap plaatsen en dan de array wijzigen om overeen te komen (zoals een “yarn workspaces” aanpak).
My lerna.json-bestand heeft stream: true
(om gatsby-uitvoer te zien bij het uitvoeren van develop met lerna) en hoist: true
(om node_modules ook met het commando lerna add
te hijsen; Ik zal deze laatste functie doorsturen uitleggen):
{ "packages":, "version":"independent", "stream":true, "command":{ "bootstrap":{ "hoist":true } }}
u kunt dit handmatig toevoegen of deze eenvoudige shell-opdracht gebruiken:
echo "{\r\t\"packages\":,\r\t\"version\":\"independent\",\r\t\"stream\":true,\r\t\"command\":{\r\t\t\"bootstrap\":{\r\t\t\t\"hoist\":true\r\t\t}\r\t}\r}" > lerna.json
Steigermappen en bestanden met shell
deze sectie kan met de hand worden gedaan na de eerste les van Jason Lengstorf ‘ s cursus die in de inleiding is gelinkt.
ik verzamel gewoon alle basispassages om ze met een paar commando ‘ s uit de shell te volbrengen.
als u mijn aanpak wilt gebruiken, vergeet dan niet om “NAME” te vervangen door de naam van uw thema en kopieer en plak deze commando ‘ s:
mkdir -p packages/{gatsby-theme-NAME,site}
touch packages/{gatsby-theme-NAME,site}/{index.js,package.json}
echo "//loop" >> packages/{gatsby-theme-NAME,site}/index.js
initiële inhoud voor pakket.json in de sitemap:
echo "{\r\t\"private\":true,\r\t\"name\":\"site\",\r\t\"version\":\"1.0.0\",\r\t\"license\":\"MIT\",\r\t\"scripts\":{\r\t\t\"builds\":\"gatsby build\",\r\t\t\"develop\":\"gatsby develop\",\r\t\t\"clean\":\"gaysby clean\"\r\t}\r}" >> packages/site/package.json
pakje.json op het mapthema (vervang de naam opnieuw en plaats ook UW_NPM_USER):
echo "{\r\t\"name\": \"@YOUR_NPM_USER/gatsby-theme-NAME\",\r\t\"version\": \"1.0.1\",\r\t\"license\": \"MIT\",\r\t\"main\": \"index.js\",\r\t\"scripts\": {\r\t\t\"builds\": \"gatsby build\",\r\t\t\"develop\": \"gatsby develop\",\r\t\t\"clean\": \"gaysby clean\"\r\t}\r}" >> packages/gatsby-theme-NAME/package.json
hier is het resultaat:
├── packages│ ├── site│ └── gatsby-theme-NAME├── .gitignore├── package.json└── lerna.json
PS: Ik adviseer u om een .gitignore
aan te maken en meteen node_modules
toe te voegen:
echo "node_modules" > .gitignore
Lerna
een probleem met Lerna is dat je niet meerdere afhankelijkheden per pakket kunt installeren met één enkel commando (zoals je doet met yarn workspace name_workspace add package1 package2 etc
). Je moet het één voor één doen, zoals dit (als je het niet globaal hebt geà nstalleerd moet je elk commando met npx
voorafgaan):
lerna add gatsby --scope site
lerna add react --scope site
lerna add react-dom --scope site
hier wordt --scope site
gebruikt om Lerna te vertellen alleen in het pakket “site”te installeren.
u kunt echter een afhankelijkheid installeren, laten we zeggen gatsby
, voor elk pakket met slechts één commando:
lerna add gatsby
dit commando zal:
- installeer Gatsby voor elk pakket (dus in dit geval voor de Site en ook voor het themapakket).
- Als u
hoist
hebt ingeschakeld op lerna.json het zal een map node_modules aanmaken in je root (zie ‘Lerna Bootstrap forward’):
Kies uw aanpak
Als u deze aanpak leuk vindt, kunt u doorgaan met het installeren van alle veelvoorkomende afhankelijkheden (react
, react-dom
) op de pakketten. Als u slechts enkele afhankelijkheden voor één pakket wilt installeren, gebruik dan --scope name_of_the_package
(onthoud dat dit de naam is die op het pakket is opgegeven.json niet de naam van de map).
u kunt ook npm gebruiken door elke gewenste afhankelijkheid in het betreffende pakket te installeren. Maar vergeet niet dat deze aanpak zal een node_modules afhankelijkheden installeren voor elke respectievelijke map. Dit kan schoon zijn en daarna gehesen worden. Hoewel deze optie geldig is, zal het u meer tijd kosten.
welke optie u ook kiest vergeet niet om het lokale themapakket toe te voegen/te koppelen als een afhankelijkheid voor het Sitepakket (gebruik de naam die u hebt ingesteld op package.json
):
lerna add @YOUR_NPM_USER/gatsby-theme-NAME --scope=site
orkestreer alles met Lerna bootstrap
uiteindelijk kun je veilig doen:
lerna bootstrap
dit commando is erg handig, vooral als je je pakket al hebt.json gevuld met hun respectieve afhankelijkheden.
met hoist: true
optie (op lerna.json
) zal het een gedeelde node_modules
map in de root plaatsen, daarna zal het lokale afhankelijkheden koppelen in hun respectievelijke package.json
.
I really like –hoist feature Het is een proces dat dubbele afhankelijkheden op de node_modules voorkomt, dus het bespaart fysieke ruimte en installatietijd.
Als u om welke reden dan ook eerst iets wilt opschonen, kunt u dit doen:
lerna clean && lerna link && lerna bootstrap
commando ‘ s en scripts uitvoeren
om scripts uit te voeren (geplaatst op de package.json
) moet u het Doelpakket opgeven (of niet) :
lerna run develop --scope Package_name
Lerna laat je ook commando ‘ s uitvoeren vanaf de root naar elk pakket (gebruik dash). Bijvoorbeeld::
lerna exec -- rm -rf node_modules
dit verwijdert knooppuntmodules op elke pakketmap.
Wizard bijwerken
in de toekomst, wanneer u uw pakketten moet bijwerken, kunt u de wizard bijwerken gebruiken:
npm install --save-dev lerna-update-wizard
dan moet u alleen deze opdracht uitvoeren en de wizard zal u helpen:
lernaupdate