Tôi có nên cam kết tệp Sợi.lock không và dùng để làm gì?


305

Sợi tạo ra một yarn.locktập tin sau khi bạn thực hiện a yarn install.

Điều này nên được cam kết với các kho lưu trữ hoặc bỏ qua? Nó dùng để làm gì?


3
IMHO, câu hỏi này (và hầu hết các câu trả lời dưới đây) không đầy đủ do thiếu câu hỏi "Làm thế nào và khi nào chúng ta nên tạo lại tệp Sợi.lock?"
MarkHu

1
Bạn có biết bây giờ như thế nào và khi nào?
jayarjo

@MarkHu tìm thấy nó ở đây: yarnpkg.com/lang/en/docs/yarn-lock/#toc-managed-by-yarn Vì vậy, về cơ bản:Your yarn.lock file is auto-generated and should be handled entirely by Yarn. As you add/upgrade/remove dependencies with the Yarn CLI, it will automatically update your yarn.lock file.
jayarjo

Câu trả lời:


271

Có, bạn nên kiểm tra nó, xem Di chuyển từ npm

Sợi sẽ tạo ra một tệp Sợi.lock trong thư mục gốc của gói của bạn. Bạn không cần phải đọc hoặc hiểu tệp này - chỉ cần kiểm tra nó trong kiểm soát nguồn.


33
Đẹp tìm thấy. Tôi đã tìm thấy những điều sau đây từ các tài liệu của họ trả lời "nó dùng để làm gì?": "Máy khách npm cài đặt các phụ thuộc vào thư mục node_modules không xác định. Điều này có nghĩa là dựa trên các phụ thuộc đơn hàng được cài đặt, cấu trúc của một nút_modules thư mục này có thể khác nhau từ người này sang người khác. Những khác biệt này có thể khiến cho các tác phẩm trên máy của tôi bị lỗi mất nhiều thời gian để tìm kiếm. "
rlay3

13
Tiếp tục: "Sợi giải quyết các vấn đề này xung quanh việc tạo phiên bản và không xác định bằng cách sử dụng các khóa và thuật toán cài đặt có tính xác định và đáng tin cậy. Các khóa này khóa các phụ thuộc đã cài đặt vào một phiên bản cụ thể và đảm bảo rằng mọi cài đặt đều dẫn đến cùng một cấu trúc tệp trong node_modules trên tất cả các máy. "
rlay3

Thay vì nói "không tìm thấy lockfile". Nó chỉ nên nói "Tạo tập tin Sợi.lock". Duh :) Đó không phải là một lỗi, nhưng trước đây có vẻ như là một lỗi. Và cái sau sẽ đủ đáng báo động cho bất kỳ ai trong kịch bản nghịch đảo, (nơi họ mong đợi có tệp Sợi.lock, nhưng dường như không).
Alexander Mills

7
Tôi đánh giá cao Sợi.lock đang khóa dự án của chúng tôi với các phiên bản gói cụ thể, nhưng tôi cảm thấy việc sử dụng từ "khóa" là không may. Thông thường các tệp khóa (chẳng hạn như .ldb ) là một phương tiện giới hạn tài nguyên trong một quy trình tại một thời điểm để ngăn chặn các cập nhật xen kẽ tham nhũng có thể gây ra. Các tệp khóa như vậy chắc chắn không được cam kết kiểm soát phiên bản, có thể là nơi mà hầu hết sự nhầm lẫn về Sợi.lock bắt nguồn từ.
Antony

2
Tôi thực sự không thích cụm từ "bạn không cần phải đọc hoặc hiểu tệp này". Đây là một tập tin quan trọng để duy trì dự án của bạn.
Chuyến đi của Nathan

83

Phụ thuộc vào dự án của bạn là gì:

  1. Dự án của bạn là một ứng dụng? Sau đó: Vâng
  2. Dự án của bạn là một thư viện? Nếu vậy: Không

Một mô tả chi tiết hơn về điều này có thể được tìm thấy trong vấn đề GitHub này , nơi một trong những người tạo ra Sợi, ví dụ. nói:

Gói.json mô tả các phiên bản dự định mà tác giả ban đầu mong muốn, trong khi Sợi.lock mô tả cấu hình được biết đến cuối cùng cho một ứng dụng nhất định.

Chỉ yarn.lock-file của dự án cấp cao nhất sẽ được sử dụng. Vì vậy, trừ khi các dự án đó sẽ được sử dụng độc lập và không được cài đặt vào dự án khác, thì sẽ không có bất kỳ cam kết nào yarn.lock- thay vào đó, nó sẽ luôn luôn package.jsontùy thuộc vào việc truyền đạt các phiên bản phụ thuộc mà dự án mong đợi.


