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


En son kararlılığa geçtikten sonra node ve npm, Denedim npm install moment --save. Girdiyi kaydeder package.json ile caret(^) önek. Daha önce, bir tilde(~) önek.

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

2249
2018-03-12 06:02


Menşei


FYI önekleri önleyebilir veya yaparak özel bir kullanabilirsiniz: npm config set save-prefix=''. (Çubuk ~ Tercih ettiğin buysa, alıntılarda.) Şahsen bunu yapabilirim ve üretimdeki şeyler için büzülüyorum. - fncomp
Tilde ve caret'in nasıl çalıştığına ve farklılıklarına dair tüm detaylar: github.com/npm/node-semver#tilde-ranges-123-12-1 - Jeffrey Martinez
Bu araç test etmek için harika bir yardımcıdır semver.npmjs.com - chaiyachaiya
@fncomp, yorumunuzu doğru aldığımı açıklığa kavuşturmak istedim .. projenizde sadece bağımlılıkların belirli sürümlerini kullanıyor musunuz? Ekibimiz bağımlılıkları yükseltmekte tereddütlüdür .. belirli sürümleri veya bağımlılıklar için '~' önekini kullanmanızı önerir misiniz? - blogs4t
@fncomp "Ben şahsen bunu yapmak ve üretimdeki şeyler için shrinkwrap" diyerek ne demek istediğinizi detaylandırabilirsiniz. Teşekkürler! - blogs4t


Cevaplar:


En basit terimlerle, tilde en yeni küçük sürümle eşleşir   (orta sayı). ~ 1.2.3 tüm 1.2.x sürümleriyle eşleşecek ama olacak   1.3.0.

Diğer yandan, caret daha rahattır. Sizi güncelleyecek   En son ana sürüm (ilk sayı). ^ 1.2.3 eşleşecek   1.3.0 dahil olmak üzere herhangi bir 1.x.x sürümü ancak 2.0.0'da bekleyecektir.

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


2640
2018-03-12 08:28



Umarım bu düşünceyi düşünmeyen insanları yakalayabilmek için buraya gönderiyorum, ancak hem bağımlılıklarınızdan hem küçük hem de önemli olan yayınlara güvenebilirsiniz. Bir kütüphane yayınlıyor ve başkalarının size güvenmesini istiyorsanız, AŞAĞIDAKİ BAĞIMSIZLIKLARA KABUL ETMEYİN. Bağımlılığınızdan kaynaklanan kötü bir nokta serbest bırakma, zincirleme tepkimeye neden olabilir ve insanlar armut şeklini aldığında kapılarını çaldırırlar. Bu, üretim kodunuzda npm shrinkwrap kullanmanın başka bir büyük nedenidir. - tehfoo
Bu yanıltıcıdır ^. Diyor ki ^  sizi en son güncelleyecek majör versiyon, gerçekte sizi en yakın zamanda günceller küçük sürümü. i.e: - ^ 1.2.3: => = 1.2.3 <2.0.0 - ^ 0.2.3: => = 0.2.3 <0.3.0 - ^ 0.0.3: => = 0.0.3 <0.0.4 - prasanthv
Kullandığınızda semendeki jgillich 0.2.x, 2 değil major version. Bu yüzden docs.npmjs.com belirli kelimeleri kullandı: the left-most non-zero digit. Ayrıca bu durumda ne: ^ 0.0.4, 0.0.4 anlamına gelir - rofrol
@FagnerBrack: Sağladığınız belirli örnek doğrudur, ancak genellikle düşünme şekliniz yanlıştır. Bir örnek: diyelim ki paketin var A 3 versiyonda: 0.0.1, 0.0.2 ve 0.0.3. İçinde bir hata var 0.0.1 en azından sahip olmak istiyorsun 0.0.2 senin paketinde B. Yazarsan 0.0.x alacaksınız 0.0.3, bu da sorun değil. Ama başka bir paket varsa C ikisini de gerektirir B ve A ve ek olarak kısıtlama var "A": "<0.0.2" alacaksınız 0.0.1 herhangi bir çatışma sorunu göstermeden, ne istediğinizi değil. Tilde kullanma ~0.0.2 Bu sorunu önlemek için yardımcı olmalıdır. - Maciej Sz
Bu yanlış cevap garip It will update you to the most recent major version 2k + upvotes var. Dışarıda kaç kişi olduğunu düşünüyorum. ^ büyük sürümü günceller !! Semserv versiyonlamada büyük / küçük / yama ortalamalarının etrafında herhangi bir belirsizlik yoktur - sadece yanlış - Drenai


