Sự khác biệt giữa dấu ngã (~) và dấu mũ (^) trong gói.json là gì?


3385

Sau khi tôi nâng cấp lên ổn định mới nhất nodenpm, tôi đã thử npm install moment --save. Nó lưu mục nhập trong package.jsonvới ^tiền tố dấu mũ . Trước đây, nó là một ~tiền tố dấu ngã .

  1. Tại sao những thay đổi này được thực hiện trong npm?
  2. Sự khác biệt giữa dấu ngã ~và dấu mũ là ^gì?
  3. Những lợi thế hơn những người khác là gì?

42
FYI bạn có thể ngăn tiền tố hoặc sử dụng một tùy chỉnh bằng cách thực hiện : npm config set save-prefix=''. (Dán ~dấu ngoặc kép nếu đó là những gì bạn thích.) Cá nhân tôi làm điều này và thu nhỏ cho những thứ trong sản xuất.
fncomp

19
Tất cả các chi tiết khó chịu về cách thức hoạt động của tilde và caret và sự khác biệt: github.com/npm/node-semver#tilde-ranges-123-12-1
Jeffrey Martinez

11
Công cụ này là một người trợ giúp tuyệt vời để kiểm tra semver.npmjs.com
chaiyachaiya

@fncomp chỉ muốn làm rõ nếu tôi nhận xét đúng .. bạn có chỉ sử dụng các phiên bản phụ thuộc cụ thể trong dự án của mình không? nhóm của chúng tôi do dự trong việc nâng cấp các phụ thuộc .. bạn có khuyên bạn nên sử dụng các phiên bản cụ thể hoặc tiền tố '~' cho các phụ thuộc không ..?
blog4t

@fncomp bạn có thể vui lòng nêu chi tiết ý của bạn bằng cách nói "Cá nhân tôi làm điều này và thu nhỏ cho những thứ trong sản xuất". cảm ơn!
blog4t

Câu trả lời:


3846

Xem tài liệu NPMtài liệu semver

~ phiên bản có giá trị tương đương với phiên bản, sẽ cập nhật cho bạn tất cả các phiên bản vá trong tương lai mà không tăng phiên bản nhỏ. ~1.2.3sẽ sử dụng các bản phát hành từ 1.2.3 đến <1.3.0.

^ phiên bản Tương thích với phiên bản, sẽ cập nhật cho bạn tất cả các phiên bản nhỏ / vá trong tương lai, mà không tăng phiên bản chính. ^2.3.4sẽ sử dụng các bản phát hành từ 2.3.4 đến <3.0.0.

Xem bình luận bên dưới.


325
Đăng bài ở đây để hy vọng bắt được những người không nghĩ đến điều này, nhưng cả ^ và ~ đều cho rằng bạn có thể tin tưởng các bản phát hành nhỏ và điểm từ các phụ thuộc của bạn. Nếu bạn đang xuất bản một thư viện và muốn người khác tin tưởng bạn, ĐỪNG CHẤP NHẬN CÁC KHOẢN PHỤ THUỘC TẢI XUỐNG. Một bản phát hành chấm xấu từ sự phụ thuộc của bạn có thể gây ra phản ứng dây chuyền ngược dòng và sẽ có người gõ cửa BẠN khi mọi thứ trở thành hình quả lê. Đây là một lý do lớn khác để sử dụng thu nhỏ npm trên mã sản xuất của bạn.
tehfoo

8
Bạn cũng có thể loại bỏ tất cả những điều vô nghĩa của npm khi chuẩn bị các phiên bản của bạn bằng một ^hoặc a ~. Đặt cái này nếu bạn muốn kiểm soát chặt chẽ các phiên bản của mình: npm config set save-prefix=''
kumarharsh