7
Mặt khác, việc không có tệp khóa trong các dự án thư viện có ảnh hưởng đến độ tái lập của các thử nghiệm tương ứng của họ không?
E_net4 cử tri thân thiết

1
Nếu tôi đọc mô tả của bạn một cách chính xác, hơn "Dự án của bạn có phải là thư viện không?" có thể được trả lời với "Nếu bạn muốn". Nó dường như không có nhược điểm, nhưng có thể hữu ích, nếu bạn có các devDependencies phức tạp và bạn muốn mọi nhà phát triển lib của bạn có cùng một bản dựng và kiểm tra các tập lệnh. Đúng?
Pipo

4
Vì tệp khóa sẽ không được tôn trọng đối với bất kỳ người dùng nào trong thư viện của bạn, nên việc dựa vào nó khi phát triển thư viện có thể mang lại cảm giác an toàn sai lầm
VoxPelli

1
Dart có cùng hệ thống với pubspec.yaml và pubspec.lock và đề xuất giống như trong câu trả lời. Xem câu hỏi nàymục tài liệu này .
Jonas Kello

16
Vui lòng xem mục này trong blog chính thức của Sợi: Các tệp khóa phải được cam kết trên tất cả các dự án
E_net4 cử tri thân cận

66

Tôi thấy đây là hai câu hỏi riêng biệt trong một. Hãy để tôi trả lời cả hai.

Bạn có nên cam kết các tập tin vào repo?

Đúng. Như đã đề cập trong câu trả lời ckuijjer của nó được khuyến khích trong Migration Guide đưa file này vào repo. Đọc để hiểu lý do tại sao bạn cần phải làm điều đó.

yarn.lock

Nó là một tệp lưu trữ các phiên bản phụ thuộc chính xác cho dự án của bạn cùng với tổng kiểm tra cho mỗi gói. Đây là cách của sợi để cung cấp sự nhất quán cho các phụ thuộc của bạn.

Để hiểu lý do tại sao tệp này là cần thiết, trước tiên bạn cần hiểu vấn đề đằng sau NPM ban đầu là gì package.json. Khi bạn cài đặt gói, NPM sẽ lưu trữ phạm vi sửa đổi được phép của một phụ thuộc thay vì sửa đổi cụ thể (semver). NPM sẽ cố gắng tìm nạp bản cập nhật phiên bản phụ thuộc mới nhất trong phạm vi được chỉ định (nghĩa là cập nhật bản vá không phá vỡ). Có hai vấn đề với cách tiếp cận này.

  1. Các tác giả phụ thuộc có thể phát hành bản cập nhật phiên bản vá trong khi thực tế giới thiệu một thay đổi đột phá sẽ ảnh hưởng đến dự án của bạn.

  2. Hai nhà phát triển chạy npm installvào các thời điểm khác nhau có thể có được bộ phụ thuộc khác nhau. Điều này có thể gây ra lỗi không thể tái tạo trên hai môi trường giống hệt nhau. Điều này có thể gây ra vấn đề ổn định xây dựng cho các máy chủ CI chẳng hạn.

Sợi mặt khác có lộ trình dự đoán tối đa. Nó tạo yarn.locktập tin để lưu các phiên bản phụ thuộc chính xác . Có tập tin đó tại chỗ sợi sẽ sử dụng các phiên bản được lưu trữ yarn.lockthay vì giải quyết các phiên bản từ package.json. Chiến lược này đảm bảo rằng không có vấn đề nào được mô tả ở trên xảy ra.

yarn.locktương tự như npm-shrinkwrap.jsoncó thể được tạo bởi npm shrinkwraplệnh. Kiểm tra câu trả lời này giải thích sự khác biệt giữa hai tệp này.


1
Nhưng tôi thấy yarn.lockđược cập nhật ngay bây giờ và sau đó, bạn có biết tại sao và khi yarnnào điều đó?
jayarjo

1
Các vấn đề về sợi # 4379# 4147 cho thấy rằng các yarnbản cập nhật yarn.locktrong nhiều trường hợp, bao gồm cả việc chạy yarn installmà không thay đổi đối với gói.json. Sử dụng yarn install --frozen-lockfilenhư được đề xuất trong Tại sao việc chạy sợi trên cửa sổ sẽ thay đổi sợi.lock (hoặc định cấu hình thông qua .yarnrc) có vẻ như là đặt cược tốt nhất.
Lauri Harpf

