Cú pháp phiên bản bower (và npm) là gì?


274

Bower cho phép tôi chỉ định các yêu cầu phiên bản cho các gói bằng cú pháp sau:

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

Nhưng tôi đã không thể tìm thấy cú pháp để sử dụng cho <version>. Tôi biết rằng tôi có thể chỉ định các phiên bản là:

  • lớn hơn một phiên bản nhất định với ">1.0.0"
  • lớn hơn hoặc bằng một phiên bản: ">=1.0.0"
  • hoặc trong một số phạm vi : "1.0.0 - 2.0.0".

Tôi cũng biết rằng có một cú pháp phiên bản phổ biến có chứa dấu ngã : "~1.0.0". Nhưng tôi không chắc nó có nghĩa gì và liệu nó có giống như vậy không "=1.0.0".

Tôi cũng muốn biết liệu tôi có thể chỉ định nhiều phiên bản không liên tiếp hay không, chẳng hạn như 1.0.3các phiên bản chính xác cộng lớn hơn 1.5.0, v.v ...


3
Đây có thể là bản sao của stackoverflow.com/a/19040351/537738
David

Câu trả lời:


341

Tóm lại, cú pháp cho số phiên bản Bower (và NPM) được gọi là SemVer, viết tắt của 'Phiên bản ngữ nghĩa'. Bạn có thể tìm tài liệu cho cú pháp chi tiết của SemVer như được sử dụng trong Bower và NPM trên API cho trình phân tích cú pháp ngữ nghĩa trong Node / npm . Bạn có thể tìm hiểu thêm về thông số kỹ thuật cơ bản ( không đề cập ~hoặc chi tiết cú pháp khác) tại semver.org .

Có một máy tính semver trực quan siêu tiện dụng mà bạn có thể chơi với, làm cho tất cả những điều này dễ dàng hơn để tìm kiếm và kiểm tra.

SemVer không chỉ là một cú pháp! Nó có một số điều khá thú vị để nói về các cách phù hợp để xuất bản API, điều này sẽ giúp hiểu được cú pháp có nghĩa là gì. Điều quan trọng:

Khi bạn xác định API công khai của mình, bạn giao tiếp các thay đổi với API với số gia cụ thể cho số phiên bản của bạn. Xem xét một định dạng phiên bản của XYZ (Major.Minor.Patch) . Sửa lỗi không ảnh hưởng đến việc tăng API phiên bản vá lỗi, bổ sung / thay đổi API tương thích ngược tăng phiên bản phụ và thay đổi API không tương thích ngược làm tăng phiên bản chính.

Vì vậy, câu hỏi cụ thể của bạn về ~liên quan đến lược đồ Major.Minor.Patch đó. (Cũng như nhà điều hành caret có liên quan ^.) Bạn có thể sử dụng ~để thu hẹp phạm vi phiên bản mà bạn sẵn sàng chấp nhận:

  • các thay đổi ở cấp độ bản vá tiếp theo cho cùng một phiên bản nhỏ ( "sửa lỗi không ảnh hưởng đến API" ) hoặc:
  • các thay đổi cấp độ nhỏ tiếp theo cho cùng một phiên bản chính ( "bổ sung / thay đổi API tương thích ngược" )

Ví dụ: để cho biết bạn sẽ thực hiện bất kỳ thay đổi cấp độ bản vá tiếp theo nào trên cây 1.2.x, bắt đầu bằng 1.2.0, nhưng dưới 1.3.0, bạn có thể sử dụng:

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

Điều này cũng mang lại cho bạn kết quả tương tự như sử dụng .xcú pháp:

"angular": "1.2.x"

Tuy nhiên, bạn có thể sử dụng dấu ngã / ~cú pháp để cụ thể hơn nữa: nếu bạn chỉ sẵn sàng chấp nhận các thay đổi ở cấp độ bản vá bắt đầu bằng 1.2.4 , nhưng vẫn dưới 1.3.0, bạn sẽ sử dụng:

"angular": "~1.2.4"

Di chuyển sang trái, hướng tới phiên bản chính , nếu bạn sử dụng ...

"angular": "~1"

... nó giống như ...

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

... Và phù hợp với bất kỳ thay đổi cấp độ nhỏ hoặc cấp vá nào trên 1.0.0 và dưới 2.0:

Lưu ý rằng biến thể cuối cùng ở trên: nó được gọi là 'phạm vi dấu mũ' . Dấu mũ trông rất giống a >, vì vậy bạn sẽ được miễn là nghĩ rằng "bất kỳ phiên bản nào lớn hơn 1.0.0". (Tôi chắc chắn đã trượt về điều đó.) Không!

Phạm vi caret về cơ bản được sử dụng để nói rằng bạn chỉ quan tâm đến chữ số có nghĩa nhất bên trái - thường là phiên bản chính - và bạn sẽ cho phép bất kỳ thay đổi cấp độ nhỏ hoặc cấp vá nào không ảnh hưởng đến chữ số bên trái nhất. Tuy nhiên, không giống như phạm vi dấu ngã chỉ định một phiên bản chính, phạm vi dấu mũ cho phép bạn chỉ định điểm bắt đầu nhỏ / vá chính xác. Vì vậy, trong khi ^1.0.0 === ~1, một phạm vi dấu mũ như ^1.2.3cho phép bạn nói rằng bạn sẽ thực hiện bất kỳ thay đổi nào >=1.2.3 && <2.0.0. Bạn không thể làm điều đó với một phạm vi dấu ngã.

Điều đó có vẻ khó hiểu lúc đầu, khi bạn nhìn nó cận cảnh. Nhưng hãy thu nhỏ trong một giây và suy nghĩ về nó theo cách này: dấu mũ chỉ đơn giản cho phép bạn nói rằng bạn quan tâm nhất về bất kỳ chữ số quan trọng nào còn lại - hầu hết. Dấu ngã cho phép bạn nói rằng bạn quan tâm nhất về bất kỳ chữ số nào là đúng - nhất. Phần còn lại là chi tiết.

Đó là sức mạnh biểu cảm của dấu ngã và dấu mũ giải thích lý do tại sao mọi người sử dụng chúng nhiều hơn .xcú pháp đơn giản hơn : họ chỉ đơn giản cho phép bạn làm nhiều hơn. Đó là lý do tại sao bạn sẽ thấy dấu ngã được sử dụng thường xuyên ngay cả nơi .xsẽ phục vụ. Ví dụ, xem chính npm: tệp pack.json của chính nó bao gồm rất nhiều phụ thuộc trong ~2.4.0định dạng, thay vì 2.4.xđịnh dạng mà nó có thể sử dụng. Bằng cách bám sát ~, cú pháp phù hợp tất cả các danh sách của hơn 70 phụ thuộc được phiên bản, bất kể số bản vá bắt đầu nào được chấp nhận.

Dù sao, vẫn còn nhiều hơn nữa cho SemVer, nhưng tôi sẽ không cố gắng chi tiết tất cả ở đây. Kiểm tra nó trên readme của gói semver . Và hãy chắc chắn sử dụng máy tính phiên bản ngữ nghĩa trong khi bạn đang thực hành và cố gắng tìm hiểu về cách thức hoạt động của SemVer.


RE: Số phiên bản không liên tục: Câu hỏi cuối cùng của OP dường như là về việc chỉ định số / phạm vi phiên bản không liên tiếp (nếu tôi đã chỉnh sửa công bằng). Có, bạn có thể làm điều đó, bằng cách sử dụng toán tử hai ống "hoặc" chung : ||. Thích như vậy:

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

27
Vì vậy, ~đặc biệt có nghĩa là số bản vá (thứ ba) có thể lớn hơn số được chỉ định, ví dụ như ~1.2.3tương đương với >=1.2.3 <1.3.0.
z0r

1
Cũng có thể được sử dụng cho số thứ yếu (thứ hai), cho mỗi lần chỉnh sửa nội tuyến ở trên.
XML

thật thú vị, tài liệu SemVer dường như cũng cho phép ký hiệu x (vốn hoàn toàn trực quan hơn với con người).
Frank Nocke