Bu soruya atıfta bulunulanlar da dahil olmak üzere, sürüm özgüllüğü 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ümüne yaklaşık olarak eşdeğer" npm semver - Tilde aralıkları & semver (7)
  • ^version "Versiyon ile uyumlu" See npm semver - Caret Aralıkları & semver (7)
  • version Tam sürümle 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, 1.3.0 değil
  • http://sometarballurl (bu, yerel olarak indirilip kurulacak olan bir tarponun 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 belirleyicileri, GitHub URL'leri ve GitHub kullanıcı yanıtlarını, belirli npm etiketlerine sahip yerel yolları ve paketleri içerir.


571
2017-09-16 06:25



Tam bir sürüm yelpazesi belirtmek de mümkündür, 1.2.0 || >=1.2.2 <1.3.0: Tam 1.2.0 ya da 1.2.2'den 1.3.0'a kadar (herşey dahil) 1.2.1 ya da 1.3.1 ve üstü ve 1.1.x ve altında olmayanlar. - CoDEmanX
Kullanıyorsanız @CoDEmanX neden 1.3.0 dahil <? - Janus Troelsen
Benim kötü, okumak gerekiyordu <=1.3.0. - CoDEmanX
1.x.x mümkün mü? - Venryx
@Venryx evet öyle. Bu, tüm sürümleri> = 1.0.0 ve <2.0.0 olacak - Ahmad


Npm, bir paketin belirtilen sürümden daha yeni bir sürümünü yüklemeye izin verir. Tilde kullanarak (~) size hata düzeltme sürümleri ve caret verir (^) Size de geriye dönük uyumlu yeni işlevsellik verir.

Sorun, eski sürümlerin genellikle bu kadar çok hata düzeltmesi almamasıdır.^) için varsayılan olarak --save.

semver table

Göre: "Semver açıkladı - paketimde neden bir karınca (^) var?".

Not Kuralların, 1.0.0'ın üzerindeki sürümleri için geçerli olduğunu ve her projenin anlamsal sürümlemeyi takip etmediğini. 0.x.x sürümleri için, düzeltme yalnızca izin verir yama güncellemeler, yani tilde ile aynı şekilde davranır. Görmek "Caret Ranges"

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

semver diagram

Kaynak: "Semantik Sürüm Oluşturma Hilesi".


349
2017-07-30 20:40



Peki ya 0.2.5? itibaren 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.4. [Büyük, küçük, yama] tuple'da sıfır olmayan en soldaki basamağı değiştirmeyen değişikliklere izin verir. Başka bir deyişle, bu sürüm 1.0.0 ve üstü için yama ve küçük güncellemelere, 0.X> = 0.1.0 sürümleri için yama güncellemelerine ve 0.0.X sürümleri için güncelleme yapılmasına izin verir. - rofrol
@rofrol, 1.0.0'dan önceki herhangi bir sürüm kararsız kabul edilir ve bu kurallar geçerli değildir - pspi
Yani açıklamanız tamamlanmadı - rofrol
@rofrol evet, okunabilirlik için ihmal bazen iyi, paket json bir bağımlılık için 1.0.0 altında bir şey olması şansı oldukça düşüktür. ayrıca 20/80 ilkesine de bakın, önemli olana odaklanmak için büyük bir kuraldır. - pspi
Cevabımı gör. Ne düşünüyorsun? stackoverflow.com/questions/22343224/... - rofrol


~ büyük ve küçük sayıları giderir. 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.

^ sadece ana sayıyı düzeltir. Bağımlılıklarınızı yakından izlediğinizde ve küçük sürümün uyumsuz olması durumunda kodunuzu hızlı bir şekilde değiştirmeye hazır olduğunuzda kullanılır.

Buna ek olarak, ^ olduğu desteklenmiyor eski npm sürümleri ile ve dikkatle kullanılmalıdır.

Yani, ^ iyi bir varsayılan, ama mükemmel değil. Size en uygun olan semver operatörünü dikkatli bir şekilde seçmenizi ve yapılandırmanızı öneririm.


74
2018-03-12 23:05