5
@prasanthv đã đúng: từ docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : 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á]. Nói cách khác, điều này cho phép vá và cập nhật nhỏ cho các phiên bản 1.0.0 trở lên, cập nhật vá cho các phiên bản 0.X> = 0.1.0 và không có bản cập nhật nào cho các phiên bản 0.0.X.
rofrol

15
@jgillich trong semver khi bạn sử dụng 0.2.x, 2không phải là một major version. Đó là lý do tại sao docs.npmjs.com sử dụng các từ cụ thể : the left-most non-zero digit. Ngoài ra những gì về trường hợp này: ^ 0.0.4 có nghĩa là 0.0.4
rofrol

11
@FagnerBrack: Ví dụ cụ thể bạn cung cấp là chính xác, nhưng nói chung cách suy nghĩ của bạn là sai. Một ví dụ: của let nói rằng bạn có gói Atrong 3 phiên bản: 0.0.1, 0.0.20.0.3. Có một lỗi trong 0.0.1vì vậy bạn muốn có ít nhất 0.0.2trong gói của bạn B. Nếu bạn viết 0.0.xbạn sẽ nhận được 0.0.3, điều đó là OK. Nhưng nếu một số gói khác Cyêu cầu cả hai BAngoài ra có ràng buộc "A": "<0.0.2"bạn sẽ nhận được 0.0.1mà không hiển thị bất kỳ vấn đề xung đột nào, đó không phải là điều bạn muốn. Sử dụng dấu ngã ~0.0.2sẽ giúp bạn tránh được vấn đề này.
Maciej Sz

862

Tôi muốn thêm tài liệu chính thức của npmjs, trong đó mô tả tất cả các phương pháp cho tính đặc hiệu của phiên bản, bao gồm cả các phương pháp được đề cập trong câu hỏi -

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

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

  • ~version"Gần tương đương với phiên bản" Xem npm semver - Tilde Ranges & semver (7)
  • ^version"Tương thích với phiên bản" Xem npm semver - Caret Ranges & semver (7)
  • version Phải khớp chính xác phiên bản
  • >version Phải lớn hơn phiên bản
  • >=version Vân vân
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1, v.v., nhưng không phải 1.3.0
  • http://sometarballurl (đây có thể là URL của tarball sẽ được tải xuống và cài đặt cục bộ
  • * Phù hợp với bất kỳ phiên bản nào
  • latest Có được bản phát hành mới nhất

Danh sách trên không toàn diện. Các chỉ định phiên bản khác bao gồm các url GitHub và repo người dùng GitHub, các đường dẫn và gói địa phương với các thẻ npm cụ thể


8
Cũng có thể chỉ định một phạm vi chính xác của các phiên bản, như 1.2.0 || >=1.2.2 <1.3.0: Chính xác là 1.2.0 hoặc mọi thứ từ 1.2.2 đến 1.3.0 (đã bao gồm), nhưng không phải là 1.2.1, hoặc 1.3.1 trở lên, và cũng không phải 1.1 .x trở xuống.
CodeManX

Một liên kết cụ thể hơn ở trên -> docs.npmjs.com/files/package.json#dependencies
Toby

"Approximately equivalent to version""Compatible with version"là những cách không cụ thể để mô tả hành vi ~ và ^. Cảm ơn bạn @jgillich đã cung cấp câu trả lời thực tế!
Scott Stafford

636

npm cho phép cài đặt phiên bản mới hơn của gói so với phiên bản được chỉ định. Sử dụng tilde ( ~) cung cấp cho bạn các bản phát hành sửa lỗi và caret ( ^) cũng cung cấp cho bạn chức năng mới tương thích ngược.

Vấn đề là các phiên bản cũ thường không nhận được sửa lỗi nhiều, vì vậy npm sử dụng caret ( ^) làm mặc định cho --save.

bảng semver

Theo: "Semver đã giải thích - tại sao lại có dấu mũ (^) trong gói.json của tôi?" .

