Package.json içindeki tilde (~) ve caret (^) arasındaki fark nedir?


3383

Ben en son ahıra yükseltilmiş sonra nodeve npmdenedim npm install moment --save. Girişi önek package.jsonile kaydeder ^. Daha önce, bir tilde ~önekiydi.

  1. Bu değişiklikler neden yapılır npm?
  2. Tilde ~ve caret arasındaki fark nedir ^?
  3. Diğerlerine göre avantajları nelerdir?

42
Bilginize Eğer önekleri önlemek veya yaparak özel bir birini kullanabilirsiniz: npm config set save-prefix=''. ( ~Tercih ettiğiniz buysa tırnak işaretleri arasında durun.) Ben şahsen bunu yapıyorum ve üretimdeki şeyler için küçülüyorum.
fncomp



@fncomp yorumunu doğru yaptıysam açıklığa kavuşturmak istedi .. projende sadece bağımlılıkların belirli sürümlerini mi kullanıyorsun? ekibimiz bağımlılıkları yükseltmekte tereddüt ediyor. Bağımlılıklar için belirli sürümler veya '~' öneki kullanmanızı önerir misiniz?
18:17

@fncomp, "Bunu ben şahsen yaparım ve üretimdeki şeyler için küçültmek" diyerek ne demek istediğinizi ayrıntılı olarak açıklar mısınız? Teşekkürler!
blogs4t

Yanıtlar:


3842

Bkz NPM dokümanlar ve semver docs

~ sürüm "Yaklaşık sürüm" eşdeğer, küçük sürümü artırmak olmadan, gelecekteki tüm yama sürümleri için güncelleme. ~1.2.31.2.3'ten <1.3.0'a kadar olan sürümleri kullanacaktır.

^ sürüm "sürümüyle uyumlu", ana sürümü artırmadan, gelecekteki tüm küçük / yama sürümleri için güncelleyecektir. ^2.3.42.3.4 ile <3.0.0 arasındaki sürümleri kullanacaktır.

Aşağıdaki Yorumlara bakın.


325
Umarım bunu tam olarak düşünmeyen insanları yakalamak için gönderirsiniz, ancak hem ^ hem de ~ bağımlılıklarınızdan küçük ve serbest sürümlere güvenebileceğinizi varsayar. Bir kütüphane yayınlıyorsanız ve başkalarının size güvenmesini istiyorsanız, AŞAĞI AKIM BAĞIMLILIĞI KESİNLİKLE KABUL ETMEYİN. Bağımlılığınızdan gelen kötü bir nokta serbest bırakılması, yukarı yönde bir zincirleme reaksiyona neden olabilir ve insanlar armut şekline girdiğinde SİZİN kapınızı çalmasını sağlar. Bu, üretim kodunuzda npm shrinkwrap kullanmak için başka bir büyük nedendir.
tehfoo

8
Ayrıca, sürümlerinizi a ^veya a ile tamamlayan npm saçmalıklarını ortadan kaldırabilirsiniz ~. Sürümleriniz üzerinde sıkı kontrol sahibi olmak istiyorsanız bunu ayarlayın: npm config set save-prefix=''
kumarharsh

5
@prasanthv haklı: docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Caret Aralıkları ^ 1.2.3 ^ 0.2.5 ^ 0.0 0,4. [Büyük, küçük, yama] demetinde en soldaki sıfır olmayan rakamı değiştirmeyen değişikliklere izin verir. Başka bir deyişle, 1.0.0 ve üstü sürümler için düzeltme eki ve küçük güncelleştirmelere, 0.X> = 0.1.0 sürümleri için düzeltme eki güncelleştirmelerine izin verir ve 0.0.X sürümleri için hiçbir güncelleştirme yapılmaz.
rofrol

15
@jgillich semverde kullandığınızda 0.2.x, 2a değil major version. Bu yüzden docs.npmjs.com belirli kelimeleri kullandı: the left-most non-zero digit. Ayrıca bu durum hakkında: ^ 0.0.4, 0.0.4 anlamına gelir
rofrol

