Tôi có nên cam kết các tệp thread.lock và package-lock.json không?


118

Chúng tôi đang sử dụng sợi cho tất cả các cài đặt pkg xác định của mình nhưng không ngăn người dùng sử dụng npm - Tuy nhiên, tôi đoán việc có cả hai tệp này sẽ gây ra sự cố. Có nên thêm một cái vào dir .gitignore của bạn không?


Câu trả lời:


148

Luôn cam kết các tệp khóa phụ thuộc nói chung

Như đã đề cập ở phần khác, các tệp khóa phụ thuộc, được hỗ trợ bởi nhiều hệ thống quản lý gói (ví dụ: trình soạn nhạc và trình gói ), nên được cam kết với cơ sở mã trong các dự án cuối chuỗi - để mỗi cá nhân cố gắng chạy dự án đó đang thực hiện vì vậy với chính xác tập hợp các phụ thuộc đã được kiểm tra.

Không rõ ràng là liệu các tệp khóa có nên luôn được cam kết thành các gói được dự định đưa vào các dự án khác hay không (nơi mà các phụ thuộc lỏng lẻo hơn là mong muốn). Tuy nhiên, cả Yarn và NPM (như được đề cập bởi @Cyrille) đều bỏ qua một cách thông minh yarn.lockpackage-lock.jsontương ứng khi cần thiết, giúp an toàn khi luôn cam kết các tệp khóa này.

Vì vậy, bạn nên luôn cam kết ít nhất một trong số yarn.lockhoặcpackage-lock.json tùy thuộc vào trình quản lý gói bạn đang sử dụng.

Bạn có nên cam kết cả fiber.lock và package-lock.json không?

Hiện nay chúng ta có hai hệ thống quản lý gói khác nhau, mà cả hai cài đặt cùng một tập các phụ thuộc từ package.json, nhưng mà tạo ra và đọc từ hai lockfiles khác nhau. NPM 5 tạo ra package-lock.json, trong khi Yarn tạo ra yarn.lock.

Nếu bạn cam kết package-lock.jsonthì bạn đang xây dựng để hỗ trợ những người cài đặt phần phụ thuộc của bạn với NPM 5. Nếu bạn cam kết yarn.lock, bạn đang xây dựng để hỗ trợ những người cài đặt phần phụ thuộc với Yarn.

Việc bạn chọn cam kết yarn.lockhay package-lock.jsoncả hai phụ thuộc vào việc những người đang phát triển dự án của bạn chỉ sử dụng Yarn hoặc NPM 5 hay cả hai. Nếu dự án của bạn là mã nguồn mở, điều thân thiện nhất với cộng đồng cần làm là cam kết cả hai và có một quy trình tự động để đảm bảo yarn.lockpackage-lock.jsonluôn đồng bộ.

Cập nhật: Yarn hiện đã giới thiệu một importlệnh sẽ tạo một yarn.locktệp từ một package-lock.jsontệp. Điều này có thể hữu ích để giữ hai tệp được đồng bộ hóa. (Cảm ơn @weakish)


Các vấn đề này đã được thảo luận rất nhiều về dự án Yarn trong:

Cả hai hiện đã đóng cửa.


1
Câu trả lời chính xác. Tuy nhiên, về quan điểm của bạn: "Điều an toàn nhất cần làm là tạo và cam kết cả hai mỗi khi các phần phụ thuộc của bạn thay đổi." Tôi không chắc tại sao đây sẽ là điều "an toàn nhất" để làm. Như bạn đã đề cập, rất có thể "hai tệp có thể không đồng bộ hóa." Câu trả lời của @ crimbo giải thích vấn đề này chi tiết hơn.
TachyonVortex