Lưu ý rằng các quy tắc áp dụng cho các phiên bản trên 1.0.0 và không phải mọi dự án đều tuân theo phiên bản ngữ nghĩa. Đối với các phiên bản 0.xx, dấu mũ chỉ cho phép vá các bản cập nhật, nghĩa là nó hoạt động giống như dấu ngã. Xem "Phạm vi Caret"

Dưới đây là một lời giải thích trực quan về các khái niệm:

sơ đồ ngữ nghĩa

Nguồn: "Áo choàng phiên bản ngữ nghĩa" .


2
^ 0,2,5 thì sao? từ docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : 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á]. Nói cách khác, điều này cho phép vá và cập nhật nhỏ cho các phiên bản 1.0.0 trở lên, cập nhật vá cho các phiên bản 0.X> = 0.1.0 và không có bản cập nhật nào cho các phiên bản 0.0.X.
rofrol

11
@rofrol bất kỳ phiên bản nào trước 1.0.0 được coi là không ổn định và các quy tắc này không được áp dụng
pspi

2
Vì vậy, lời giải thích của bạn chưa hoàn tất
rofrol 04/11/2015

5
@rofrol yeah, bỏ qua để dễ đọc đôi khi rất tốt, cơ hội có bất cứ điều gì dưới 1.0.0 cho sự phụ thuộc trong gói json là khá thấp. xem thêm nguyên tắc 20/80, là một quy tắc tuyệt vời để tập trung vào những gì quan trọng
pspi

1
@pspi Có phiên bản dưới 1.0.0 là "không thể"? Trong số 60 chúng tôi có ~ 15, và hầu hết trong số họ không bị che khuất.
Dave Newton

99

Học sinh

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • Sử dụng máy tính semver npm để thử nghiệm. (Mặc dù các giải thích cho ^ (bao gồm mọi thứ lớn hơn một phiên bản cụ thể trong cùng phạm vi chính) và ~ (bao gồm mọi thứ lớn hơn một phiên bản cụ thể trong cùng phạm vi nhỏ) không chính xác 100%, máy tính có vẻ hoạt động tốt )
  • Ngoài ra, thay vào đó, hãy sử dụng SemVer Check , không yêu cầu bạn chọn gói và cũng cung cấp giải thích.

Cho phép hoặc không cho phép thay đổi

  • Phiên bản pin : 1.2.3.
  • Sử dụng ^(như đầu). Cho phép cập nhật ở cấp độ khác không thứ hai từ bên trái: ^0.2.3có nghĩa 0.2.3 <= v < 0.3.
  • Sử dụng ~(như đuôi). Thường đóng băng mức cao nhất hoặc đặt 0 nếu bỏ qua:
    • ~1 có nghĩa 1.0.0 <= v < 2.0.0
    • ~1.2có nghĩa là 1.2.0 <= v < 1.3.0.
    • ~1.2.4có nghĩa là 1.2.4 <= v < 1.3.0.
  • Ommit right-most level: 0.2có nghĩa là 0.2 <= v < 1. Khác với ~vì:
    • Bắt đầu phiên bản cấp độ bỏ qua luôn 0
    • Bạn có thể thiết lập bắt đầu phiên bản chính mà không chỉ định cấp dưới.

Tất cả (hy vọng) khả năng

Đặt bắt đầu cấp chính và cho phép cập nhật lên

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

Đóng băng cấp chính

~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

Đóng băng cấp nhỏ

^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

Đóng băng cấp độ vá

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

Không cho phép cập nhật

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

Lưu ý : Thiếu chính, phụ, vá hoặc chỉ định betakhông có số, giống như anyđối với cấp độ thiếu.

Lưu ý : Khi bạn cài đặt gói có 0cấp chính, bản cập nhật sẽ chỉ cài đặt phiên bản cấp beta / pr mới! Đó là vì npmthiết lập ^mặc định trong package.jsonvà khi cài đặt phiên bản giống như vậy 0.1.3, nó đóng băng tất cả các cấp chính / phụ / bản vá.