11
@FagnerBrack: Verdiğiniz belirli örnek doğru, ancak genellikle düşünme biçiminiz yanlış. Bir örnek: bakalım, paket var demek A3 sürümlerinde: 0.0.1, 0.0.2ve 0.0.3. Bir hata var, 0.0.1bu yüzden en azından 0.0.2paketinizde olmasını istersiniz B. Eğer yazarsanız 0.0.xelde edeceğiniz 0.0.3Tamam olduğu. Başka bir paketin Ama eğer Chem gerektirir Bve Asınırlamak gelmiştir ayrıca ve "A": "<0.0.2"alacağınız 0.0.1istediğini olmayan herhangi çatışma sorunu göstermeden. Tilde kullanmak ~0.0.2bu sorundan kaçınmanıza yardımcı olacaktır.
Maciej Sz

862

Soruda atıfta bulunulanlar da dahil olmak üzere sürüm özgünlüğü için tüm yöntemleri açıklayan resmi npmjs belgelerini de eklemek istiyorum -

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

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

  • ~version" Sürüme yaklaşık olarak eşdeğer" Bkz. Npm semver - Tilde Aralıkları ve semver
  • ^version"Versiyonu ile uyumlu" Bkz npm semver - Klavyeyle Aralıkları & semver (7)
  • version Sürüm tam olarak eşleşmelidir
  • >version Sürümden daha büyük olmalı
  • >=version vb
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1 vb. Ancak 1.3.0 değil
  • http://sometarballurl (bu, yerel olarak indirilecek ve kurulacak bir tarball'ın URL'si olabilir
  • * Herhangi bir sürümle eşleşir
  • latest En son sürümü alır

Yukarıdaki liste ayrıntılı değildir. Diğer sürüm belirteçleri arasında GitHub URL'leri ve GitHub kullanıcı repoları, yerel yollar ve belirli npm etiketli paketler bulunur


8
Tam bir sürüm aralığı belirtmek de mümkündür 1.2.0 || >=1.2.2 <1.3.0: Tam olarak 1.2.0 veya 1.2.2'den 1.3.0'a (dahil), ancak 1.2.1 veya 1.3.1 ve üstü değil ve aynı zamanda 1.1 değil .x ve altı.
CodeManX

Yukarıdakilerden daha spesifik bir bağlantı -> docs.npmjs.com/files/package.json#dependencies
Toby

"Approximately equivalent to version"ve "Compatible with version"~ ve ^ davranışlarını tanımlamak için bu kadar sinir bozucu olmayan spesifik yollardır. @Jgillich'a gerçek bir cevap verdiğiniz için teşekkür ederiz!
Scott Stafford

636

npm, bir paketin belirtilenden daha yeni bir sürümünün yüklenmesine izin verir. Tilde ( ~) kullanarak hata düzeltme sürümleri ve caret ( ^) size geriye dönük uyumlu yeni işlevler sağlar.

Sorun eski sürümleri genellikle çok fazla hata düzeltmeleri almaz, bu nedenle npm ^varsayılan olarak caret ( ) kullanır --save.

semver tablosu

Şuna göre: "Semver açıkladı - paketimde neden bir düzeltme işareti (^) var?" .

Not kurallar 1.0.0 yukarıdaki sürümleri için geçerli değil her proje semantik sürüm izler. 0.xx sürümlerinde, düzeltme işareti yalnızca düzeltme eki güncelleştirmelerine izin verir , yani, dalga işaretiyle aynı şekilde çalışır. Bkz. "Caret Aralıkları"

İşte kavramların görsel bir açıklaması:

semver diyagramı

Kaynak: "Anlamsal Sürüm Oluşturma Hileleri" .


2
^ 0.2.5 ne olacak? from docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : Düzeltme Aralığı Aralıkları ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. [Büyük, küçük, yama] demetinde en soldaki sıfır olmayan rakamı değiştirmeyen değişikliklere izin verir. Başka bir deyişle, 1.0.0 ve üstü sürümler için düzeltme eki ve küçük güncelleştirmelere, 0.X> = 0.1.0 sürümleri için düzeltme eki güncelleştirmelerine izin verir ve 0.0.X sürümleri için hiçbir güncelleştirme yapılmaz.
rofrol

11
@rofrol 1.0.0 öncesi herhangi bir sürümü kararsız olarak kabul edilir ve bu kurallar geçerli değildir
pspi

2
Yani açıklamanız tamamlanmadı
rofrol

