Verdaccio a deterministické zamykací soubory

Soubory zámku klienti na správci balíčků uzlů (npm) nejsou novým tématem, příze rozbila svět správců balíčků uzlů termínem zvaným determinismus poskytnutím nového souboru vygenerovaného po instalaci nazvaného yarn.lock pro připnutí a zmrazení závislostí s cílem vyhnout se nekonstantnostem napříč více instalacemi.

Pokud používáte soukromý registr jako Verdaccio, může to být problém s potvrzením souboru zámku v úložišti pomocí soukromé nebo místní domény jako adresy URL registru a pak někdo jiný kvůli jeho prostředí není schopen načíst tarbally definované v souboru zámku. .

Toto je pouze problém, který musí vyřešit všichni správci balíčků. V dnešní době není těžké vidět společnosti, které používají svůj vlastní registr k hostování soukromých balíčků nebo používají Verdaccio funkce napájení uplinky řeší závislosti z více než jednoho registru pomocí jednoho koncového bodu.

Jak vypadá soubor zámku?

Soubor zámku vypadá jinak v závislosti na správci balíčků, který používáte, v případě npm jako příklad vypadá takto

"[@babel/code-frame](http://twitter.com/babel/code-frame)@7.0.0-beta.44":
 version "7.0.0-beta.44"
 resolved "[http://localhost:4873/@babel%2fcode-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9](http://localhost:4873/@babel%2fcode-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9)"
 dependencies:
 "[@babel/highlight](http://twitter.com/babel/highlight)" "7.0.0-beta.44"

Výše uvedený úryvek je jen malou částí tohoto velkého souboru, který se nikdo neodváží řešit, když dojde ke konfliktům. Chci však, abyste se zaměřili na pole nazvané vyřešeno .

Jednoduchý příklad s Verdaccio jako localhost

Předpokládejme, že používáte Verdaccio a příze pro místní účely a konfigurace vašeho registru odkazuje na.

yarn config set registry http://localhost:4873/

Po spuštění instalace, instalace příze, je vygenerován soubor zámku a každá závislost bude mít pole s názvem resolved, které ukazuje přesně na URI, kam by se měl tarball stáhnout v budoucí instalaci. To znamená, že správce balíčků bude spoléhat na takové URI bez ohledu na to, co.

V případě pnpm vypadá soubor zámku trochu jinak, podrobně to uvidíme později v tomto článku.

// yarn.lock

math-random@^1.0.1:
 version "1.0.1"
 resolved "[http://localhost:4873/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac](http://localhost:4873/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac)"

Představme si, že byste možná chtěli změnit svou doménu, kde je hostován váš registr a pole vyřešené stále ukazuje na předchozí umístění, a váš správce balíčků již nebude moci řešit závislosti projektu.

Obvyklým řešením je smazat celý soubor zámku a vygenerovat nový , ale to není praktické pro velké týmy, protože vás to zažene do konfliktů mezi pobočkami, které se těžko řeší.

Takže Jak mohu použít soukromý registr, abych se vyhnul vyřešili jste problém s polem? . Všichni klienti řeší tento problém jiným způsobem, podívejme se, jak to dělají.

Jak používá vyřešené pole …?

npm používá JSON jako formát pro soubor zámku. Dobrá zpráva je od [email protected] ignoruje vyřešené pole v souboru package-lock.json a v podstatě se vrátí k poli definovanému v .npmrc nebo přes argument --registry pomocí CLI v případě, že existuje, jinak použije pole definované v vyřešeném poli.

Chyba kapaliny:interní

V současné době můžete bezpečně používat npm cli se souborem zámku s Verdaccio nezávisle na URL, kde byl tarball doručen. Doporučil bych však sdílet místní soubor .npmrc s místně nastaveným výchozím registrem nebo o tom informovat svůj tým.

Pokud používáte přízi, příběh je trochu jiný. Do verze 1.9.4 se snaží vyřešit to, co soubor zámku definuje jako první možnost.

Byly otevřeny některé odkazy na PR, RFC nebo vstupenky, kde se diskutovalo o tom, jak tento problém správně řešit, a pokud jste ochotni ponořit se do tohoto tématu, dovolte mi podělit se o nejzajímavější vlákna, která byste mohli sledovat:

  • Nahradit vyřešené pole hashem https://github.com/yarnpkg/rfcs/pull/64#issuecomment-414649518
  • yarn.lock by neměl obsahovat základní registr domén https://github.com/yarnpkg/yarn/issues/3330
  • Odeberte název hostitele ze souborů zámku https://github.com/yarnpkg/yarn/issues/5892

pnpm používá stejný přístup jako ostatní správci balíčků, kteří generují soubor zámku, ale v tomto případě se soubor nazývá shrinkwrap.yaml, který je založen ve formátu yaml.

dependencies:
 jquery: 3.3.1
 parcel: 1.9.7
packages:
 /@mrmlnc/readdir-enhanced/2.2.1:
 dependencies:
 call-me-maybe: 1.0.1
 glob-to-regexp: 0.3.0
 dev: false
 engines:
 node: '\>=4'
 resolution:
 integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
 tarball: /@mrmlnc%2freaddir-enhanced/-/readdir-enhanced-2.2.1.tgz

....

registry: '[http://localhost:4873/'](http://localhost:4873/')
shrinkwrapMinorVersion: 9
shrinkwrapVersion: 3
specifiers:
 jquery: ^3.3.1
 parcel: ^1.9.7

Výše uvedený příklad je jen malý úryvek toho, jak tento dlouhý soubor vypadá, a můžete si všimnout, že v dolní části souboru zámku je přidáno pole s názvem registr, které bylo v některých scénářích zavedeno za účelem snížení velikosti souboru zámku. pnpm se rozhodne nastavit doménu jako součást pole tarball.

pnpm se pokusí načíst závislosti pomocí registru definovaného v lockfile, jak to dělá příze . Pokud se však doména změní, musíte pole registru aktualizovat ručně, není to těžké, ale je to lepší než nic.

pnpm již otevřel lístek k řízení tohoto problému, nechám níže odkaz na něj.

Odeberte pole "registr" z "shrinkwrap.yaml" · Vydání #1353 · pnpm/pnpm

Řešení registru s rozsahem

Běžným způsobem směrování soukromých balíčků je směrování závislostí s rozsahem přes jiný registr. Toto funguje na npm a pnpm

registry=[https://registry.npmjs.org](https://registry.npmjs.org/)
@mycompany:registry=http://verdaccio-domain:4873/

Podle mého názoru je to jen řešení, které závisí na počtu nebo rozsahech, které zvládáte, abyste se rozhodli, zda to stojí za to. Kromě toho správce balíčků vynechá ty balíčky, které se neshodují s rozsahem, a váš soukromý registr je nevyřeší.

Závěr

správci balíčků pracují na vyřešení těchto problémů se zpětnou kompatibilitou a dobrým výkonem.

V tuto chvíli je nejlepším řešením, pokud sdílíte tento problém, používání npm, dokud se ostatní klienti nerozhodnou, co mají dělat nebo podle výše uvedených doporučení pro každého klienta .