Nói mọi người tránh bắt đầu các dự án từ 0 vì thư viện và các nhà phát triển tiêu thụ không hiểu hệ thống là một giải pháp tồi tệ. Tôi nghĩ rằng @asdfasdfads có nhiều thông tin tốt hơn.
ProLoser

@ProLoser Tôi chỉ nghĩ rằng hệ thống nên được đơn giản hóa và chúng ta không nên sử dụng các phiên bản 0.x.
rofrol

1
Trường hợp sử dụng xung quanh sự phát triển vòng đời sớm và v0 có rất nhiều ý nghĩa. Tìm hiểu cách v0 cư xử đúng đắn đã thực sự khiến tôi mong đợi các dự án vòng đời sớm khác. Điều đó có nghĩa là bạn có thể có API thay đổi nhanh chóng với nhiều khả năng không tương thích ngược mà không bị buộc phải khai báo dự án của bạn là 1.x (hay còn gọi là ổn định) khi thực sự không.
ProLoser

Tôi hiểu điều đó, nhưng tôi không thích cách nó hoạt động với semver và vòng loại
rofrol

2
Nó cảm thấy giống như một ý kiến ​​và không nên đóng khung như một cách tiếp cận thường được chấp nhận. Và ^ 0.1.x được vá hoàn toàn tốt.
ProLoser

93

~sửa các số chính và phụ. Nó được sử dụng khi bạn sẵn sàng chấp nhận sửa lỗi trong phần phụ thuộc của mình, nhưng không muốn bất kỳ thay đổi nào không tương thích.

^chỉ sửa số chính. Nó được sử dụng khi bạn theo dõi chặt chẽ các phụ thuộc của mình và sẵn sàng thay đổi nhanh mã của bạn nếu bản phát hành nhỏ sẽ không tương thích.

Bên cạnh đó, ^không được hỗ trợ bởi các phiên bản NPM cũ, và nên được sử dụng một cách thận trọng.

Vì vậy, ^là một mặc định tốt, nhưng nó không hoàn hảo. Tôi đề nghị chọn cẩn thận và cấu hình toán tử semver hữu ích nhất cho bạn.


13
không đúng: 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á]. Nói cách khác, điều này cho phép vá và cập nhật nhỏ cho các phiên bản 1.0.0 trở lên, cập nhật vá cho các phiên bản 0.X> = 0.1.0 và không có bản cập nhật nào cho các phiên bản 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

6
Câu trả lời này là hoàn toàn sai (như nhiều người khác ở đây). Không ai trong số này từng sửa một số lớn! Như @rofrol đã nói, ^ chỉ đơn giản là giữ nguyên hầu hết các chữ số khác không. ~ mặt khác chỉ cho phép vá các bản cập nhật nếu phiên bản nhỏ được chỉ định (ví dụ ~ 1.2.3 hoặc ~ 1.2) và cho phép cập nhật nhỏ nếu phiên bản nhỏ không được chỉ định (ví dụ ~ 1).
TheBaj

2
@TheBaj Có nghĩa là "sửa" là "xác định" ("sửa") chứ không phải "điều chỉnh", vì vậy tất cả các bạn đều đồng ý về cách xử lý số chính.
maaartinus

1
Vâng, câu trả lời này dường như hoàn toàn ngược lại cho đến khi tôi nhận ra người trả lời có nghĩa là "sửa chữa" như trong "để cố định, đứng yên hoặc không thay đổi."
NattyC

57

~: Phải chăng gần đến

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: Tương thích với

   ^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 - không. Trong trường hợp đặc biệt của số phiên bản phát hành zeroth, carat tương đương với dấu ngã. Do đó, ^0.1.3chỉ chấp nhận các phiên bản 0.1.xvà sẽ không chấp nhận 0.2.0, mặc dù đó là một sự gia tăng nhỏ. Hành vi này tương đương với ~0.1.3. Lý do đằng sau hành vi này là do thực tế là các gói phát hành zeroth vẫn được coi là không ổn định; theo cách nói của semver.org , # 4, "mọi thứ có thể thay đổi bất cứ lúc nào" (bao gồm cả những thay đổi không tương thích ngược).