5
@rofrol evet, okunabilirliği atlamak bazen iyidir, json paketine bağımlılık için 1.0.0'ın altında bir şeye sahip olma şansı oldukça düşüktür. ayrıca bkz. 20/80 prensibi, önemli olan şeylere odaklanmak için harika bir kuraldır
pspi

1
@pspi 1.0.0'ın altında sürümlere sahip olmak "olası değil" mi? 60 kişiden ~ 15'iniz var ve bunların çoğu belirsiz değil.
Dave Newton

99

Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Test için npm semver hesap makinesini kullanın . (^ (Aynı ana aralıktaki belirli bir sürümden daha büyük her şeyi dahil et) ve ~ (aynı küçük aralıktaki belirli bir sürümden daha büyük her şeyi dahil et) açıklamaları% 100 doğru olmasa da, hesap makinesi iyi çalışıyor gibi görünüyor )
  • Alternatif olarak, bir paket seçmenizi gerektirmeyen ve ayrıca açıklamalar sunan SemVer Check kullanın.

Değişikliklere izin verme veya izin vermeme

  • Pim sürümü: 1.2.3.
  • Kullanın ^(kafa gibi). Soldan ikinci sıfır olmayan düzeyde güncelleme yapılmasına izin verir: ^0.2.3anlamına gelir 0.2.3 <= v < 0.3.
  • Kullanın ~(kuyruk gibi). Genellikle en sağdaki seviyeyi dondurun veya atlanırsa sıfıra ayarlayın:
    • ~1 anlamına geliyor 1.0.0 <= v < 2.0.0
    • ~1.2anlamına gelir 1.2.0 <= v < 1.3.0.
    • ~1.2.4anlamına gelir 1.2.4 <= v < 1.3.0.
  • Ommit en sağdaki seviye: 0.2anlamına gelir 0.2 <= v < 1. Şunlardan farklıdır ~:
    • Atlanan düzey sürümünün başlatılması her zaman 0
    • Alt sürümü belirtmeden başlangıç ​​ana sürümünü ayarlayabilirsiniz.

Tüm (umarım) olasılıklar

Başlangıç ​​düzeyini başlat

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

Ana seviyeyi dondur

~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

Küçük seviyeyi dondur

^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

Yama seviyesini dondur

~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)

Güncellemelere izin verme

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Uyarı : Eksik büyük, küçük, yama veya betanumarasız belirtme any, eksik seviyeyle aynıdır .

Uyarı : 0Ana düzeyi olduğu bir paket yüklediğinizde , güncelleme yalnızca yeni beta / pr düzeyi sürümünü yükler! Bunun nedeni , yüklü sürümde varsayılan olarak npmayarlandığında ve bunun gibi olduğunda , tüm büyük / küçük / yama düzeylerini dondurmasıdır.^package.json0.1.3


İnsanlara projelere 0'dan başlamamalarını söyleyin çünkü kütüphane ve tüketen geliştiriciler sistemi anlamıyorlar, korkunç bir çözüm. Bence @asdfasdfads çok daha iyi bilgiye sahip.
ProLoser

@ProLoser Sadece sistemin basitleştirilmesi gerektiğini düşünüyorum ve 0.x sürümlerini kullanmamalıyız.
rofrol

1
Erken yaşam döngüsü gelişimi ve v0 etrafında kullanım durumu çok mantıklıdır. V0'ın nasıl düzgün davrandığını öğrenmek beni diğer erken yaşam döngüsü projelerini dört gözle bekletti. Bu, projenizi gerçekte olmadığında 1.x (aka: kararlı) olarak bildirmeye zorlanmadan çok sayıda geriye dönük uyumsuzluğa sahip hızla değişen bir API'niz olabileceği anlamına gelir.
ProLoser

Anlıyorum, ama sadece semver ve niteleyicilerle nasıl çalıştığını sevmiyorum
rofrol

2
Daha çok bir fikir gibi geliyor ve genel kabul görmüş bir yaklaşım olarak çerçevelenmemelidir. Ve ^ 0.1.x yamaları mükemmel bir şekilde alır.
ProLoser

93

~büyük ve küçük sayıları düzeltir. Bağımlılığınızdaki hata düzeltmelerini kabul etmeye hazır olduğunuzda, ancak potansiyel olarak uyumsuz değişiklikler istemediğinizde kullanılır.

