Hiểu tệp Gemfile.lock


181

Sau khi chạy bundle installlệnh, 'Gemfile.lock ' được tạo trong thư mục làm việc. Các chỉ thị bên trong tập tin đó có ý nghĩa gì?

Ví dụ: hãy lấy tệp sau:

PATH
  remote: .
  specs:
    gem_one (0.0.1)

GEM
  remote: http://example.org/
  specs:
    gem_two (0.0.2)
    gem_three (0.0.3)
      gem_four (0.0.4)

PLATFORMS
  platform

DEPENDENCIES
  gem_two
  gem_one!

' PATH ', ' GEM ', ' PLATFORMS ' và ' DEPENDENCIES ' mô tả điều gì? Có phải tất cả chúng đều được yêu cầu?

Điều gì nên chứa các chỉ thị con ' từ xa ' và ' thông số kỹ thuật '?

Dấu chấm than sau tên đá quý trong nhóm ' DEPENDENCIES ' có nghĩa là gì?

Câu trả lời:


71

Bạn có thể tìm hiểu thêm về nó trong trang web của trình đóng gói (nhấn mạnh thêm vào bên dưới để thuận tiện cho bạn):

Sau khi phát triển ứng dụng của bạn một lúc, hãy kiểm tra ứng dụng cùng với ảnh chụp nhanh GemfileGemfile.lock . Bây giờ, kho lưu trữ của bạn có bản ghi các phiên bản chính xác của tất cả các loại đá quý mà bạn đã sử dụng lần cuối cùng mà bạn biết chắc chắn rằng ứng dụng đã hoạt động ...

Điều này rất quan trọng: Gemfile.lock làm cho ứng dụng của bạn trở thành một gói duy nhất gồm cả mã của riêng bạn và mã của bên thứ ba mà nó đã chạy lần cuối cùng bạn biết chắc chắn rằng mọi thứ đều hoạt động. Việc chỉ định các phiên bản chính xác của mã bên thứ ba mà bạn phụ thuộc trong Gemfile của bạn sẽ không cung cấp cùng một sự đảm bảo, vì đá quý thường khai báo một loạt các phiên bản cho các phụ thuộc của chúng.


65
Điều này không trả lời bất kỳ câu hỏi nào của anh ấy, anh ấy hỏi về định dạng của Gemfile.lock, nhưng điều này chỉ mô tả những gì nó làm.
Joshua Cheek

38

liên quan đến dấu chấm than tôi mới phát hiện ra nó trên đá quý được tìm nạp qua :git, vd

gem "foo", :git => "git@github.com:company/foo.git"

Wow, công việc tốt đẹp đã tìm ra điều đó, tôi cũng đã tự hỏi điều này. Cảm ơn.
JP Silvashy

5
Nó cũng xảy ra khi tải đá quý địa phương thông qua pathtùy chọn. Tôi đoán nó có liên quan đến việc tải một viên ngọc không được biên dịch?
zykadelic

Vâng, đây là một lý do. Nhưng đây KHÔNG phải là lý do duy nhất để một viên đá quý được đánh dấu bằng dấu chấm than. Tôi hiện đang thấy bất kỳ viên ngọc nào được khai báo bên trong khối nguồn là được đánh dấu bằng dấu chấm than.
Sean Moubry

35

Tôi đã dành vài tháng qua để tìm hiểu về Gemfiles và Gemfile.locks rất nhiều trong khi xây dựng một công cụ cập nhật phụ thuộc tự động 1 . Dưới đây là không rõ ràng, nhưng đó là một điểm khởi đầu tốt để hiểu định dạng Gemfile.lock. Bạn cũng có thể muốn kiểm tra mã nguồn cho trình phân tích cú pháp khóa của Bundler .

Bạn sẽ tìm thấy các tiêu đề sau trong tệp khóa được tạo bởi Bundler 1.x:

GEM (tùy chọn nhưng rất phổ biến)

Đây là những phụ thuộc có nguồn gốc từ một máy chủ Rubygems. Đó có thể là chỉ mục chính của Rubygems, tại Rubygems.org hoặc nó có thể là một chỉ mục tùy chỉnh, chẳng hạn như chỉ số có sẵn từ Gemfury và những người khác. Trong phần này, bạn sẽ thấy:

  • remote: một hoặc nhiều dòng chỉ định vị trí của chỉ số Rubygems
  • specs: một danh sách các phụ thuộc, với số phiên bản của chúng và các ràng buộc đối với bất kỳ phụ thuộc nào

GIT (tùy chọn)

