Bower (ve npm) sürüm sözdizimi nedir?


274

Bower, aşağıdaki sözdizimini kullanarak paketler için sürüm gereksinimlerini belirlememe olanak tanır:

"dependencies": {
  "<name>": "<version>",
},

Ancak, sözdiziminin ne için olduğunu bulamadım <version>. Ben sürümleri belirtebilirsiniz biliyorum:

  • ile belirli bir sürümden daha büyük ">1.0.0"
  • bir sürümden büyük veya ona eşit: ">=1.0.0"
  • ya da bazı aralıkta: "1.0.0 - 2.0.0".

Ben de tilde içeren ortak bir versiyon sözdizimi olduğunu biliyoruz: "~1.0.0". Ama bunun ne anlama geldiğinden ve aynı olup olmadığından emin değilim "=1.0.0".

Ayrıca, tam olarak 1.0.3artı daha büyük sürümler 1.5.0, vb.


Yanıtlar:


341

Özetle, Bower sürüm numaraları (ve NPM'ler) sözdizimi SemVer olarak adlandırılır ve 'Semantik Sürüm Oluşturma' için kısadır. Semver'in detaylı sözdizimi ile ilgili belgeleri, Düğüm / npm içinde semver ayrıştırıcısının API'sındaki Bower ve NPM'de kullanıldığı gibi bulabilirsiniz . Sen (yok olan altta yatan spec hakkında daha fazla bilgi edinebilirsiniz değil söz ~veya diğer sözdizimi ayrıntıları) semver.org .

Bir var süper kullanışlı görsel semver hesap grok ve test etmek çok daha kolay tüm bu yapım ile oynayabilirsiniz.

SemVer sadece bir sözdizimi değildir! Sözdiziminin ne anlama geldiğini anlamaya yardımcı olacak API'ları yayınlamanın doğru yolları hakkında söylenecek bazı ilginç şeyler var. En önemlisi:

Herkese açık API'nızı belirledikten sonra, sürüm numaranızdaki belirli artışlarla değişiklikler üzerinde iletişim kurarsınız. XYZ (Major.Minor.Patch) sürüm biçimini düşünün . API sürümünü etkilemeyen hata düzeltmeleri, yama sürümünü geriye doğru uyumlu API eklemeleri / değişiklikleri küçük sürümü artırır ve geriye doğru uyumsuz API değişiklikleri ana sürümü artırır.

Yani, hakkındaki özel sorunuz ~bu Major.Minor.Patch şeması ile ilgilidir. (İlgili düzeltme operatörü gibi ^.) Kabul ~etmek istediğiniz sürüm aralığını aşağıdakilerden birini daraltmak için kullanabilirsiniz :

  • aynı küçük sürümde daha sonra yama düzeyinde değişiklikler ( "API'yı etkilemeyen hata düzeltmeleri" ) veya:
  • aynı ana sürümde daha sonra küçük çaplı değişiklikler ( "geriye dönük uyumlu API eklemeleri / değişiklikleri" )

Örneğin: 1.2.x ağacında, 1.2.0'dan başlayarak ancak 1.3.0'dan daha düşük bir sonraki yama düzeyinde değişiklik yapacağınızı belirtmek için şunları kullanabilirsiniz:

"angular": "~1.2"
  or:
"angular": "~1.2.0"

Bu size .xsözdizimini kullanmakla aynı sonuçları verir :

"angular": "1.2.x"

Ancak, tilde / ~sözdizimini daha da belirgin olmak için kullanabilirsiniz: 1.2.4 ile başlayan ancak yine de 1.3.0'dan daha düşük yama düzeyinde değişiklikleri kabul etmek istiyorsanız, şunu kullanırsınız:

"angular": "~1.2.4"

Sola, ana sürüme doğru hareket ederseniz ...

"angular": "~1"

... aynı ...

"angular": "1.x"
  or:
"angular": "^1.0.0"

... ve 1.0.0'ın üzerindeki ve 2.0'dan küçük olan küçük veya yama düzeyindeki değişikliklerle eşleşir:

Yukarıdaki son varyasyona dikkat edin: buna 'düzeltme aralığı' denir . Düzeltme işareti, berbat bir şey gibi görünüyor >, bu yüzden "1.0.0'dan büyük herhangi bir sürüm" anlamına geldiğini düşündüğünüz için mazur görüleceksiniz . (Kesinlikle bunu kaçırdım.) Hayır!

Caret aralıkları temel olarak yalnızca en soldaki önemli rakamı (genellikle ana sürümü) önemsediğinizi ve en soldaki basamağı etkilemeyen küçük veya yama düzeyinde değişikliklere izin vereceğinizi söylemek için kullanılır. Ancak, ana sürümü belirten yaklaşık işaret aralığının aksine, düzeltme aralığı aralıkları kesin bir küçük / yama başlangıç ​​noktası belirlemenizi sağlar. Öyleyse, ^1.0.0 === ~1gibi bir düzeltme aralığı aralığı ^1.2.3herhangi bir değişiklik yapacağınızı söylemenizi sağlar >=1.2.3 && <2.0.0. Bunu bir tilde aralıkla yapamazsınız.

Ona yakından baktığınızda her şey kafa karıştırıcı görünüyor. Ama bir saniye uzaklaştırın ve bu şekilde düşünün: şapka sadece en önemli basamaktan en çok endişe duyduğunuzu söylemenizi sağlar. Tilde, hangi rakamın en doğru olduğu konusunda en çok endişelendiğinizi söylemenizi sağlar. Gerisi detay.

İnsanların neden daha basit .xsözdiziminden çok daha fazla kullandıklarını açıklayan tilde ve caret'in etkileyici gücü : sadece daha fazlasını yapmanıza izin veriyorlar. Bu nedenle, tilde .xhizmetinin bile nerede kullanıldığını göreceksiniz . Kendi package.json dosyası içinde bağımlılıkları sürü içerir: Bir örnek olarak, UÖM'nin bkz ~2.4.0biçimi yerine, 2.4.xo biçimi olabilir kullanın. Buna bağlı olarak ~, sözdizimi, hangi başlangıç ​​düzeltme eki numarasının kabul edilebilir olduğuna bakılmaksızın 70+ sürüm bağımlılık listesinin sonuna kadar tutarlıdır.

Her neyse, SemVer için daha fazlası var, ama hepsini burada detaylandırmaya çalışmam. Bunu göz atın düğüm semver paketin Benioku'da . Ve kullandığınızdan emin olun semantik sürüm hesap makinesi size pratik ve SemVer nasıl çalıştığını kafanı çalışırlarken.


RE: Ardışık Olmayan Sürüm Numaraları: OP'nin son sorusu, ardışık olmayan sürüm numaralarını / aralıklarını belirtmektir (eğer oldukça düzenlediysem). Evet, ortak çift boru "ya da" operatörünü kullanarak yapabilirsiniz: ||. Şöyle ki:

"angular": "1.2 <= 1.2.9 || >2.0.0"

27
Dolayısıyla ~, özellikle yama (üçüncü) sayısı, belirtilen sayıdan daha büyük olabilir, örneğin ~1.2.3eşdeğerdir >=1.2.3 <1.3.0.
z0r

1
Yukarıdaki satır içi düzenlemeler başına küçük (ikinci) sayı için de kullanılabilir.
XML

İlginçtir, SemVer belgelerinin x gösterimine izin verdiği görülüyor (ki bu insanlar için çok daha sezgisel).
Frank Nocke

2
x-notasyonu ilk başta okumak için sezgisel, ancak çok daha az esnektir. Örneğin '1.1.x' === '>=1.1.0' === '~1.1.0',. 1.1.0 davası kolaydır. Ancak x gösterimi olabildiğince ayrıntılı olamaz '>=1.1.4'veya '~1.1.4'. Böylece, '1.1.x'bağımlılık listenizdeki '~2.7.3'bir yere ve başka bir yere sarılırsınız. Bu iyi ve işe yarıyor, ancak bir geliştiricinin tek bir listeyi okumak için birden fazla sözdizimini ayrıştırması gerekiyor. Ve, sürümü programlı olarak ayarlamak için paketler yazıyorsanız, tek bir sözdizimi istersiniz. Ve çoğu insan değişiklikleri bozmayı önlemek istiyor. Böylece tüm problemler çözüldü ~.
XML

1
Hah. Bence "grok" nerd aydınlatılmış kültürel (ve muhtemelen yaşa bağlı), @Clonkex'ten daha az coğrafi. Gelecekteki okuyucular için: Heinlein'in Garip Bir
XML

141

Dayanarak semver kullanabileceğiniz

  • ABC - Tire XYZ Aralıkları 1.2.3-2.3.4 gösterir > = 1.2.3 <= 2.3.4

  • X-Aralıkları 1.2.x 1.X 1.2.*

  • Tilde Aralıkları Yama düzeyinde değişikliklere veya küçük sürüm değişikliklerine izin verildiğini ~1.2.3 ~1.2 gösterir.

  • 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

    • ^1.2.x (> = 1.2.0 <2.0.0 anlamına gelir)
    • ^0.0.x (> = 0,0,0 <0,1,0 anlamına gelir)
    • ^0.0 (> = 0,0,0 <0,1,0 anlamına gelir)

21
Saçma, okunması kolay cevap için teşekkür ederim. Geri izlemek zorunda değildim ya da hiçbir şey, sadece, patlama, cevap var. Aferin;)
toddmo