doğru değil: Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. [Büyük, küçük, yama] tuple'da sıfır olmayan en soldaki basamağı değiştirmeyen değişikliklere izin verir. Başka bir deyişle, bu sürüm 1.0.0 ve üstü için yama ve küçük güncellemelere, 0.X> = 0.1.0 sürümleri için yama güncellemelerine ve 0.0.X sürümleri için güncelleme yapılmasına izin verir. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 - rofrol
Bu cevap tamamen yanlıştır (burada çok olduğu gibi). Bunların hiçbiri büyük bir sayıyı düzeltmedi! @Rofrol dediği gibi, ^ sadece sıfır olmayan en soldaki rakamı değiştirmez. Diğer yandan, sadece küçük versiyon belirtilmişse (ör. ~ 1.2.3 veya ~ 1.2) yama güncellemelerine izin verir ve küçük versiyon belirtilmemişse küçük güncellemelere izin verir (örneğin, ~ 1). - TheBaj
@TheBaj "ayarlamak" yerine "tanımla" ("sabitle") olarak "düzelt", yani büyük sayının nasıl ele alınacağına katılıyorsunuz demektir. - maaartinus


Semver

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • kullanım npm semver hesaplayıcı test için. (^ (Aynı büyük aralıkta belirli bir versiyondan daha büyük olan her şeyi dahil et) ve ~ (aynı küçük aralıktaki belirli bir versiyondan daha büyük olan her şeyi dahil et) açıklamaları% 100 doğru olmasa da, hesap makinesi iyi çalışıyor gibi görünüyor )
  • Alternatif olarak, SemVer Check Bunun yerine, bir paket seçmenizi gerektirmez ve aynı zamanda açıklamalar da sunar.

Değişikliklere izin verme veya reddetme

  • Pin sürümü: 1.2.3.
  • kullanım ^ (kafa gibi). Soldan ikinci olmayan sıfır düzeyindeki güncellemelere izin verir: ^0.2.3 anlamına geliyor 0.2.3 <= v < 0.3.
  • kullanım ~ (kuyruk gibi). Genel olarak en sağdaki seviyeyi dondurun veya ihmal edilmişse sıfır olarak ayarlayın:
    • ~1 anlamına geliyor 1.0.0 <= v < 2.0.0
    • ~1.2 anlamına geliyor 1.2.0 <= v < 1.3.0.
    • ~1.2.4 anlamına geliyor 1.2.4 <= v < 1.3.0.
  • En sağdan en katı seviye: 0.2 anlamına geliyor 0.2 <= v < 1. Gelenler ~ Çünkü:
    • İhmal edilen seviye sürümü her zaman 0
    • Alt seviyeler belirlemeden başlangıç ​​büyük versiyonunu ayarlayabilirsiniz.

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

Ana seviye başlangıç ​​seviyesini ayarlayın ve güncellemelere izin verin

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

Ana seviye 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

Minör 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üncellemeleri reddet

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

ihbar: Büyük, küçük, yama veya belirtme eksik beta numarasız, aynı any eksik seviye için.

ihbar: Bir paket yüklediğinizde, 0 büyük seviye olarak, güncelleme sadece yeni beta / pr seviye sürümünü kuracaktır! O yüzden npm kümeler ^ varsayılan olarak package.json ve yüklü sürümü gibi olduğunda 0.1.3tüm büyük / küçük / yama seviyelerini dondurur.


66
2017-10-11 16:52



İnsanları 0'dan başlayarak projeye başlamadan kaçınmak için söylüyorum, çünkü kütüphane ve tüketen geliştiriciler sistemi anlamıyorlar korkunç bir çözüm. Sanırım @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
Erken yaşam döngüsü gelişimi ve v0 civarında kullanım durumu çok anlamlı. V0'ın nasıl düzgün davrandığını öğrenmek aslında beni diğer erken yaşam döngüsü projelerini dört gözle bekletti. Bu, projenizin gerçekten olmadığında 1.x (aka: durağan) olarak ilan edilmeye zorlanmadan geriye dönük uyumsuzluklarla hızla değişen bir API'ye sahip olabileceğiniz anlamına gelir. - ProLoser
Anlıyorum ama semer ve niteleyicilerle nasıl çalıştığını sevmiyorum - rofrol
Daha çok bir fikir gibi hissettirir ve genel kabul görmüş bir yaklaşım olarak çerçevelenmemelidir. Ve ^ 0.1.x, yamaları mükemmel bir şekilde alır. - ProLoser


~ : Makul kapat 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

42
2018-06-27 16:12