Đây là những phụ thuộc có nguồn gốc từ một git từ xa nhất định. Bạn sẽ thấy một trong những phần khác nhau cho mỗi điều khiển từ xa và trong mỗi phần bạn sẽ thấy:

  • remote:cái git từ xa. Ví dụ,git@github.com:rails/rails
  • revision: tham chiếu cam kết Gemfile.lock bị khóa
  • tag: (tùy chọn) thẻ được chỉ định trong Gemfile
  • specs: sự phụ thuộc git được tìm thấy ở điều khiển từ xa này, với số phiên bản của nó và các ràng buộc đối với bất kỳ phụ thuộc nào

ĐƯỜNG (tùy chọn)

Đây là những phụ thuộc có nguồn gốc từ một thứ nhất định path, được cung cấp trong Gemfile. Bạn sẽ thấy một trong những phần khác nhau cho từng phụ thuộc đường dẫn và trong mỗi phần bạn sẽ thấy:

  • remote:con đường. Ví dụ,plugins/vendored-dependency
  • specs: sự phụ thuộc git được tìm thấy ở điều khiển từ xa này, với số phiên bản của nó và các ràng buộc đối với bất kỳ phụ thuộc nào

NỀN TẢNG

Nền tảng Ruby mà Gemfile.lock được tạo ra để chống lại. Nếu bất kỳ phụ thuộc nào trong Gemfile chỉ định một nền tảng thì chúng sẽ chỉ được bao gồm trong Gemfile.lock khi lockfile được tạo trên nền tảng đó (ví dụ: thông qua cài đặt).

Phụ tùng

Một danh sách các phụ thuộc được chỉ định trong Gemfile, cùng với các ràng buộc phiên bản được chỉ định ở đó.

Các phụ thuộc được chỉ định với một nguồn không phải là chỉ số chính của Rubygems (ví dụ: phụ thuộc git, dựa trên đường dẫn, phụ thuộc) có !nghĩa là chúng được "ghim" vào nguồn 2 đó (mặc dù đôi khi người ta phải nhìn vào Gemfile để xác định).

PHIÊN BẢN RUBY (tùy chọn)

Phiên bản Ruby được chỉ định trong Gemfile, khi Gemfile.lock này được tạo. Nếu một phiên bản Ruby được chỉ định trong một .ruby_versiontệp thay vì phần này sẽ không có mặt (vì Bundler sẽ xem xét bất khả tri của Gemfile / Gemfile.lock đối với phiên bản Ruby của trình cài đặt).

BUNDLED VỚI (Bundler> = v1.10.x)

Phiên bản Bundler được sử dụng để tạo Gemfile.lock. Được sử dụng để nhắc nhở các trình cài đặt cập nhật phiên bản Bundler của họ, nếu phiên bản cũ hơn phiên bản đã tạo tệp.

NGUỒN PLUGIN (tùy chọn và rất hiếm)

Về lý thuyết, Gemfile có thể chỉ định các plugin Bundler, cũng như gem 3 , sau đó sẽ được liệt kê ở đây. Trong thực tế, tôi không biết về bất kỳ plugin nào có sẵn, kể từ tháng 7 năm 2017. Phần này của Bundler vẫn đang được phát triển tích cực!


  1. https://dependabot.com
  2. https://github.com/bundler/bundler/issues/4631
  3. http://andre.arko.net/2012/07/23/towards-a-bundler-plugin-system/

2
dường như là câu trả lời hay nhất
daslicious

9

Bundler là người quản lý Gem cung cấp môi trường nhất quán cho các dự án Ruby bằng cách theo dõi và cài đặt các phiên bản và đá quý chính xác cần thiết.

Gemfile và Gemfile.lock là những sản phẩm chính được đưa ra bởi đá quý Bundler (bản thân Bundler là một loại đá quý).

Gemfile chứa sự phụ thuộc dự án của bạn vào (các) đá quý, mà bạn đã đề cập thủ công với (các) phiên bản được chỉ định, nhưng các loại đá quý này phụ thuộc vào (các) đá quý khác được giải quyết tự động bởi bộ đóng gói.

Gemfile.lock chứa ảnh chụp nhanh hoàn chỉnh của tất cả các viên đá quý trong Gemfile cùng với sự phụ thuộc liên quan.

Khi bạn gọi cài đặt gói đầu tiên , nó sẽ tạo Gemfile.lock này và sử dụng tệp này trong tất cả các lệnh gọi tiếp theo để cài đặt gói, đảm bảo rằng bạn đã cài đặt tất cả các phụ thuộc và sẽ bỏ qua cài đặt phụ thuộc.

Điều tương tự xảy ra khi bạn chia sẻ mã của mình với các máy khác nhau

Bạn chia sẻ Gemfile.lock cùng với Gemfile, khi bạn chạy cài đặt gói trên máy khác, nó sẽ tham chiếu đến Gemfile.lock của bạn và bỏ qua bước giải quyết phụ thuộc, thay vào đó, nó sẽ cài đặt tất cả các gem phụ thuộc tương tự mà bạn đã sử dụng trên máy nguyên bản, duy trì tính nhất quán trên nhiều máy

