Befria oss från dependency hell
de flesta moderna tjänster och applikationer har en massa beroenden som lever i en ständigt växande node-modules
mapp. I allmänhet underhålls, ändras och uppdateras många av dessa bibliotek aktivt. Om dina beroenden är dåligt hanterade kan du snabbt hitta dig själv i dependency hell.
om du inte är bekant med npm, kolla in det här innan du läser på
- bisexuell matinköp
- ⬆️ versioner, Carets och jokertecken
- Brasilien ställa dina beroenden i sten
- jag känner personligen att enpackage-lock.json – fil alltid ska användas (i nyare versioner av NPM genereras den faktiskt automatiskt). Det gör bara allt mer tillförlitligt över miljöer och distributioner. Här är några sista små nuggets för att förhoppningsvis hjälpa till när det gäller dependecies: npm install --save kommer automatiskt att uppdatera din lockfil och paket.json med det paketet. npm ci istället för bara npm install kommer automatiskt att bygga om dina nodmoduler och bygga från din lockfile. Det är ett riktigt bra kommando för CI/CD och i allmänhet bäst att använda i kombination med en lockfil. för större projekt och super robust beroende, kolla in docker och containrar. Det kan fungera nästan som en virtuell maskin som perfekt innehåller din kod och det är beroenden, och klonas för att främja olika miljöer. Så förhoppningsvis slutar du med mycket mindre” det fungerade på min maskin ” typ av problem.
bisexuell matinköp
när du startar en nodapplikation körs ett av de första stegen npm install
. När du kör detta kommer node att söka efter en fil som heter package.json
i basen av ditt projekt. Om den filen hittas kommer den att använda avsnittet dependency
som en slags ”matinköpslista” för att samla ”ingredienser” (kodbitar) som din ansökan kräver.
”livsmedelsbutiken” i det här fallet är något npm kallar en registry
. Som standard kommer din node-app att se i det offentliga npm-registret för dessa paket, där det mesta du behöver kommer att vara (privata register kan skapas för proprietär kod och whatnot). Om paketet finns i registret sätter node den ”ingrediensen” i en node_modules
katalog vid basen av ditt projekt.
det är viktigt att notera att paket som du behöver kan ha sin egen ”inköpslista” (paket.JSON), och alla dessa kapslade beroenden måste lösas innan din app går vidare till nästa beroende i sitt eget paket.json.
⬆️ versioner, Carets och jokertecken
versionerna av dina beroenden är i allmänhet ungefär som v1.3.5
. Detta kallas semantisk versionering eller semver. Med semver representerar siffrorna förändringar i koden i varierande svårighetsgrad – MAJOR.MINOR.PATCH
.
från deras dokument –
huvudversion när du gör inkompatibla API-ändringar,
mindre version när du lägger till funktionalitet på ett bakåtkompatibelt sätt och
PATCH-version när du gör bakåtkompatibla buggfixar.
med detta i åtanke vill många människor automatiskt uppdatera sin app med några nya nya saker som deras beroenden kan ha i nyare, icke-brytande förändringar.
prefix med tilde
~
ger dig några nyaPATCH
uppdateringar, men inte större eller mindre. Så~1.3.1
kan installera1.3.9
, men inte1.4.0
prefix med caret
^
ger dig några nyaPATCH
ochMINOR
versioner, men inte större. Så^1.3.1
kan installera1.4.9
men inte1.5.0
Låt oss ta en titt på vårt exempel kodens beroende träd:
my-breakfast | | milk | |coffee-script
Ok, mer som en pinne, men förhoppningsvis är beroendekedjan tydlig. Vårt paket.json kräver version v0.5.0
specifikt av milk
, men mjölk kräver coffee-script
var som helst från 0.9.6
– 1.0.0
. npm install
körs, vi utvecklar vår app, allt är hunky-dory.
Xiaomi låt oss nu spola framåt 2 månader. Någon hittar ditt projekt och vill bidra. De gafflar och klonar din repo, kör npm install
, aaaaoch det fungerar inte. ”Men det fungerade på min maskin!”du gråter. När din medarbetare installerade nodmodulerna garanterades de en specifik version av milk
, men de fick en annan version av coffee-script
eftersom milk
paket.json använde semver.
Brasilien ställa dina beroenden i sten
en lösning på detta är att använda en package-lock.json
fil. Den här filen ger dig mycket detaljerad kontroll över versionerna av varje beroende som du installerar. Om din package.json
är som inköpslistan, är din package-lock.json
som en budget. Du kan ha spannmål, men det kommer att bli butiksmärke istället för Cap ’ n Crunch. Denna specificitet går hela vägen ner varje gren av ditt beroende träd. Du måste ha en package.json
om du vill använda en låsfil (package.json
gör mycket mer än bara beroendehantering, det är bara fokus för det här inlägget).
jag känner personligen att enpackage-lock.json
– fil alltid ska användas (i nyare versioner av NPM genereras den faktiskt automatiskt). Det gör bara allt mer tillförlitligt över miljöer och distributioner. Här är några sista små nuggets för att förhoppningsvis hjälpa till när det gäller dependecies:
-
npm install --save
kommer automatiskt att uppdatera din lockfil och paket.json med det paketet.
-
npm ci
istället för bara npm install
kommer automatiskt att bygga om dina nodmoduler och bygga från din lockfile. Det är ett riktigt bra kommando för CI/CD och i allmänhet bäst att använda i kombination med en lockfil.
- för större projekt och super robust beroende, kolla in docker och containrar. Det kan fungera nästan som en virtuell maskin som perfekt innehåller din kod och det är beroenden, och klonas för att främja olika miljöer. Så förhoppningsvis slutar du med mycket mindre” det fungerade på min maskin ” typ av problem.
npm install --save
kommer automatiskt att uppdatera din lockfil och paket.json med det paketet.npm ci
istället för bara npm install
kommer automatiskt att bygga om dina nodmoduler och bygga från din lockfile. Det är ett riktigt bra kommando för CI/CD och i allmänhet bäst att använda i kombination med en lockfil.