^0.1.3: 0.1.3 <= accepted < 1.0.0 yerine, hayır? - kytwb
@kytwb - no. Sıfırıncı sürüm numaralarının özel durumunda, karat tilde ile eşdeğerdir. Böylece ^0.1.3 sadece sürümleri kabul eder 0.1.x ve kabul etmeyecek 0.2.0Bu küçük bir artış olsa da. Bu davranış eşdeğerdir ~0.1.3. Bu davranışın arkasındaki mantık, sıfır salım paketlerinin hala kararsız olduğu gerçeğinden kaynaklanmaktadır. sözleriyle semver.org, # 4, "herhangi bir zamanda herhangi bir şey değişebilir" (geriye doğru uyumsuz değişiklikler dahil). - chharvey


Güncellenmeyeceği için şapka eşleşmesi "kırık" sayılabilir ^0.1.2 için 0.2.0. Yazılım ortaya çıktığında 0.x.y sürümler ve şapka eşleşmesi sadece son değişen rakamla eşleşecektir (y). Bu amaç için yapılır. Bunun nedeni, yazılımın API geliştirilirken hızla değişmesidir: bir gün bu yöntemlere sahipsiniz ve diğer gün bu metotlara sahipsiniz ve eskiler tükendi. Zaten kütüphanenizi kullanan kişiler için kodu kırmak istemiyorsanız, büyük bir sürümü seçip artırın: ör. 1.0.0 -> 2.0.0 -> 3.0.0. Yani, yazılımınız nihayet% 100 tamamlandığında ve tam özellikli olduğu zaman sürüm gibi olacak 11.0.0 ve bu ç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.x sürümleri sonra yazılım sonunda% 100 tamamlandı ve tam özellikli olarak sürüm olarak piyasaya sürüldü 1.0.0 ve bu demektir ki "Bu sürüm uzun süreli bir hizmettir, kitaplığın bu sürümünü üretim kodunuzda devam ettirebilir ve kullanabilirsiniz. Yazar, yarın veya sonraki aydaki her şeyi değiştirmeyecek ve bundan vazgeçmeyecektir. paket".

Kural: kullanımı 0.x.y yazılımınız henüz olgunlaşmamışsa ve public API'niz değiştiğinde orta rakamı artırarak sürümü yayınlar. ^0.1.0 alamayacaksın 0.2.0 güncelleyin ve kodlarını bozmaz. Sonra, yazılım olgunlaştığında, onu serbest bırakın 1.0.0 ve herkese açık API değeriniz her değiştiğinde en soldaki rakamı artırın. ^1.0.0 alamayacaksın 2.0.0 güncelleyin ve kodlarını bozmaz.

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



Bu yorum gülünç oldu ve çok iyi belgelenmiş gibi görünmüyordu. Bu davranışa ilişkin belgelerin bağlantısı var mı? V0 projeleri hakkındaki bu cevap bana çok yardımcı oldu. - ProLoser
Bir bağlantım yok: Bu bilgiyi google'da gezinip npm semantik versiyon hesap makinesiyle oynayarak buldum. semver.npmjs.com - asdfasdfads
Belgelerine daha resmi bir şekilde eklenmeleri gerekiyor. Sony'de mühendislik ekibime bir konuşma yaptım çünkü çok kolay göz ardı ediliyor gibi görünüyor. slides.com/proloser/semver-v0 - ProLoser


^ 1. [any]. [any] (en son küçük versiyon)
~ 1.2. [any] (son yama)

Harika bir okuma bu blog yazısı semer npm için nasıl geçerli
ve eşleşmesi için ne yapıyorlar? yarı standart
http://blog.npmjs.org/post/98131109725/npm-2-0-0


20
2017-12-15 18:07



doğru değil: Caret Ranges ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. [Büyük, küçük, yama] tuple'da sıfır olmayan en soldaki basamağı değiştirmeyen değişikliklere izin verir. Başka bir deyişle, bu sürüm 1.0.0 ve üstü için yama ve küçük güncellemelere, 0.X> = 0.1.0 sürümleri için yama güncellemelerine ve 0.0.X sürümleri için güncelleme yapılmasına izin verir. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 - rofrol


Bir astar açıklama

Standart versiyonlama sistemi major.minor.build'dir (ör. 2.4.1).

npm, bu karakterlere dayanarak belirli bir paketin sürümünü denetler ve giderir

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

Örneğin. : ~ 2.4.1, x'in bir şey olduğu yerde 2.4.x için 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 bir şey olduğu 2.x.x için kontrol edeceği anlamına gelir


8
2018-01-21 08:00



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