76

Bower semver sözdizimini kullanır , ancak işte birkaç hızlı örnek:

Belirli bir sürümü yükleyebilirsiniz:

$ bower install jquery#1.11.1

'İle başlayan herhangi bir sürümü' belirtmek için ~ tuşunu kullanabilirsiniz:

$ bower install jquery#~1.11

Birden çok sürüm gereksinimini birlikte belirtebilirsiniz:

$ bower install "jquery#<2.0 >1.10"

1
Bunun pratik kullanımını merak ediyorum. Rulet kurulumu?
gravidThoughts

@ XMLilley'nin cevabına (ve semver belgelerine) bakıldığında 'start's with' yanlış görünüyor, çünkü 1.12, 1.13, büyük sürüm yükselmediği sürece de iyi olurdu ...
Frank Nocke

13

latestAnahtar kelimeyi, kullanılabilir en son sürümü yüklemek için de kullanabilirsiniz :

  "dependencies": {
    "fontawesome": "latest"
  }

1
semver bundan bahsetmez. Nerede geçerli olduğunu belirlediniz? :) Bu "*" := >=0.0.0yakın ilk ama özellikle son bulmaz gibi biraz belirsiz, " (Herhangi bir sürüm tatmin)" diyor yani ilk bulduğu olabilir?
GazB

Dürüst olmak gerekirse, sadece deneme yanılma oldu - denedim ve işe yaradı! % 100 geçerli olmadığı doğru olabilir, ancak çalışır.
shacker

7

Yama numarası yoksa, tilde olmayan sürüme ~eklenmeye eşdeğerdir .x. Bir yama numarası varsa, ~tüm yama numaralarına> = belirtilen numaraya izin verir.

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

Ben kabul Yanıta yorumun için yeterli puanı yok ama tilde bazı bilgileri belgelere semver bağlantılı ile çelişmektedir: "angular": "~1.2"edecek değil 1.3, 1.4, 1.4.9 maç. Ayrıca "angular": "~1"ve "angular": "~1.0"vardır değil eşdeğeri. Bu, npm semver hesap makinesi ile doğrulanabilir .

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.