Vraag Wat is het verschil tussen tilde (~) en caret (^) in package.json?


Nadat ik een upgrade had uitgevoerd naar de nieuwste stal node en npm, Ik heb geprobeerd npm install moment --save. Het slaat de invoer op in de package.json met de caret(^) voorvoegsel. Eerder was het een tilde(~) voorvoegsel.

  1. Waarom worden deze wijzigingen doorgevoerd? npm?
  2. Wat is het verschil tussen tilde(~) en caret(^)?
  3. Wat zijn de voordelen boven anderen?

2242
2018-03-12 06:02


oorsprong


antwoorden:


In de eenvoudigste bewoordingen komt de tilde overeen met de meest recente minorversie   (het middelste cijfer). ~ 1.2.3 zal overeenkomen met alle 1.2.x-versies maar zal   mis 1.3.0.

De caret daarentegen is meer ontspannen. Het zal u updaten naar   de meest recente hoofdversie (het eerste nummer). ^ 1.2.3 komt overeen   elke versie van 1.x.x inclusief 1.3.0, maar houdt het uit op 2.0.0.

http://fredkschott.com/post/2014/02/npm-no-longer-defaults-to-tildes/


2626
2018-03-12 08:28



Ik wil ook de officiële npmjs-documentatie toevoegen waarin alle methoden voor versiespecificiteit worden beschreven, inclusief de methoden waarnaar in de vraag wordt verwezen -

https://docs.npmjs.com/files/package.json

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version "Ongeveer gelijk aan versie" Zie npm semver - Tilde Ranges & semver (7)
  • ^version "Compatibel met versie" Zie npm semver - Caret Ranges & semver (7)
  • version Moet exact overeenkomen met de versie
  • >version Moet groter zijn dan versie
  • >=version enz
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1, etc., maar niet 1.3.0
  • http://sometarballurl (dit kan de URL zijn van een tarball die lokaal wordt gedownload en geïnstalleerd
  • * Komt overeen met elke versie
  • latest Verkrijgt de nieuwste release

De bovenstaande lijst is niet uitputtend. Andere versiespecificaties bevatten GitHub-url's en GitHub-gebruikersrepresentaties, lokale paden en pakketten met specifieke npm-tags


568
2017-09-16 06:25



Met Npm kunt u een nieuwere versie van een pakket installeren dan de gespecificeerde. Tilde gebruiken (~) geeft u bugfix releases en caret (^) geeft u ook backwards compatible nieuwe functionaliteit.

Het probleem is dat oude versies meestal geen bugfixes ontvangen, dus npm gebruikt caret (^) als de standaardinstelling voor --save.

semver table

Volgens: "Semver uitgelegd - waarom is er een caret (^) in mijn package.json?".

Notitie dat de regels van toepassing zijn op versies boven 1.0.0 en niet elk project volgt semantische versies. Voor versies 0.x.x is alleen de caret toegestaan lap updates, d.w.z. het gedraagt ​​zich hetzelfde als de tilde. Zien "Caret Ranges"

Hier is een visuele uitleg van de concepten:

semver diagram

Bron: "Cheatsheet Semantische versie".


346
2017-07-30 20:40



~ corrigeert hoofd- en ondergeschikte nummers. Het wordt gebruikt wanneer u klaar bent om bugfixes te accepteren in uw afhankelijkheid, maar geen onverenigbare wijzigingen wilt.

^ repareert alleen het hoofdnummer. Het wordt gebruikt wanneer u nauwlettend op uw afhankelijkheden let en klaar bent om uw code snel te wijzigen als een kleine release niet compatibel is.

Naast dat, ^ is niet ondersteund door oude npm-versies, en moet met de nodige voorzichtigheid worden gebruikt.

Zo, ^ is een goede standaard, maar het is niet perfect. Ik raad aan de semver-operator zorgvuldig te kiezen en te configureren die het meest nuttig voor u is.


74
2018-03-12 23:05



Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Gebruik npm semver calculator om uit te proberen. (Hoewel de uitleg voor ^ (inclusief alles groter dan een bepaalde versie in dezelfde hoofdreeks) en ~ (inclusief alles groter dan een bepaalde versie in hetzelfde ondergeschikte bereik) niet 100% correct is, lijkt de rekenmachine goed te werken )
  • Als alternatief, gebruik SemVer Check in plaats daarvan, waarvoor u geen pakket hoeft te kiezen en ook uitleg biedt.

