Ruby on Rails中的Gemfile和Gemfile.lock有什么区别?
我是Ruby on Rails的初学者,我正在使用Rails 3.0.9。
Rails中Gemfile
和Gemfile.lock
什么区别?
Gemfile
是您指定要使用的gem的地方,并且可以指定哪些版本。
Gemfile.lock
文件是Bundlerlogging安装的确切版本的位置。 这样,当在另一台机器上加载相同的库/项目时,运行bundle install
将查看Gemfile.lock
并安装完全相同的版本,而不仅仅是使用Gemfile
并安装最新版本。 (在不同的机器上运行不同的版本可能会导致testing失败等)您不应该直接编辑locking文件。
检查Bundler的目的和理由 ,特别是检查您的代码到版本控制部分。
通常我们在Gemfile中编写依赖关系:
gem "nokogiri", "~> 1.4.4" gem 'bcrypt-ruby', '~> 3.0.0' gem 'uglifier', '>= 1.2.3' ..
在这里你基本上说:“ 我只要nokogiri大于版本1.4.4 ”等。现在假设我已经在8个月前build立了我的Gemfile
,并且成功地设置了我的应用程序。 8个月前nokogiri版本是1.4.4 。 我的Rails应用程序运行完美,没有任何问题,这个版本。
现在想想我正在尝试使用相同的Gemfile
来构build。 但是如果我们看看nokogiri版本,我们会看到当前的稳定版本已经变成了1.4.9 。 这意味着如果我们尝试构build,bundler将安装nokogiri 1.4.9版(假设我们没有Gemfile.lock
)。
这是什么意思 ?
如您所见,如果您没有任何Gemfile.lock
并运行:
bundle install
那么当前使用的gem可以随时不同 。 你的应用程序使用1.4.4版本, 8个月前没有任何问题,但如果你现在试图build立它,你会得到版本1.4.9 。 也许这是与最新版本的nokogiri
,你使用1.4.4的真棒function是不可用的,等等。
为了防止使用Gemfile.lock
这种问题。 在Gemfile.lock
只会写入确切的版本 ,因此只会安装这些版本。 这意味着,如果您使用Gemfile.lock
分发应用程序,则每台计算机都将安装相同的Gemfile.lock
,并且最重要的是它们将获得相同的版本 。 这会给你一个稳定而通用的部署堆栈。
Gemfile.lock是如何创build的?
它是自动创build的第一个:
bundle install
命令。 之后,每次运行bundle install
,软件包将首先查找Gemfile.lock
并安装指定的gem。 将这个文件分发到您的项目中是一种习惯,以保持一致性和稳定性。
如何更新Gemfile.lock?
如果您对最新版本的应用感到满意,则可以更新Gemfile.lock
。 只是反映你对Gemfile
的改变。 这意味着将相关性更改为Gemfile
新的精确版本。 之后运行:
bundle install
这将更新您的Gemfile.lock
与您的最新版本的应用程序。
Gemfile.lock
当你运行bundle安装时,Bundler会将你使用的所有gem的完整名称和版本(包括Gemfile(5)中指定的gem的依赖关系)保存到名为Gemfile.lock的文件中。
Bundler在随后的所有调用中使用此文件来捆绑安装,这可以保证您始终使用相同的代码,即使您的应用程序跨机器移动。
由于依赖parsing的方式起作用,即使是一个看起来很小的变化(例如,在Gemfile(5)中更新一个gem依赖关系的释放点)也可能导致完全不同的gem需要满足所有依赖关系。
因此,你应该检查你的Gemfile.lock版本控制。 如果你不这样做,那么检查你的版本库(包括你的生产服务器)的每台机器将再次parsing所有的依赖关系,这将导致不同版本的第三方代码被使用,如果Gemfile(5)他们的依赖关系已被更新。