^yalnızca büyük sayıyı düzeltir. Bağımlılıklarınızı yakından izlerken ve küçük sürüm uyumsuzsa kodunuzu hızlı bir şekilde değiştirmeye hazır olduğunuzda kullanılır.

Buna ek olarak, ^bir desteklenmeyen eski npm sürümleri tarafından ve dikkatli kullanılmalıdır.

Yani, ^iyi bir varsayılan, ama mükemmel değil. Sizin için en yararlı olan semver operatörünü dikkatlice seçmenizi ve yapılandırmanızı öneririm.


13
doğru değil: Caret Aralıkları ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. [Büyük, küçük, yama] demetinde en soldaki sıfır olmayan rakamı değiştirmeyen değişikliklere izin verir. Başka bir deyişle, 1.0.0 ve üstü sürümler için düzeltme eki ve küçük güncelleştirmelere, 0.X> = 0.1.0 sürümleri için düzeltme eki güncelleştirmelerine izin verir ve 0.0.X sürümleri için hiçbir güncelleştirme yapılmaz. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

6
Bu cevap tamamen yanlıştır (diğerleri gibi). Bunların hiçbiri büyük bir sayıyı düzeltmez! @Rofrol'un dediği gibi, ^ en soldaki sıfır olmayan rakamı değişmeden tutar. ~ Öte yandan, yalnızca küçük sürüm belirtilmişse (örneğin ~ 1.2.3 veya ~ 1.2) yama güncellemelerine izin verir ve küçük sürüm belirtilmemişse (ör. ~ 1) küçük güncellemelere izin verir.
TheBaj

2
@TheBaj "Düzeltmek" yerine "düzeltmek" anlamına gelir, "ayarlamak" yerine "tanımlamak" ("sabitlemek"), böylece hepiniz büyük sayının nasıl ele alınacağını kabul edersiniz.
maaartinus

1
Evet, yanıtlayıcının "olduğu gibi" sabit, sabit ya da değişmez hale getirme "anlamına geldiğini anlayana kadar bu cevap tamamen geriye doğru görünüyordu.
NattyC

57

~: Makul yakın için

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: Uyumlu ile

   ^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

17
@kytwb - hayır. Sıfırıncı sürüm sürümlerinin özel durumunda, karat tilde eşdeğerdir. Bu nedenle, ^0.1.3yalnızca sürümleri kabul eder 0.1.xve 0.2.0küçük bir artış olmasına rağmen kabul etmez . Bu davranış eşdeğerdir ~0.1.3. Bu davranışın ardındaki mantık, sıfırıncı sürüm paketlerinin hala kararsız olarak kabul edilmesinden kaynaklanmaktadır; deyimiyle semver.org 4., (geriye doğru uyumlu değişiklikler dahil) "şey her an değişebilir".
chharvey

31

^[any]. [any] (en son küçük sürüm)
~1.2'dir. [any] (en son yama)

Bir büyük bir okuma blog postasına semver NPM nasıl uygulanacağı hakkında
ve ne yaptığını o maç yapmak için semver standardını
http://blog.npmjs.org/post/98131109725/npm-2-0-0


2
doğru değil: Caret Aralıkları ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. [Büyük, küçük, yama] demetinde en soldaki sıfır olmayan rakamı değiştirmeyen değişikliklere izin verir. Başka bir deyişle, 1.0.0 ve üstü sürümler için düzeltme eki ve küçük güncelleştirmelere, 0.X> = 0.1.0 sürümleri için düzeltme eki güncelleştirmelerine izin verir ve 0.0.X sürümleri için hiçbir güncelleştirme yapılmaz. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

28