Wijzigingen toestaan ​​of niet toestaan

  • Pin-versie: 1.2.3.
  • Gebruik ^ (zoals hoofd). Staat updates op het tweede niet-nulniveau van links toe: ^0.2.3 middelen 0.2.3 <= v < 0.3.
  • Gebruik ~ (zoals staart). Over het algemeen het meest rechtse niveau bevriezen of nul instellen als dit wordt weggelaten:
    • ~1 middelen 1.0.0 <= v < 2.0.0
    • ~1.2 middelen 1.2.0 <= v < 1.3.0.
    • ~1.2.4 middelen 1.2.4 <= v < 1.3.0.
  • Het meest rechtse niveau annuleren: 0.2 middelen 0.2 <= v < 1. Is anders dan ~ omdat:
    • Het starten van een weggelaten niveau-versie is altijd 0
    • U kunt de belangrijkste startversie instellen zonder sublevels op te geven.

Alle (hopelijk) mogelijkheden

Stel het starthoofdniveau in en sta updates toe naar boven

*  or "" (empty string)   any version
1                         v >= 1

Hoofdniveau bevriezen

~0 (0)            0.0 <= v < 1
0.2               0.2 <= v < 1          // Can't do that with ^ or ~ 
~1 (1, ^1)        1 <= v < 2
^1.2              1.2 <= v < 2
^1.2.3            1.2.3 <= v < 2
^1.2.3-beta.4     1.2.3-beta.4 <= v < 2

Bevries klein niveau

^0.0 (0.0)        0 <= v < 0.1
~0.2              0.2 <= v < 0.3
~1.2              1.2 <= v < 1.3
~0.2.3 (^0.2.3)   0.2.3 <= v < 0.3
~1.2.3            1.2.3 <= v < 1.3

Patch niveau bevriezen

~1.2.3-beta.4     1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta       0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4     0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)

Geen updates toestaan

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Merk op: Missing major, minor, patch of specificeren beta zonder nummer, is hetzelfde als any voor het ontbrekende niveau.

Merk op: Wanneer u een pakket installeert dat heeft 0 als hoofdniveau installeert update alleen nieuwe bèta / pr-niveauversie! Dat is omdat npm sets ^ als standaard in package.json en wanneer de geïnstalleerde versie is zoals 0.1.3, het bevriest alle major / minor / patch-niveaus.


66
2017-10-11 16:52



~ : Redelijk dichtbij naar

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: Verenigbaar met

   ^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0

42
2018-06-27 16:12



Hat matching kan als "broken" worden beschouwd omdat het niet zal worden bijgewerkt ^0.1.2 naar 0.2.0. Wanneer de software in opkomst is gebruik 0.x.y versies en hoedmatching komen alleen overeen met het laatst variërende cijfer (y). Dit gebeurt expres. De reden is dat, terwijl de software evolueert, de API snel verandert: op een dag heb je deze methoden en de andere dag heb je die methoden en de oude zijn weg. Als je de code niet wilt breken voor mensen die je bibliotheek al gebruiken, ga je en verhoog je de hoofdversie: b. 1.0.0 -> 2.0.0 -> 3.0.0. Dus, tegen de tijd dat uw software uiteindelijk voor 100% gereed en volledig is, zal het als een versie zijn 11.0.0 en dat ziet er niet erg betekenisvol uit en ziet er eigenlijk verwarrend uit. Als u echter aan de andere kant was 0.1.x -> 0.2.x -> 0.3.x versies en tegen de tijd dat de software uiteindelijk voor 100% klaar is en met volledige functionaliteit wordt uitgebracht als versie 1.0.0 en het betekent "Deze release is een service voor de lange termijn, je kunt doorgaan en deze versie van de bibliotheek gebruiken in je productiecode, en de auteur zal alles morgen, of de volgende maand, niet veranderen en hij zal de pakket".

De regel is: gebruik 0.x.y versiebeheer wanneer uw software nog niet is uitgerijpt en laat deze vrij met het verhogen van het middelste cijfer wanneer uw openbare API verandert (dus mensen hebben ^0.1.0 zal niet krijgen 0.2.0 update en het zal hun code niet breken). Laat de software daarna rijpen als deze volwassen is 1.0.0 en verhoog het meest linkse cijfer telkens wanneer uw openbare API verandert (dus mensen die hebben ^1.0.0 zal niet krijgen 2.0.0 update en het zal hun code niet breken).

Given a version number MAJOR.MINOR.PATCH, increment the:

MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards-compatible manner, and
PATCH version when you make backwards-compatible bug fixes.

21
2017-10-19 11:24



^ is 1. [any]. [any] (laatste kleine versie)
~ is 1.2. [any] (laatste patch)

Een geweldige lezen is deze blog post over hoe semver van toepassing is op npm
en wat ze doen om het te laten matchen de semver-standaard
http://blog.npmjs.org/post/98131109725/npm-2-0-0


20
2017-12-15 18:07