2
ký hiệu x là trực quan để đọc lúc đầu, nhưng kém linh hoạt hơn nhiều. Ví dụ , '1.1.x' === '>=1.1.0' === '~1.1.0'. Trường hợp 1.1.0 là dễ dàng. Nhưng ký hiệu x không thể là dạng hạt, như có thể '>=1.1.4'hoặc '~1.1.4'. Vì vậy, sau đó bạn kết thúc '1.1.x'ở một nơi trong danh sách phụ thuộc của bạn và '~2.7.3'ở một nơi khác. Điều đó tốt và hoạt động, nhưng một nhà phát triển sau đó cần phân tích nhiều cú pháp để đọc một danh sách. Và, nếu bạn đang viết các gói để đặt phiên bản theo chương trình, bạn muốn có một cú pháp duy nhất. Và, hầu hết mọi người muốn ngăn chặn thay đổi. Do đó, tất cả các vấn đề được giải quyết với ~.
XML

1
Hah Tôi nghĩ "Grok" ít địa lý hơn văn hóa nerd-lit (và có thể liên quan đến tuổi), @Clonkex. Dành cho những độc giả tương lai: đó là một tài liệu tham khảo về Người lạ của Heinlein ở một vùng đất lạ ...
XML

141

Dựa trên semver , bạn có thể sử dụng

  • Phạm vi gạch nối XYZ - ABC 1.2.3-2.3.4 chỉ ra > = 1.2.3 <= 2.3.4

  • Phạm vi X 1.2.x 1.X 1.2.*

  • Phạm vi Tilde ~1.2.3 ~1.2 Cho biết cho phép thay đổi cấp độ bản vá hoặc thay đổi phiên bản nhỏ.

  • Phạm vi caret ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

    Cho phép các thay đổi không sửa đổi chữ số khác hầu hết bên trái trong bộ dữ liệu [chính, phụ, vá]

    • ^1.2.x (có nghĩa là> = 1.2.0 <2.0.0)
    • ^0.0.x (có nghĩa là> = 0,0.0 <0,1.0)
    • ^0.0 (có nghĩa là> = 0,0.0 <0,1.0)

21
Cảm ơn bạn đã trả lời không vô nghĩa, dễ đọc. Tôi đã không phải theo dõi lại hoặc bất cứ điều gì, chỉ cần, bùng nổ, có câu trả lời. Làm tốt lắm;)
chập chững

76

Bower sử dụng cú pháp semver , nhưng đây là một vài ví dụ nhanh:

Bạn có thể cài đặt một phiên bản cụ thể:

$ bower install jquery#1.11.1

Bạn có thể sử dụng ~ để chỉ định 'bất kỳ phiên bản nào bắt đầu bằng':

$ bower install jquery#~1.11

Bạn có thể chỉ định nhiều yêu cầu phiên bản cùng nhau:

$ bower install "jquery#<2.0 >1.10"

1
Tôi tò mò về việc sử dụng thực tế này. Cài đặt Roulette?
gravidThoughts 17/08/2015

Nhìn vào câu trả lời của @ XMLilley (và các tài liệu về ngữ nghĩa) 'bắt đầu bằng' có vẻ sai, vì 1.12, 1.13 cũng sẽ ổn, miễn là phiên bản chính không tăng lên ...
Frank Nocke

13

Bạn cũng có thể sử dụng latesttừ khóa để cài đặt phiên bản mới nhất hiện có:

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

1
semver không đề cập đến điều này. Nơi mà bạn đã thiết lập nó hợp lệ? :) Nó nói " "*" := >=0.0.0(Bất kỳ phiên bản nào thỏa mãn)" gần nhưng hơi mơ hồ vì nó không nói cụ thể mới nhất để nó có thể là phiên bản đầu tiên mà nó tìm thấy?
GazB 18/03/2016

Thành thật mà nói, đó chỉ là bản dùng thử và lỗi - tôi đã thử và nó đã hoạt động! Bạn có thể đúng rằng nó không hợp lệ 100%, nhưng nó hoạt động.
Shacker 20/03/2016

7

Nếu không có số bản vá, ~tương đương với việc thêm .xvào phiên bản không dấu. Nếu có số bản vá, ~cho phép tất cả số bản vá> = số được chỉ định.

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

Tôi không có đủ điểm để nhận xét về câu trả lời được chấp nhận, nhưng một số thông tin dấu ngã có mâu thuẫn với tài liệu ngữ nghĩa được liên kết: "angular": "~1.2"sẽ không khớp với 1.3, 1.4, 1.4.9. Ngoài ra "angular": "~1""angular": "~1.0"không tương đương. Điều này có thể được xác nhận với máy tính semver npm .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.