chharvey

31

^là 1. [any]. [any] (phiên bản nhỏ mới nhất)
~là 1.2. [any] (bản vá mới nhất)

Một bài đọc tuyệt vời là bài đăng trên blog này về cách semver áp dụng cho npm
và những gì họ đang làm để làm cho nó phù hợp với tiêu chuẩn semver
http://blog.npmjs.org/post/98131109725/npm-2-0-0


2
không đúng: 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á]. Nói cách khác, điều này cho phép vá và cập nhật nhỏ cho các phiên bản 1.0.0 trở lên, cập nhật vá cho các phiên bản 0.X> = 0.1.0 và không có bản cập nhật nào cho các phiên bản 0.0.X. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

28

Phù hợp với chiếc mũ có thể được coi là "bị hỏng" vì nó sẽ không cập nhật ^0.1.2để 0.2.0. Khi phần mềm đang nổi lên, 0.x.ycác phiên bản sử dụng và kết hợp mũ sẽ chỉ khớp với chữ số thay đổi cuối cùng ( y). Điều này được thực hiện trên mục đích. Lý do là trong khi phần mềm đang phát triển API thay đổi nhanh chóng: một ngày bạn có các phương thức này và ngày khác bạn có các phương thức đó và các phương thức cũ không còn nữa. Nếu bạn không muốn phá mã cho những người đã sử dụng thư viện của bạn, bạn hãy đi và tăng phiên bản chính: vd 1.0.0-> 2.0.0-> 3.0.0. Vì vậy, vào thời điểm phần mềm của bạn cuối cùng đã hoàn thành 100% và có đầy đủ tính năng, nó sẽ giống như phiên bản 11.0.0và điều đó trông không có ý nghĩa lắm, và thực sự trông khó hiểu. Nếu bạn là, mặt khác, sử dụng 0.1.x->0.2.x-> 0.3.xphiên bản sau đó đến khi phần mềm hoàn thành 100% và có đầy đủ tính năng thì nó được phát hành dưới dạng phiên bản 1.0.0và có nghĩa là "Bản phát hành này là bản dịch vụ dài hạn, bạn có thể tiến hành và sử dụng phiên bản thư viện này trong sản phẩm của mình mã, và tác giả sẽ không thay đổi mọi thứ vào ngày mai hoặc tháng tới và anh ta sẽ không từ bỏ gói hàng ".

Quy tắc là: sử dụng 0.x.yphiên bản khi phần mềm của bạn chưa hoàn thiện và phát hành phần mềm với chữ số giữa khi API công khai của bạn thay đổi (do đó mọi người ^0.1.0sẽ không được 0.2.0cập nhật và nó sẽ không phá vỡ mã của họ). Sau đó, khi phần mềm đáo hạn, hãy giải phóng nó xuống 1.0.0và tăng chữ số ngoài cùng bên trái mỗi khi API công khai của bạn thay đổi (do đó mọi người ^1.0.0sẽ không nhận được 2.0.0cập nhật và nó sẽ không phá vỡ mã của họ).

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.

Nhận xét này rất hữu ích và dường như không được ghi chép lại rất tốt. Bạn có một liên kết đến các tài liệu xung quanh hành vi này? Câu trả lời này về các dự án v0 đã giúp tôi rất nhiều.
ProLoser

Tôi không có liên kết: Tôi cũng tìm thấy thông tin này bằng cách googling và chơi với máy tính phiên bản ngữ nghĩa npm semver.npmjs.com
catamphetamine