Güncellenmesinin olmaz çünkü Şapka eşleştirme kabul "kırık" olabilir ^0.1.2için 0.2.0. Yazılım ortaya çıktığında 0.x.ysürümleri kullanın ve şapka eşleştirmesi yalnızca son değişen basamakla ( y) eşleşir . Bu bilerek yapılır. Bunun nedeni, yazılımın API değişikliklerini hızla geliştirmesidir: bir gün bu yöntemlere sahipsiniz ve diğer gün bu yöntemlere sahipsiniz ve eskileri gitti. Kütüphanenizi zaten kullanan kişilerin kodunu kırmak istemiyorsanız, ana sürümü artırın: eg 1.0.0-> 2.0.0-> 3.0.0. Yani, yazılım nihayet% 100 tamamlandığında ve tam özellikli olduğunda, sürüm gibi olacak 11.0.0ve çok anlamlı görünmüyor ve aslında kafa karıştırıcı görünüyor. Öte yandan, 0.1.x->0.2.x-> 0.3.xsürümleri sonra yazılım nihayet% 100 bittiğinde ve tam özellikli sürüm olarak yayınlanır 1.0.0ve "Bu sürüm uzun vadeli bir hizmettir, kütüphane bu sürümünü üretiminizde devam ve kullanabilirsiniz ve yazar yarın veya gelecek ay her şeyi değiştirmeyecek ve paketi terk etmeyecek ".

Kural şudur: Kullanım 0.x.yyazılım henüz olgunlaşmamış olması, zaman sürüm ve genel API değişiklikleri orta rakamı artırma ile bırakın (bu nedenle insanlar sahip ^0.1.0almazsınız 0.2.0güncelleştirme ve kodlarını kırmak olmaz). Ardından, yazılım olgunlaşır, altında bırakın 1.0.0ve en soldaki rakamıyla genel API değişiklikler her zaman artırmak (dolayısıyla insanlar sahip ^1.0.0almazsınız 2.0.0güncelleştirme ve kodlarını kırmak olmaz).

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.

Bu yorum gülünç derecede yardımcı oldu ve çok iyi belgelenmiş gibi görünmüyor. Bu davranışla ilgili belgelere bir bağınız var mı? V0 projeleri hakkındaki bu cevap bana çok yardımcı oldu.
ProLoser

Bir bağlantım yok: Bu bilgiyi çok googling yaparak ve npm semantik sürüm hesap makinesi ile oynayarak buldum semver.npmjs.com
catamphetamine

2
Belgelerine daha resmi bir şekilde eklenmesi gerekiyor. Mühendislik ekibime Sony'de bir konuşma yaptım çünkü bu kadar kolay göz ardı ediliyor. slides.com/proloser/semver-v0
ProLoser

24

~ Tilde:

  • ~büyük ve küçük sayıları dondurur .
  • Bağımlılığınızdaki hata düzeltmelerini kabul etmeye hazır olduğunuzda, ancak potansiyel olarak uyumsuz değişiklikler istemediğinizde kullanılır.
  • Yaklaşık işareti, en son küçük sürümle (orta sayı) eşleşir .
  • ~ 1.2.3 tüm 1.2.x sürümleriyle eşleşir, ancak 1.3.0'ı özleyecektir.
  • Tilde (~) size hata düzeltme sürümleri verir

^ Düzeltme:

  • ^ yalnızca büyük sayıyı dondurur.
  • Bağımlılıklarınızı yakından izlerken ve küçük sürüm uyumsuzsa kodunuzu hızlı bir şekilde değiştirmeye hazır olduğunuzda kullanılır.
  • Sizi en son ana sürüme güncelleyecek (ilk sayı) güncelleyecektir.
  • ^ 1.2.3, 1.3.0 dahil olmak üzere herhangi bir 1.xx sürümüyle eşleşecek, ancak 2.0.0'da duracaktır.
  • Düzeltme işareti (^) size geriye dönük uyumlu yeni işlevler sunar.

1
Yaklaşık işareti, en son yama sürümüyle (son sayı) eşleşir. Düzeltme işareti en son küçük sürümle (orta sayı) eşleşir.
Abdul Rauf

"donar" en iyi açıklamadır.
mhrabiee

Caret hem ana numarayı donduruyor hem de sizi en son ana sürüme (ilk numara) güncelleyecek mi? Büyük sayı ilk sayıdır, bu yüzden mantıklı değildir.
NattyC

19

Tilde ~ , küçük sürümle eşleşir, 1.4.2 içeren bir paket yüklediyseniz ve kurulumunuzdan sonra, paketinizde 1.4.3 ve 1.4.4 sürümleri de mevcuttur. Json ~ 1.4.2 olarak kullanılırsa npm yükleyin yükseltmeden sonra projenizde projenize 1.4.4 yüklenecektir. Ancak bu paket için 1.5.0 kullanılabilir, daha sonra ~ tarafından yüklenmez. Buna küçük sürüm denir.

