我是 Ruby on Rails 的初学者,我正在使用 Rails 3.0.9。
Gemfile
Rails和Rails有什么区别Gemfile.lock
?
我是 Ruby on Rails 的初学者,我正在使用 Rails 3.0.9。
Gemfile
Rails和Rails有什么区别Gemfile.lock
?
您可以在此处指定要使用的Gemfile
gem,并允许您指定哪些版本。
该Gemfile.lock
文件是 Bundler 记录已安装的确切版本的位置。这样,当在另一台机器上加载相同的库/项目时,运行bundle install
将查看Gemfile.lock
并安装完全相同的版本,而不仅仅是使用Gemfile
并安装最新版本。(在不同的机器上运行不同的版本可能会导致测试中断等)你不应该直接编辑锁定文件。
查看Bundler 的目的和基本原理,特别是 Checking Your Code into Version Control 部分。
通常我们在 Gemfile 中写依赖为:
gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..
在这里,您基本上会说:“我想要 nokogiri,只要它大于 1.4.4 版本”等等。现在假设我已经在Gemfile
8 个月前设置了我的应用程序,并且我成功地根据这个要求设置了我的应用程序。8 个月前 nokogiri 版本是1.4.4。我的 Rails 应用程序运行完美,这个版本没有任何问题。
现在想我正在尝试使用相同的Gemfile
. 但是,如果我们查看nokogiri 版本,我们会发现当前的稳定版本已更改为1.4.9。这意味着如果我们尝试构建,bundler 将安装nokogiri 的1.4.9版本(假设我们没有Gemfile.lock
)。
如您所见,如果没有Gemfile.lock
并运行:
bundle install
那么当前使用的宝石可以随时不同。您的应用使用了1.4.4版本,并且在8 个月前可以正常运行,但如果您现在尝试构建它,您将获得1.4.9版本。也许它被最新版本破坏了,你在1.4.4nokogiri
中使用的很棒的功能不再可用,等等。
为了防止这种问题Gemfile.lock
被使用。仅编写Gemfile.lock
了确切的版本,因此只会安装这些版本。这意味着如果您使用 . 分发您的应用程序Gemfile.lock
,每台机器都将安装相同的 gem,最重要的是它们都将获得相同的版本。这将为您提供稳定且通用的部署堆栈。
它是使用第一个自动创建的:
bundle install
命令。之后每次运行bundle install
时,bundle 都会首先查找Gemfile.lock
并安装那里指定的 gem。在您的项目中分发此文件以提供一致和稳定性是一种习惯。
如果您对应用程序的最新版本感到满意,则可以进行更新Gemfile.lock
。只需将您的更改反映到Gemfile
. 这意味着将依赖项更改为Gemfile
. 之后运行:
bundle install
这将为您更新Gemfile.lock
最新版本的应用程序。
Gemfile.lock
当您运行 bundle install 时,Bundler 会将您使用的所有 gem 的全名和版本(包括 Gemfile(5) 中指定的 gem 的依赖项)保存到一个名为 Gemfile.lock 的文件中。
Bundler 在对 bundle install 的所有后续调用中都使用此文件,这可以保证您始终使用完全相同的代码,即使您的应用程序跨机器移动也是如此。
由于依赖解析的工作方式,即使是看似很小的更改(例如,更新 Gemfile(5) 中 gem 的依赖的点发布)都可能导致需要完全不同的 gem 来满足所有依赖。
因此,您应该检查您的 Gemfile.lock 到版本控制。如果您不这样做,每台检出您的存储库(包括您的生产服务器)的机器将再次解析所有依赖项,这将导致使用不同版本的第三方代码,如果 Gemfile(5) 中的任何 gem 或任何它们的依赖项已更新。