Wat is de rol van de package-lock.json?

npm@5 is gepubliceerd, het heeft een nieuwe functie package-lock.json-bestand (na npm install) dat me in de war brengt . Ik wil weten, wat is het effect van dit bestand?


Antwoord 1, autoriteit 100%

Het slaat een exacte afhankelijkheidsstructuur met versiebeheer op in plaats van versiebeheer met ster te gebruiken zoals package.jsonzelf (bijv. 1.0.*). Dit betekent dat je de afhankelijkheden voor andere ontwikkelaars of prod-releases, enz. kunt garanderen. Het heeft ook een mechanisme om de boomstructuur te vergrendelen, maar zal over het algemeen opnieuw worden gegenereerd als package.jsonverandert.

Van de npm-documenten:

package-lock.json wordt automatisch gegenereerd voor alle bewerkingen waarbij npm de structuur node_modules of package.json wijzigt. Het beschrijft de exacte structuur die is gegenereerd, zodat volgende installaties identieke bomen kunnen genereren, ongeacht tussentijdse afhankelijkheidsupdates.

Dit bestand is bedoeld om te worden vastgelegd in bronbronnen en heeft verschillende doelen:

Beschrijf een enkele weergave van een afhankelijkheidsboom, zodat teamgenoten, implementaties en continue integratie gegarandeerd exact dezelfde afhankelijkheden installeren.

Geef gebruikers de mogelijkheid om in de tijd te reizen naar eerdere statussen van node_modules zonder de directory zelf te hoeven vastleggen.

Om een ​​grotere zichtbaarheid van boomveranderingen te vergemakkelijken door middel van leesbare source control diffs.

En optimaliseer het installatieproces door npm toe te staan ​​herhaalde metadata-resoluties voor eerder geïnstalleerde pakketten over te slaan.”

Bewerken

Om jrahhali’s vraag hieronder te beantwoorden over het gebruik van de package.jsonmet exacte versienummers. Houd er rekening mee dat uw package.jsonalleen uw directe afhankelijkheden bevat, niet de afhankelijkheden van uw afhankelijkheden (soms geneste afhankelijkheden genoemd). Dit betekent dat je met het standaard package.jsongeen controle hebt over de versies van die geneste afhankelijkheden, het rechtstreeks verwijzen naar hen of als peer-afhankelijkheden zal niet helpen, aangezien je ook geen controle hebt over de versietolerantie die je directe afhankelijkheden definiëren voor deze geneste afhankelijkheden.

Zelfs als u de versies van uw directe afhankelijkheden vergrendelt, kunt u niet 100% garanderen dat uw volledige afhankelijkheidsboom elke keer identiek zal zijn. Ten tweede wil je misschien niet-brekende wijzigingen (op basis van semantische versiebeheer) van je directe afhankelijkheden toestaan, waardoor je nog minder controle hebt over geneste afhankelijkheden, plus je kunt opnieuw niet garanderen dat je directe afhankelijkheden op een gegeven moment de semantische versiebeheerregels niet zullen breken zichzelf.

De oplossing voor dit alles is het vergrendelingsbestand dat, zoals hierboven beschreven, de versies van de volledige afhankelijkheidsboom vergrendelt. Hierdoor kunt u uw afhankelijkheidsboom voor andere ontwikkelaars of voor releases garanderen, terwijl u nog steeds nieuwe afhankelijkheidsversies (direct of indirect) kunt testen met uw standaard package.json.

NB. De vorige npm-shrinkwrap.jsondeed vrijwel hetzelfde, maar het vergrendelingsbestand hernoemt het zodat de functie duidelijker is. Als er al een krimpfolie-bestand in het project is, wordt dit gebruikt in plaats van een vergrendelingsbestand.


Antwoord 2, autoriteit 17%

Het is een zeer belangrijke verbetering voor npm: garandeer exact dezelfde versie van elk pakket.

Hoe zorg je ervoor dat je project met dezelfde pakketten in verschillende omgevingen in een andere tijd wordt gebouwd? Laten we zeggen dat u ^1.2.3in uw package.jsonkunt gebruiken, of dat sommige van uw afhankelijkheden op die manier worden gebruikt, maar hoe kunt u ervoor zorgen dat elke keer dat npm installdezelfde versie ophaalt in uw ontwikkelmachine en in de buildserver? package-lock.jsonzorgt ervoor.