Caret ^ ana sürümle eşleşir, eğer projenize 1.4.2 paketi yüklüyse ve kurulum 1.5.0 yayınlandıktan sonra ^ ana sürümü yükleyecektir. ^ 1.4.2'niz varsa 2.1.0'ın kurulmasına izin vermez .

Versiyon Sabit sonra herhangi bir özel karakter ör dışarı ile sabit versiyonunu kullanılan her yüklemesinde paketin değişiklik sürümüne istemiyorsanız "1.4.2"

Son Sürüm * Son sürümü yüklemek istiyorsanız, paket adının önünde yalnızca * kullanın.


3
Bu cevap yanıltıcı. SemVer açıkça ifade eder, Normal bir sürüm numarası XYZ [burada] X ana biçimidir, Y küçük sürümdür ve Z yama sürümüdür.
Leo

15

Bir astar açıklaması

Standart sürüm sistemi major.minor.build (ör. 2.4.1)

npm, bu karakterlere göre belirli bir paketin sürümünü denetler ve düzeltir

~ : büyük sürüm sabit, küçük sürüm sabit, herhangi bir yapı numarasıyla eşleşir

örneğin: ~ 2.4.1, x'in herhangi bir şey olduğu 2.4.x'i kontrol edeceği anlamına gelir

^ : büyük sürüm sabittir, herhangi bir küçük sürümle eşleşir, herhangi bir yapı numarasıyla eşleşir

örneğin: ^ 2.4.1, x'in herhangi bir şey olduğu 2.xx'i kontrol edeceği anlamına gelir


5
Bu cevapta 7 satır görüyorum
FluxLemur

11

Muhtemelen pakette tilde (~) ve düzeltme işareti (^) görmüşsünüzdür. Onların arasındaki fark ne?

Npm install moment --save yaptığınızda, caret (^) önekiyle package.json içindeki girişi kaydeder.

Yaklaşık işareti (~)

En basit ifadeyle, yaklaşık işareti (~) en son küçük sürümle (orta sayı) eşleşir. ~ 1.2.3, tüm 1.2.x sürümleriyle eşleşecek ancak 1.3.0'ı özleyecektir.

Düzeltme işareti (^)

Öte yandan, şapka (^) daha rahattır. Sizi en son ana sürüme (ilk sayı) güncelleyecektir. ^ 1.2.3, 1.3.0 dahil olmak üzere herhangi bir 1.xx sürümüyle eşleşecek, ancak 2.0.0'da geçerli olmayacaktır.

Referans: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b


Yine, bu cevap yanıltıcıdır. SemVer açıkça ifade eder, Normal bir sürüm numarası XYZ [burada] X ana biçimidir, Y küçük sürümdür ve Z yama sürümüdür.
Leo

5

semver, noktalarla ayrılmış 3 ana bölüme ayrılmıştır.

major.minor.patch
1.0.0

Bu farklı majör, minör ve yama farklı sürümleri tanımlamak için kullanılmaktadır. gelgit (~) ve düzeltme (^), paket sürümlemede hangi küçük ve yama sürümünün kullanılacağını belirlemek için kullanılır.

~1.0.1
 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1

4

Tilde (~)

büyük sürüm sabittir, küçük sürüm sabittir, herhangi bir yapı numarasıyla eşleşir

"express": "~4.13.3" 

~4.13.3 x'in bir şey olduğu 4.13.x'i kontrol edeceği ve 4.14.0

Düzeltme işareti (^)

büyük sürüm sabittir, herhangi bir küçük sürümle eşleşir, herhangi bir yapı numarasıyla eşleşir

"supertest": "^3.0.0"

^3.0.0 x'in herhangi bir şey olduğu 3.xx'i kontrol edeceği anlamına gelir


Bu cevabın 4 yıl önce yayınlanan aynı cevaptan nasıl farklı olduğunu açıklayabilir misiniz ?
Franklin Yu

2

Sürüm numarası, her bölümü farklı bir anlamla tanımlayan sözdizimindedir. sözdizimi bir nokta ile ayrılmış üç bölüme ayrılır.