2
Cần phải được thêm vào tài liệu của họ một cách chính thức hơn. Tôi đã nói chuyện tại Sony với đội ngũ kỹ thuật của mình vì dường như nó rất dễ bị bỏ qua. slides.com/proloser/semver-v0
ProLoser

24

~ Dấu ngã:

  • ~đóng băng số lượng lớn và nhỏ.
  • Nó được sử dụng khi bạn sẵn sàng chấp nhận sửa lỗi trong phần phụ thuộc của mình, nhưng không muốn bất kỳ thay đổi nào không tương thích.
  • Dấu ngã khớp với phiên bản nhỏ gần đây nhất (số ở giữa).
  • ~ 1.2.3 sẽ phù hợp với tất cả các phiên bản 1.2.x, nhưng nó sẽ bỏ lỡ 1.3.0.
  • Tilde (~) cung cấp cho bạn bản phát hành sửa lỗi

^ Chăm sóc:

  • ^ chỉ đóng băng số lượng lớn
  • Nó được sử dụng khi bạn theo dõi chặt chẽ các phụ thuộc của mình và sẵn sàng thay đổi nhanh mã của bạn nếu bản phát hành nhỏ sẽ không tương thích.
  • Nó sẽ cập nhật cho bạn phiên bản chính gần đây nhất (số đầu tiên).
  • ^ 1.2.3 sẽ khớp với bất kỳ bản phát hành 1.xx nào bao gồm 1.3.0, nhưng nó sẽ giữ lại trên 2.0.0.
  • Caret (^) cũng cung cấp cho bạn chức năng mới tương thích ngược.

1
Dấu ngã khớp với phiên bản vá gần đây nhất (số cuối cùng). Các dấu mũ phù hợp với phiên bản nhỏ gần đây nhất (số giữa).
Abdul Rauf

"Đóng băng" là lời giải thích tốt nhất.
mhrabiee

Caret cả hai đóng băng số chính và sẽ cập nhật cho bạn phiên bản chính gần đây nhất (số đầu tiên)? Số chính là số đầu tiên, vì vậy điều này không có ý nghĩa.
NattyC

19

Tilde ~ khớp với phiên bản nhỏ, nếu bạn đã cài đặt gói có 1.4.2 và sau khi cài đặt, phiên bản 1.4.3 và 1.4.4 cũng có sẵn nếu trong gói.json của bạn, nó được sử dụng là ~ 1.4.2 sau đó cài đặt npm trong dự án của bạn sau khi nâng cấp sẽ cài đặt 1.4.4 trong dự án của bạn. Nhưng có sẵn 1.5.0 cho gói đó thì nó sẽ không được cài đặt bởi ~. Nó được gọi là phiên bản nhỏ.

Caret ^ phù hợp với phiên bản chính, nếu gói 1.4.2 được cài đặt trong dự án của bạn và sau khi cài đặt 1.5.0 của bạn được phát hành thì ^ sẽ cài đặt phiên bản chính. Nó sẽ không cho phép cài đặt 2.1.0 nếu bạn có ^ 1.4.2 .

Phiên bản cố định nếu bạn không muốn thay đổi phiên bản gói trên mỗi cài đặt, sau đó sử dụng phiên bản cố định với bất kỳ ký tự đặc biệt nào, ví dụ: "1.4.2"

Phiên bản mới nhất * Nếu bạn muốn cài đặt phiên bản mới nhất thì chỉ sử dụng * trước tên gói.


3
Câu trả lời này là sai lệch. SemVer nêu rõ, Số phiên bản bình thường PHẢI có dạng XYZ [trong đó] X là phiên bản chính, Y là phiên bản phụ và Z là phiên bản vá lỗi.
Leo

15

Một lời giải thích lót

Hệ thống phiên bản tiêu chuẩn là Major.minor.build (ví dụ 2.4.1)

npm kiểm tra và sửa phiên bản của một gói cụ thể dựa trên các ký tự này