npm ngày nay có a package-lock.jsonvà a npm ci. Quy trình đó là sợi tương tự yarn.lockyarn install --frozen-lockfile.
k0pernikus


8

Bạn nên:

  1. thêm nó vào kho lưu trữ và cam kết nó
  2. sử dụng yarn install --frozen-lockfilevà KHÔNG yarn installlàm mặc định cả cục bộ và trên các máy chủ xây dựng CI.

(Tôi đã mở một vé trên bộ theo dõi vấn đề của sợi để tạo ra một trường hợp để thực hiện hành vi mặc định khóa-đông lạnh, xem # 4147 ).


Coi chừng KHÔNG đặt frozen-lockfilecờ trong .yarnrctệp vì điều đó sẽ ngăn bạn không thể đồng bộ hóa tệp pack.json và Sợi.lock. Xem vấn đề sợi liên quan trên github


yarn installcó thể làm thay đổi sợi của bạn một cách bất ngờ , làm cho các khiếu nại về sợi của các bản dựng lặp lại trở nên vô hiệu. Bạn chỉ nên sử dụngyarn install để khởi tạo một sợi.lock và cập nhật nó.

Ngoài ra, đặc biệt. trong các nhóm lớn hơn, bạn có thể có nhiều tiếng ồn xung quanh các thay đổi trong khóa sợi chỉ vì một nhà phát triển đang thiết lập dự án địa phương của họ.

Để biết thêm thông tin, hãy đọc câu trả lời của tôi về gói-lock.json của npm cũng như áp dụng ở đây.


Điều này gần đây cũng đã được làm rõ trong các tài liệu cho cài đặt sợi :

yarn install

Cài đặt tất cả các phụ thuộc được liệt kê trong gói.json trong thư mục node_modules cục bộ.

Các yarn.locktập tin được sử dụng như sau:

  • Nếu có sợi.lock và đủ để đáp ứng tất cả các phụ thuộc được liệt kê trong pack.json, các phiên bản chính xác được ghi trong Sợi.lock được cài đặt và Sợi.lock sẽ không thay đổi. Sợi sẽ không kiểm tra các phiên bản mới hơn.
  • Nếu Sợi.lock vắng mặt hoặc không đủ để đáp ứng tất cả các phụ thuộc được liệt kê trong gói.json (ví dụ: nếu bạn thêm thủ công vào gói.json), Sợi sẽ tìm các phiên bản mới nhất có sẵn đáp ứng các ràng buộc trong gói .json. Các kết quả được ghi vào sợi.lock.

Nếu bạn muốn đảm bảo sợi.lock không được cập nhật, hãy sử dụng --frozen-lockfile.


Mặc dù đúng, lần duy nhất tôi có thể nghĩ rằng bạn sẽ phải sử dụng --frozen-lockfilelà nếu ai đó cập nhật thủ công pack.json mà không chạy sau đó yarn installvà cam kết cập nhật. Vì vậy, một CI có thể muốn sử dụng cờ đó, nhưng các nhà phát triển không nên vì nó che giấu các vấn đề.
jkrehm

@jkrehm Phụ thuộc vào ý của bạn bằng cách ẩn các vấn đề. Tôi gặp nhiều rắc rối hơn với yarn.lockcác tệp bị thay đổi bất ngờ được giới thiệu bởi yarn install, bằng cách làm đầy các yêu cầu kéo hoặc bằng cách gây ra xung đột hợp nhất không cần thiết hoặc bằng cách kéo thư viện bị hỏng. (Chỉ vì thư viện sử dụng semvar, không có nghĩa là bản vá / cập nhật nhỏ sẽ không phá vỡ ứng dụng của bạn - Tôi đã ở đó). Tôi coi việc cập nhật yarn.lockchỉ nên là một bước thủ công, đó là lý do tại sao tôi dựa vào yarn install --frozen-lockfile(và npm civào các dự án npm) ngay cả trên máy dev của tôi vì nó đáng tin cậy và mang tính quyết định.
k0pernikus

1
Tôi chưa bao giờ gặp sự cố với yarn.lockviệc cập nhật bất ngờ (đã được sử dụng kể từ tháng 10 năm 2016 khi nó được phát hành). Đó luôn là người dùng làm một cái gì đó bằng tay hoặc một kịch bản hậu cài đặt tệ hại. Đó là lý do tôi thích Sợi hơn NPM (NPM cập nhật mọi thứ bất kỳ lúc nào nó muốn). Tôi đoán tôi sẽ coi mình là người may mắn khi không gặp phải những vấn đề đó.
jkrehm

5

Từ kinh nghiệm của tôi, tôi sẽ nói có, chúng ta nên cam kết yarn.locktập tin. Nó sẽ đảm bảo rằng, khi những người khác sử dụng dự án của bạn, họ sẽ nhận được các phụ thuộc giống như dự án của bạn dự kiến.

Từ Đốc

Khi bạn chạy thêm sợi hoặc thêm sợi, Sợi sẽ tạo tệp sợi.lock trong thư mục gốc của gói hàng của bạn. Bạn không cần phải đọc hoặc hiểu tệp này - chỉ cần kiểm tra nó trong kiểm soát nguồn. Khi những người khác bắt đầu sử dụng Sợi thay vì npm, tệp Sợi.lock sẽ đảm bảo rằng họ có được các phụ thuộc chính xác như bạn có.

Một lập luận có thể là, chúng ta có thể đạt được nó bằng cách thay thế ^bằng --. Có, chúng tôi có thể, nhưng nói chung, chúng tôi đã thấy rằng phần lớn các npmgói đi kèm với ^ký hiệu và chúng tôi phải thay đổi ký hiệu bằng tay để đảm bảo phiên bản phụ thuộc tĩnh. Nhưng nếu bạn sử dụngyarn.lock nó sẽ lập trình đảm bảo phiên bản chính xác của bạn.

Cũng như Eric Elliott đã nói ở đây

Đừng .gitignore sợi.lock. Nó ở đó để đảm bảo độ phân giải phụ thuộc xác định để tránh các hoạt động trên các lỗi máy của tôi.



3

Đúng! yarn.lockphải được kiểm tra để bất kỳ nhà phát triển nào cài đặt các phụ thuộc đều có cùng một đầu ra! Chẳng hạn, với npm [đã có sẵn vào tháng 10 năm 2016] , bạn có thể patchcài đặt phiên bản (giả sử 1.2.0) cục bộ trong khi nhà phát triển mới chạy bản mới installcó thể có phiên bản khác (1.2.1).


1
Hành vi npm bạn đề cập phụ thuộc vào cách bạn lưu các phụ thuộc của mình. Nếu bạn tiết kiệm --save-exactkhi sử dụng npm, bạn có thể đạt được hành vi tương tự.
AlicanC

4
@AlicanC Tôi không nghĩ nó đơn giản. Tôi tin rằng sợi (thông qua một tệp khóa đã cam kết) sẽ đảm bảo cùng một phiên bản của các gói và tất cả các phụ thuộc của chúng . Đây là điều mà NPM luôn gặp phải vấn đề, bởi vì sự phụ thuộc của một phụ thuộc có thể không được ghim vào một phiên bản cụ thể, do đó, một cài đặt mới có thể kéo theo các phụ thuộc cấp thấp khác nhau. NPM cowrap được cho là để giải quyết vấn đề này ở một mức độ nào đó, nhưng nó luôn luôn khó khăn và thường không hoạt động chính xác.
nextgentech

@nextgentech Nếu trong trường hợp đó, làm thế nào để tôi chắc chắn rằng sự phụ thuộc của sự phụ thuộc được cập nhật đúng. Giả sử nếu tôi có một gói chính có một số gói phụ thuộc (giả sử 3). Tôi sẽ theo dõi các thay đổi trong gói chính của mình và cập nhật nó trong gói.json. Nhưng nếu có bất kỳ gói phụ nào trong số 3 gói được cập nhật bởi họ thì tôi sẽ nhận được những thay đổi như thế nào? Vì tập tin khóa mà những phụ thuộc đó sẽ không được cập nhật phải không?
Pragatheeswaran

Tôi đã không loay hoay với nó rất nhiều, nhưng tôi tin rằng đó là nơi yarn upgradelệnh phát huy tác dụng. Lệnh này sẽ nâng cấp tất cả các gói và tạo lại tệp khóa. Vì vậy, ví dụ, nếu bạn đang triển khai một ứng dụng để sản xuất và cần cài đặt các phụ thuộc thì nó sẽ làm như vậy dựa trên tệp khóa được kéo xuống từ kho lưu trữ. Bạn không bao giờ nên chạy yarn upgradetrừ khi bạn rõ ràng muốn thay đổi thông tin phụ thuộc (và do đó cam kết một tệp khóa mới).
nextgentech

yarn installsẽ không đảm bảo các phiên bản giống nhau. Chỉ yarn install --frozen-lockfilecó.
k0pernikus
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.