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 .x
cú 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.3
cho 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 .x
cú 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 .x
sẽ 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"