npm installzal het vergrendelingsbestand opnieuw genereren.< br>
Voer npm ci< op de build-server of deployment-server br>
(die uit het vergrendelingsbestand leest en de hele pakketstructuur installeert)


Antwoord 3, autoriteit 8%

Er wordt naar

package-lock.jsongeschreven wanneer een numerieke waarde in een eigenschap zoals de eigenschap “version”, of een afhankelijkheidseigenschap wordt gewijzigd in package.json.

Als deze numerieke waarden in package.jsonen package-lock.jsonovereenkomen, wordt package-lock.jsongelezen van.

Als deze numerieke waarden in package.jsonen package-lock.jsonniet overeenkomen, wordt package-lock.jsongeschreven naar met die nieuwe waarden, en nieuwe modifiers zoals de caret en tilde als ze aanwezig zijn. Maar het is het cijfer dat de wijziging in package-lock.jsonactiveert.

Doe het volgende om te zien wat ik bedoel. Gebruik package.jsonzonder package-lock.jsonen voer npm installuit met:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.jsonheeft nu:

"sinon": {
  "version": "7.2.2",

Kopieer/plak nu beide bestanden naar een nieuwe map. Wijzig package.jsonin (alleen caret toevoegen):

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

voer npm installuit. Als er geen bestand package-lock.jsonwas, zou [email protected] zijn geïnstalleerd. npm installleest vanpackage-lock.jsonen installeert 7.2.2.

Verander nu package.jsonin:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

voer npm installuit. package-lock.jsonis geschreven naaren toont nu:

"sinon": {
  "version": "^7.3.0",

Antwoord 4, autoriteit 3%

Een belangrijk ding om te vermelden is de verbetering van de beveiliging die wordt geleverd met het pakketvergrendelingsbestand. Aangezien het alle hashes van de pakketten bewaart als iemand zou knoeien met het openbare npm-register en de broncode van een pakket zou wijzigen zonder zelfs de versie van het pakket zelf te veranderen, zou het worden gedetecteerd door het pakket-lock-bestand.


Antwoord 5

package-lock.json wordt automatisch gegenereerd voor alle bewerkingen waarbij npm de structuur node_modules of package.json wijzigt. Het beschrijft de exacte structuur die is gegenereerd, zodat volgende installaties identieke bomen kunnen genereren, ongeacht tussentijdse afhankelijkheidsupdates.

Het beschrijft een enkele weergave van een afhankelijkheidsboom, zodat teamgenoten, implementaties en continue integratie gegarandeerd exact dezelfde afhankelijkheden installeren. Het bevat de volgende eigenschappen.

{
    "name": "mobileapp",
    "version": "1.0.0",
    "lockfileVersion": 1,
    "requires": true,
    "dependencies": {
    "@angular-devkit/architect": {
      "version": "0.11.4",
      "resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
      "integrity": "sha512-2zi6S9tPlk52vyqNFg==",
      "dev": true,
      "requires": {
        "@angular-devkit/core": "7.1.4",
        "rxjs": "6.3.3"
      }
    },
}       

Antwoord 6

Dit bestand wordt automatisch aangemaakt en gebruikt door npm om uw pakketinstallaties bij te houden
en om de staat en geschiedenis van de afhankelijkheden van uw project beter te beheren. U
mag de inhoud van dit bestand niet wijzigen.


Antwoord 7

Het doel van het bestand package-lock.jsonis om de exacte versie bij te houden van elk pakket dat is geïnstalleerd, zodat een product op dezelfde manier 100% reproduceerbaar is, zelfs als pakketten worden bijgewerkt door hun beheerders.

Dit lost een zeer specifiek probleem op dat package.jsononopgelost liet. In package.json kun je instellen naar welke versies je wilt upgraden (patch of minor), met behulp van de semver-notatie.


Antwoord 8

package-lock.json: het bevat de exacte versiedetails die momenteel voor uw applicatie zijn geïnstalleerd.

Other episodes