Tại sao chúng ta cần duy trì tính nhất quán dọc theo nhiều máy?

  • Chạy các phiên bản khác nhau trên các máy khác nhau có thể dẫn đến mã bị hỏng

  • Giả sử, ứng dụng của bạn đã sử dụng phiên bản 1.5.3 và nó hoạt động cách đây 14 tháng
    mà không gặp vấn đề gì và bạn cố gắng cài đặt trên máy khác
    mà không có Gemfile.lock bây giờ bạn đã có phiên bản 1.5.8. Có thể nó bị hỏng với phiên bản mới nhất của một số đá quý và ứng dụng của bạn sẽ
    thất bại. Duy trì tính nhất quán là vô cùng quan trọng (
    thực hành ưa thích ).

Cũng có thể cập nhật (các) đá quý trong Gemfile.lock bằng cách sử dụng cập nhật gói .

Điều này dựa trên khái niệm cập nhật bảo thủ


8

Theo tôi, PATH liệt kê các phụ thuộc thế hệ thứ nhất trực tiếp từ gempec của bạn, trong khi GEM liệt kê các phụ thuộc thế hệ thứ hai (nghĩa là phụ thuộc của bạn phụ thuộc vào) và các phụ thuộc từ Gemfile của bạn. PATH :: remote là .vì nó dựa vào một gempec cục bộ trong thư mục hiện tại để tìm hiểu những gì thuộc về PATH :: spec, trong khi GEM :: remote là rubygems.org, vì đó là nơi nó phải đi để tìm hiểu những gì thuộc về GEM :: thông số kỹ thuật

Trong plugin Rails, bạn sẽ thấy phần PATH, nhưng không có trong ứng dụng Rails. Vì ứng dụng không có tệp Gempec, nên sẽ không có gì để đưa vào PATH.

Đối với ĐẠI DIỆN , gembundler.com tuyên bố:

Runtime dependencies in your gemspec are treated like base dependencies, 
and development dependencies are added by default to the group, :development

Gemfile được tạo bằng cách rails plugin new my_pluginnói điều gì đó tương tự:

# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.

Điều này có nghĩa là sự khác biệt giữa

s.add_development_dependency "july" # (1)

s.add_dependency "july" # (2)

là (1) sẽ chỉ bao gồm "tháng bảy" trong Gemfile.lock (và do đó trong ứng dụng) trong môi trường phát triển. Vì vậy, khi bạn chạy bundle install, bạn sẽ thấy "tháng bảy" không chỉ dưới PATH mà còn dưới ĐỐI TƯỢNG, mà chỉ trong quá trình phát triển. Trong sản xuất, nó sẽ không có ở đó. Tuy nhiên, khi bạn sử dụng (2), bạn sẽ chỉ thấy "tháng bảy" trong PATH, không phải trong PHỤ THUỘC, nhưng nó sẽ hiển thị khi bạn bundle installtừ một môi trường sản xuất (nghĩa là trong một số đá quý khác bao gồm bạn là phụ thuộc), không phải Chỉ phát triển.

Đây chỉ là những quan sát của tôi và tôi không thể giải thích đầy đủ lý do tại sao bất kỳ điều này là như vậy nhưng tôi hoan nghênh ý kiến ​​thêm.


3

Dường như không có tài liệu rõ ràng nói về Gemfile.lockđịnh dạng. Có lẽ đó là vì Gemfile.lockchỉ được sử dụng bởi gói nội bộ.

Tuy nhiên, vì Gemfile.locklà một ảnh chụp nhanh Gemfile, có nghĩa là tất cả thông tin của nó phải đến từ Gemfile(hoặc từ giá trị mặc định nếu không được chỉ định trong Gemfile).

Đối với GEM, nó liệt kê tất cả các phụ thuộc mà bạn giới thiệu trực tiếp hoặc gián tiếp trong Gemfile. remotebên dưới GEMcho biết nơi để lấy đá quý, được chỉ định bởi nguồn trong Gemfile.

Nếu một viên ngọc không được tìm nạp từ remote, hãy PATHnói vị trí để tìm nó. PATH's thông tin xuất phát từ con đường trong Gemfilekhi bạn khai báo một sự phụ thuộc.

PLATFORMlà từ đây .

Đối với DEPENDENCIES, đó là ảnh chụp nhanh các phụ thuộc được giải quyết bằng gói.


0

Dấu chấm than sau tên đá quý trong nhóm 'DEPENDECIES' có nghĩa là gì?

Dấu chấm than xuất hiện khi đá quý được cài đặt bằng cách sử dụng một nguồn khác ngoài " https://rubygems.org ".

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.