我对bundler及其生成的文件有点新意。 我有一个来自GitHub的git repo的副本,这是由很多人贡献的,所以我很惊讶地发现bundler创建了一个在repo中不存在且不在.gitignore
列表中的文件。
因为我已经分叉它,我知道将它添加到repo不会破坏主回购的任何东西,但是如果我做一个pull请求,它会导致问题吗?
Gemfile.lock
应该包含在存储库中吗?
#1楼
Bundler文档也解决了这个问题:
原文: http : //gembundler.com/v1.3/rationale.html
编辑: http ://web.archive.org/web/20160309170442/http: //bundler.io/v1.3/rationale.html
请参阅“将代码检入版本控制”一节:
在开发应用程序一段时间后,请检查应用程序以及Gemfile和Gemfile.lock快照。 现在,您的存储库记录了您上次确认应用程序运行时所使用的所有gem的确切版本。 请记住,虽然你的Gemfile只列出了三个宝石(具有不同程度的版本严格性),但是一旦你考虑了你所依赖的宝石的所有隐含要求,你的应用程序就会依赖于几十个宝石。
这很重要:Gemfile.lock使您的应用程序成为您自己的代码和上次运行时运行的第三方代码的单一包,确保一切正常。 在Gemfile中指定您所依赖的第三方代码的确切版本将不会提供相同的保证,因为Gems通常会为其依赖项声明一系列版本。
下次在同一台机器上运行bundle install时,bundler会看到它已经拥有您需要的所有依赖项,并跳过安装过程。
不要检入.bundle目录或其中的任何文件。 这些文件特定于每台特定计算机,用于在bundle install命令的运行之间保留安装选项。
如果您运行了bundle pack,则捆绑包所需的gem(尽管不是git gem)将被下载到vendor / cache中。 如果您需要的所有宝石都存在于该文件夹中并签入源控件,Bundler可以在不连接到Internet(或RubyGems服务器)的情况下运行。 这是一个可选步骤,由于源控件存储库的大小增加,因此不建议这样做。
#2楼
派对有点晚了,但答案仍然花了我时间和外国读书来理解这个问题。 所以我想总结一下我发现的有关Gemfile.lock的内容。
在构建Rails应用程序时,您在本地计算机中使用某些版本的gem。 如果你想避免生产模式和其他分支中的错误,你必须在任何地方使用那个Gemfile.lock文件,并告诉bundler每次更改时bundle
以重建gem。
如果生产机器上的Gemfile.lock
已经改变而且Git不允许你git pull
,你应该写git reset --hard
以避免该文件更改并再次写git pull
。
#3楼
没有Gemfile.lock意味着:
- 新的贡献者无法运行测试,因为奇怪的事情会失败,所以他们不会贡献或失败的PR ...糟糕的第一次体验。
- 你不能回到ax岁的项目并修复一个bug,而不必更新/重写项目,如果你丢失了你的本地Gemfile.lock
- >总是检查Gemfile.lock,如果你想要更加透彻,让travis删除它https://grosser.it/2015/08/14/check-in-your-gemfile-lock/
#4楼
假设您没有编写rubygem,Gemfile.lock应该在您的存储库中。 它用作所有必需宝石及其依赖项的快照。 这样,每次部署时,bundler都不必重新计算所有gem依赖项等。
来自cowboycoded的评论。
如果你正在处理gem,那么不要检查你的Gemfile.lock。
这是一篇很好的文章,解释锁文件是什么。
#5楼
同意r-dub,将其保留在源代码管理中,但对我而言,真正的好处是:
在相同的环境中进行协作 (无视windohs和linux / mac的东西)。 在Gemfile.lock之前,下一个安装项目的人可能会看到各种令人困惑的错误,责备自己,但他只是那个幸运的人获得下一个版本的超级宝石,破坏了现有的依赖关系。
更糟糕的是,这发生在服务器上,获得未经测试的版本,除非遵守纪律并安装确切的版本。 Gemfile.lock使这个显式,它将明确告诉您您的版本是不同的。
注意:记得分组东西,如:开发和:测试
#6楼
当您正在开发需要具有可配置数据库适配器的开源Rails应用程序时,会发生真正的问题。 我正在开发Fat Free CRM的Rails 3分支。 我的偏好是postgres,但我们希望默认数据库是mysql2。
在这种情况下,仍然需要使用默认的gems集签入Gemfile.lock
,但我需要忽略我在计算机上对其所做的更改。 为此,我运行:
git update-index --assume-unchanged Gemfile.lock
并扭转:
git update-index --no-assume-unchanged Gemfile.lock
在Gemfile
包含类似以下代码的内容也很有用。 这将根据您的database.yml加载相应的数据库适配器gem。
# Loads the database adapter gem based on config/database.yml (Default: mysql2)
# -----------------------------------------------------------------------------
db_gems = {"mysql2" => ["mysql2", ">= 0.2.6"],
"postgresql" => ["pg", ">= 0.9.0"],
"sqlite3" => ["sqlite3"]}
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml"))
db = YAML.load_file(db_config)
# Fetch the first configured adapter from config/database.yml
(db["production"] || db["development"] || db["test"])["adapter"]
else
"mysql2"
end
gem *db_gems[adapter]
# -----------------------------------------------------------------------------
我不能说这是否是既定的最佳实践,但对我来说效果很好。
#7楼
我和我的同事有不同的Gemfile.lock,因为我们使用不同的平台,windows和mac,而我们的服务器是linux。
我们决定在repo中删除Gemfile.lock并在git repo中创建Gemfile.lock.server,就像database.yml一样。 然后在将其部署到服务器上之前,我们使用cap deploy hook将Gemfile.lock.server复制到服务器上的Gemfile.lock