~ : phiên bản chính đã được sửa, phiên bản nhỏ đã được sửa, khớp với bất kỳ số bản dựng nào

ví dụ: ~ 2.4.1 có nghĩa là nó sẽ kiểm tra 2.4.x trong đó x là bất cứ thứ gì

^ : phiên bản chính đã được sửa, khớp với bất kỳ phiên bản nhỏ nào, khớp với bất kỳ số bản dựng nào

ví dụ: ^ 2.4.1 có nghĩa là nó sẽ kiểm tra 2.xx trong đó x là bất cứ thứ gì


5
Tôi thấy 7 dòng trong câu trả lời này
FluxLemur

11

Bạn có thể đã thấy dấu ngã (~) và dấu mũ (^) trong gói.json. sự khác biệt giữa chúng là gì?

Khi bạn thực hiện cài đặt npm khoảnh khắc - lưu, Nó sẽ lưu mục nhập trong gói.json với tiền tố caret (^).

Dấu ngã (~)

Theo thuật ngữ đơn giản nhất, dấu ngã (~) khớp với phiên bản nhỏ gần đây nhất (số giữa). ~ 1.2.3 sẽ phù hợp với tất cả các phiên bản 1.2.x nhưng sẽ bỏ lỡ 1.3.0.

Các dấu mũ (^)

Mặt khác, dấu mũ (^) thoải mái hơn. Nó sẽ cập nhật cho bạn phiên bản chính gần đây nhất (số đầu tiên). ^ 1.2.3 sẽ khớp với bất kỳ bản phát hành 1.xx nào bao gồm 1.3.0, nhưng sẽ giữ lại trên 2.0.0.

Tham khảo: https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b


Một lần nữa, câu trả lời này là sai lệch. SemVer nêu rõ, Số phiên bản bình thường PHẢI có dạng XYZ [trong đó] X là phiên bản chính, Y là phiên bản phụ và Z là phiên bản vá lỗi.
Leo

5

semver được tách thành 3 phần chính bị phá vỡ bởi các dấu chấm.

major.minor.patch
1.0.0

Những bản chính, phụ và bản vá khác nhau đang sử dụng để xác định các bản phát hành khác nhau. triều (~) và dấu mũ (^) đang sử dụng để xác định phiên bản nhỏ và bản vá nào sẽ được sử dụng trong phiên bản gói.

~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

Dấu ngã (~)

phiên bản chính là cố định, phiên bản nhỏ là cố định, phù hợp với bất kỳ số bản dựng nào

"express": "~4.13.3" 

~4.13.3 có nghĩa là nó sẽ kiểm tra 4.13.x trong đó x là bất cứ thứ gì và 4.14.0

Chăm sóc (^)

phiên bản chính được sửa, khớp với bất kỳ phiên bản nhỏ nào, khớp với bất kỳ số bản dựng nào

"supertest": "^3.0.0"

^3.0.0 có nghĩa là nó sẽ kiểm tra 3.xx trong đó x là bất cứ thứ gì


Bạn có thể giải thích làm thế nào câu trả lời này khác với cùng một câu trả lời được đăng 4 năm trước không?
Franklin Yu

2

Số phiên bản theo cú pháp chỉ định từng phần với ý nghĩa khác nhau. cú pháp được chia thành ba phần cách nhau bởi một dấu chấm.

Major.minor.patch 1.0.2

Chính, phụ và bản vá đại diện cho các bản phát hành khác nhau của một gói.

npm sử dụng dấu ngã (~) và dấu mũ (^) để chỉ định bản vá và phiên bản nhỏ nào sẽ sử dụng tương ứng.

Vì vậy, nếu bạn thấy ~ 1.0.2, có nghĩa là cài đặt phiên bản 1.0.2 hoặc phiên bản vá mới nhất, chẳng hạn như 1.0.4. Nếu bạn thấy ^ 1.0.2, điều đó có nghĩa là cài đặt phiên bản 1.0.2 hoặc phiên bản nhỏ hoặc bản vá mới nhất, chẳng hạn như 1.1.0.


