Befria oss från dependency hell

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

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.
Alt Text
”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.

Alt Text

⬆️ 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 nya PATCH uppdateringar, men inte större eller mindre. Så ~1.3.1 kan installera 1.3.9, men inte 1.4.0

prefix med caret ^ ger dig några nya PATCH och MINOR versioner, men inte större. Så ^1.3.1 kan installera 1.4.9 men inte 1.5.0
 Alt Text
 Alt Text

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.61.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 milkpaket.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.

Lämna ett svar

Din e-postadress kommer inte publiceras.