Tôi nghĩ rằng đây có thể là một sự khác biệt trong việc bạn có thể kiểm soát tất cả những người điều hành dự án của bạn hay không. Nếu bạn sở hữu đội, chắc chắn, hãy chuẩn hóa Yarn và sử dụng fiber.lock. Nhưng nếu đó là một dự án mã nguồn mở (giống như tất cả dự án của chúng tôi) thì mọi người có thể đang sử dụng NPM trong các dự án của bạn, ngay cả khi bạn sử dụng Yarn trong nội bộ. Vì vậy, điều an toàn lý tưởng nhất cần làm là sử dụng một hệ thống tự động để đảm bảo cả fiber.lock và package-lock.json vẫn đồng bộ. Và cũng gây áp lực để Yarn chuyển sang gói-khóa.json.
Robin Winslow

1
yarn importđã được giới thiệu vào năm 2018. Sợipkg.com/blog/
import

18

Bạn nên cam kết 1 tệp khóa cây phụ thuộc, nhưng bạn không nên cam kết cả hai. Điều này cũng yêu cầu tiêu chuẩn hóa sợi hoặc npm (không phải cả hai) để xây dựng + phát triển dự án.

Đây là bài viết về sợi về lý do nên sử dụng sợi.lock, nếu bạn chuẩn hóa sợi.

Nếu bạn cam kết cả yarn.locktệp và tệp VÀ các package-lock.jsontệp, có rất nhiều cách để 2 tệp có thể cung cấp các cây phụ thuộc khác nhau (ngay cả khi các thuật toán phân giải cây của sợi và npm giống hệt nhau) và việc đảm bảo rằng chúng cung cấp chính xác Cùng một câu trả lời. Vì nó không phải là tầm thường, không có khả năng rằng cây phụ thuộc giống nhau sẽ được duy trì trong cả hai tệp và bạn không muốn hành vi khác nhau tùy thuộc vào việc xây dựng được thực hiện bằng sợi hay npm.