1
Bạn có thể giải thích làm thế nào câu trả lời này khác với cùng một câu trả lời được đăng 4 năm trước không?
Franklin Yu

2

carat ^ bao gồm mọi thứ lớn hơn một phiên bản cụ thể trong cùng phạm vi chính.

dấu ngã ~ bao gồm mọi thứ lớn hơn một phiên bản cụ thể trong cùng một phạm vi nhỏ.

Ví dụ: để chỉ định phạm vi phiên bản có thể chấp nhận lên tới 1.0.4, hãy sử dụng cú pháp sau:

  • Bản phát hành bản vá: 1.0 hoặc 1.0.x hoặc ~ 1.0.4
  • Bản phát hành nhỏ: 1 hoặc 1.x hoặc ^ 1.0.4
  • Bản phát hành chính: * hoặc x

Để biết thêm thông tin về cú pháp phiên bản ngữ nghĩa, hãy xem máy tính semver npm .

phiên bản ngữ nghĩa npm trong các gói được xuất bản

Thông tin thêm từ tài liệu npm Giới thiệu về phiên bản ngữ nghĩa


1

Không phải là một câu trả lời, mỗi lần, nhưng một quan sát dường như đã bị bỏ qua.

Mô tả cho phạm vi carat:

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

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á].

Có nghĩa là ^10.2.3phù hợp10.2.3 <= v < 20.0.0

Tôi không nghĩ đó là những gì họ muốn nói. Kéo trong các phiên bản 11.xx đến 19.xx sẽ phá vỡ mã của bạn.

Tôi nghĩ rằng họ có nghĩa left most non-zero number field. Không có gì trong SemVer yêu cầu các trường số phải là một chữ số.


0

~ specfices cho phiên bản phát hành nhỏ ^ chỉ định cho phiên bản chính

Ví dụ: nếu phiên bản gói là 4.5.2, vào Cập nhật ~ 4.5.2 sẽ cài đặt phiên bản 4.5.x mới nhất (PHIÊN BẢN MINOR) ^ 4.5.2 sẽ cài đặt phiên bản 4.xx mới nhất (PHIÊN BẢN CHÍNH)


8
Bạn có thể giải thích làm thế nào câu trả lời này khác với cùng một câu trả lời được đăng 4 năm trước không?
Franklin Yu

0

Liên quan đến câu hỏi này, bạn có thể xem lại tài liệu của Nhà soạn nhạc trên các phiên bản , nhưng ở đây ngắn gọn:

  • Phạm vi Phiên bản Tilde ( ~ ) - ~ 1.2.3 tương đương với> = 1.2.3 < 1.3.0
  • Phạm vi phiên bản Caret ( ^ ) - ~ 1.2.3 tương đương với> = 1.2.3 < 2.0.0

Vì vậy, với Tilde, bạn sẽ nhận được các bản cập nhật tự động của các bản vá nhưng các phiên bản nhỏ và chính sẽ không được cập nhật. Tuy nhiên, nếu bạn sử dụng Caret, bạn sẽ nhận được các bản vá và phiên bản nhỏ, nhưng bạn sẽ không nhận được các phiên bản chính (phá vỡ thay đổi).

Phiên bản Tilde được coi là phương pháp "an toàn hơn", nhưng nếu bạn đang sử dụng các phụ thuộc đáng tin cậy (thư viện được bảo trì tốt), bạn không nên có bất kỳ vấn đề nào với Phiên bản Caret (vì các thay đổi nhỏ sẽ không phá vỡ các thay đổi.

Bạn có thể nên xem lại bài đăng stackoverflow này về sự khác biệt giữa cài đặt của nhà soạn nhạc và cập nhật của nhà soạn nhạc .

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.