major.minor.patch 1.0.2

Majör, minör ve yama bir paketin farklı sürümlerini temsil eder.

npm, sırasıyla hangi düzeltme ekinin ve küçük sürümlerin kullanılacağını belirtmek için yaklaşık işareti (~) ve düzeltme işareti (^) kullanır.

Bu yüzden ~ 1.0.2'yi görürseniz, 1.0.2 sürümünü veya 1.0.4 gibi en son yama sürümünü yüklemek anlamına gelir. ^ 1.0.2'yi görürseniz, 1.0.2 sürümünü veya 1.1.0 gibi en son küçük veya yama sürümünü yüklemek anlamına gelir.


1
Bu cevabın 4 yıl önce yayınlanan aynı cevaptan nasıl farklı olduğunu açıklayabilir misiniz ?
Franklin Yu

2

karat ^ , aynı ana aralıktaki belirli bir sürümden daha büyük her şeyi içerir.

tilde ~ , aynı küçük aralıktaki belirli bir sürümden daha büyük her şeyi içerir.

Örneğin, 1.0.4'e kadar kabul edilebilir sürüm aralıkları belirtmek için aşağıdaki sözdizimini kullanın:

  • Yama sürümleri: 1.0 veya 1.0.x veya ~ 1.0.4
  • Küçük sürümler: 1 veya 1.x veya ^ 1.0.4
  • Başlıca sürümler: * veya x

Anlamsal sürüm oluşturma sözdizimi hakkında daha fazla bilgi için, bkz: npm semver hesap makinesi .

npm yayınlanan paketlerdeki anlamsal sürümler§

Npm belgeleri hakkında daha fazla bilgi Semantik sürüm oluşturma hakkında


1

Kendi başına bir cevap değil, gözden kaçan görünen bir gözlem.

Karat aralıkları için açıklama:

bkz. https://github.com/npm/node-semver#caret-ranges-123-025-004

[Büyük, küçük, yama] demetinde en soldaki sıfır olmayan rakamı değiştirmeyen değişikliklere izin verir.

Anlamına gelir ^10.2.3 maçlar10.2.3 <= v < 20.0.0

Onların ne demek istediğini sanmıyorum. 11.xx ile 19.xx arasındaki sürümlerde çekme, kodunuzu kıracaktır.

Sanırım demek istediler left most non-zero number field. SemVer'de sayı alanlarının tek basamaklı olmasını gerektiren hiçbir şey yoktur.


0

~ küçük sürüm sürümlerine yönelik özellikler ^ ana sürüm sürümlerine yönelik özellikler

Örneğin, paket sürümü 4.5.2 ise, Güncelleme ~ 4.5.2'de en son 4.5.x sürümü (MINOR VERSION) yüklenecektir ^ 4.5.2 en son 4.xx sürümünü yükleyecektir (MAJOR VERSION)


8
Bu cevabın 4 yıl önce yayınlanan aynı cevaptan nasıl farklı olduğunu açıklayabilir misiniz ?
Franklin Yu

0

Bu soru ile ilgili olarak , sürümlerdeki Composer dokümanlarını inceleyebilirsiniz , ancak kısaca burada:

  • Tilde Sürüm Aralığı ( ~ ) - ~ 1.2.3,> = 1.2.3 < 1.3.0
  • Düzeltme Sürümü Aralığı ( ^ ) - ~ 1.2.3,> = 1.2.3 < 2.0.0'a eşittir

Yani, Tilde ile yamaların otomatik güncellemelerini alacaksınız, ancak küçük ve büyük sürümler güncellenmeyecek. Ancak, Caret'i kullanırsanız yamalar ve küçük sürümler alırsınız, ancak büyük (değişiklikleri bozan) sürümler almazsınız.

Tilde Sürümü "daha güvenli" bir yaklaşım olarak kabul edilir, ancak güvenilir bağımlılıklar (bakımlı kütüphaneler) kullanıyorsanız, Caret Sürümü ile ilgili herhangi bir sorun yaşamamanız gerekir (çünkü küçük değişiklikler değişiklikleri bozmamalıdır).

Muhtemelen gözden geçirmelisin bu yığın akışı gönderisini, besteci yüklemesi ve besteci güncellemesi arasındaki farklar hakkında .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.