Nếu và khi sợi chuyển từ sử dụng yarn.locksang package-lock.json( vấn đề ở đây ), thì việc lựa chọn tệp khóa để cam kết trở nên dễ dàng và chúng ta không còn phải lo lắng về sợi và npm dẫn đến các bản dựng khác nhau. Dựa trên bài đăng trên blog này , đây là một thay đổi mà chúng ta không nên mong đợi sớm (bài đăng trên blog cũng mô tả sự khác biệt giữa yarn.lockpackage-lock.json.


11

Tôi đã nghĩ về cùng một câu hỏi. Đây là những suy nghĩ của tôi, hy vọng nó sẽ giúp:

Các tài liệu NPM gói-lock.json nói những điều sau đây:

package-lock.json được tạo tự động cho bất kỳ hoạt động nào trong đó npm sửa đổi cây node_modules hoặc package.json. Nó mô tả cây chính xác đã được tạo, sao cho các lần cài đặt tiếp theo có thể tạo ra các cây giống hệt nhau, bất kể cập nhật phụ thuộc trung gian.

Điều này rất tốt vì nó ngăn chặn hiệu ứng "works on my machine".

Nếu không có tệp này, nếu bạn npm install --save A, npm sẽ thêm "A": "^1.2.3"vào của bạn package.json. Khi ai đó khác chạy npm installtrên dự án của bạn, có thể phiên bản 1.2.4của Ađã được phát hành. Vì nó là phiên bản mới nhất có sẵn đáp ứng phạm vi semver được chỉ định trong của bạn package.json, nó sẽ cài đặt phiên bản này. Nhưng nếu có một lỗi mới được giới thiệu trong phiên bản này thì sao? Người này sẽ gặp sự cố mà bạn không thể sao chép vì bạn có phiên bản trước đó, không có bất kỳ lỗi nào.

Bằng cách khắc phục trạng thái node_modulesthư mục của bạn , package-lock.jsontệp ngăn chặn sự cố này vì mọi người sẽ có các phiên bản giống nhau của mọi gói.

Nhưng nếu bạn đang viết và xuất bản một mô-đun npm thì sao? Tài liệu cho biết như sau:

Một chi tiết quan trọng về package-lock.json là nó không thể được xuất bản và nó sẽ bị bỏ qua nếu được tìm thấy ở bất kỳ nơi nào khác ngoài gói toplevel.

Vì vậy, ngay cả khi bạn cam kết, khi người dùng cài đặt mô-đun của bạn, họ sẽ không nhận được package-lock.jsontệp mà chỉ nhận được package.jsontệp. Vì vậy, npm sẽ cài đặt phiên bản mới nhất đáp ứng phạm vi semver của tất cả các phụ thuộc của bạn. Điều đó có nghĩa là bạn luôn muốn kiểm tra mô-đun của mình bằng các luận văn xác minh các phần phụ thuộc của bạn, chứ không phải mô-đun bạn đã cài đặt khi bắt đầu viết mô-đun của mình. Vì vậy, trong trường hợp đó, package-lock.jsonrõ ràng là vô dụng. Hơn nữa, nó có thể gây khó chịu.


7

Đây là quy tắc chung của tôi: nếu bạn đang làm việc trên một ứng dụng, hãy xác nhận (các) tệp khóa. Nếu bạn đang duy trì một thư viện, hãy thêm nó vào danh sách bị bỏ qua của bạn. Dù bằng cách nào, bạn nên sử dụng phạm vi semver chính xác trong package.json. Yehuda Katz (được lưu trong bộ nhớ cache ) đã viết một lời giải thích tuyệt vời về thời điểm nên commit Gemfile.lock(tệp khóa của Ruby) và khi nào thì không. Ít nhất hãy đọc phần tl; dr.


Liên kết bị hỏng.
Juha Syrjälä, 14/07/17

Cảm ơn @ JuhaSyrjälä. Tôi đã thêm một liên kết thứ hai vào bài viết.
ravinggenius,

Danh sách bỏ qua cho npm hoặc sợi ở đâu?
neves

"danh sách bỏ qua" sẽ dành riêng cho kho lưu trữ nguồn của dự án của bạn (git, thương mại, Subversion). Trong trường hợp của git, tệp được gọi .gitignorevà thường nằm ở thư mục gốc của dự án.
ravinggenius

4

Bạn hoàn toàn đúng! Cho phép cả hai npmyarnđược sử dụng sẽ gây ra vấn đề. Hãy xem bài viết này .

Hiện tại, chúng tôi đang có kế hoạch thêm một số cảnh báo cho người dùng sử dụng cả hai yarnnpmtrong cùng một kho lưu trữ để cài đặt các gói.

Chúng tôi thực sự khuyên bạn nên xóa package-lock.jsontệp nếu bạn quyết định sử dụng sợi để tránh nhầm lẫn trong tương lai và các vấn đề về tính nhất quán có thể xảy ra.

Bạn có thể không muốn cả hai npmyarnvới tư cách là người quản lý gói của bạn.


2

Các tệp này được quản lý bởi các công cụ của bạn, vì vậy - giả sử sử dụng sợi sẽ cập nhật hiệu quả package-lock.json–Tôi cho rằng việc cam kết cả hai tệp đều hoạt động tốt.

Tôi nghĩ rằng điều quan trọng nhất đối với người dùng của bạn là package-lock.json(I, ví dụ, không sử dụng sợi) nên cái này được cam kết.

Đối với yarn.lock, nó phụ thuộc vào việc bạn làm việc một mình hay trong một nhóm. Nếu solo, thì tôi cho rằng không cần phải cam kết. Nếu bạn (dự định) làm việc theo nhóm, thì bạn có thể nên cam kết, ít nhất là cho đến khi sợi hỗ trợ nó 🙂

Tôi cho rằng nhóm sợi cuối cùng sẽ ngừng sử dụng yarn.lockvà sử dụng package-json.lockthay thế, lúc này mọi việc sẽ trở nên đơn giản hơn 😛


1
Không ngừng sử dụng fiber.lock.
jayarjo

0

Không, việc sử dụng đồng thời cả hai tệp khóa thường sẽ dẫn đến sự không nhất quán trong cây phụ thuộc của bạn, đặc biệt là khi cộng tác trong một nhóm. Bỏ qua khóa này hay khóa khác là một giải pháp đơn giản. Chỉ cần đảm bảo rằng nhóm của bạn hiểu và đồng ý với thay đổi này.

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.