我对捆绑器及其生成的文件有点新鲜。我有一份GitHub的git repo副本,许多人都在贡献它,所以我很惊讶地发现bundler创建了一个不存在于repo中但不在.gitignore
列表中的文件。Gemfile.lock应该包含在.gitignore中吗?
由于我已经分叉它,我知道将其添加到回购不会破坏主回购的任何东西,但如果我做了拉请求,会导致问题?
Gemfile.lock
应该包含在存储库中吗?
我对捆绑器及其生成的文件有点新鲜。我有一份GitHub的git repo副本,许多人都在贡献它,所以我很惊讶地发现bundler创建了一个不存在于repo中但不在.gitignore
列表中的文件。Gemfile.lock应该包含在.gitignore中吗?
由于我已经分叉它,我知道将其添加到回购不会破坏主回购的任何东西,但如果我做了拉请求,会导致问题?
Gemfile.lock
应该包含在存储库中吗?
假设你没有编写rubygem,Gemfile.lock应该在你的仓库中。它被用作所有你需要的宝石及其依赖关系的快照。这样bundler不必重新计算每次部署时所有的gem依赖关系,等等。
来自cowboycoded的评论。
如果您正在开发一个gem,那么DO 不要检查您的Gemfile.lock。
下面是一个不错的article解释锁文件是什么。
取决于你在做什么。如果你正在开发一个gem,那么不要检查你的Gemfile.lock。如果您正在使用Rails应用程序,请检查您的Gemfile.lock。更多信息在这里 - http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ – johnmcaliley 2011-02-04 15:22:06
非常好的一点。 – rwilliams 2011-02-04 22:24:12
Thx帮助文章。 – a5his 2011-03-21 04:49:20
与R-DUB达成一致,保持它在源代码控制,但对我来说,真正受益的是这样的:在相同的环境(不考虑windohs和Linux/MAC的东西)
合作。在Gemfile.lock之前,下一个安装该项目的人可能会看到各种令人困惑的错误,并指责自己,但他只是那个幸运的人获得下一版超级宝石,打破现有的依赖关系。
更糟糕的是,这种情况发生在服务器上,除非受到处罚并安装确切的版本,否则会获得未经测试的版本。 Gemfile.lock明确表示,它会明确告诉你,你的版本是不同的。
注:记到的东西,如:开发:测试
,当你在一个开源的Rails应用程序需要具有可配置数据库适配器工作发生真正的问题。我正在开发Fat Free CRM的Rails 3分支。 我的首选是postgres,但我们希望默认数据库是mysql2。
在这种情况下,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]
# -----------------------------------------------------------------------------
我不能说这是否是一个既定的最佳做法,但它对我而言效果不错。
+1感谢您的输入。 – DJTripleThreat 2011-03-19 20:35:26
非常有用的信息...不确定为什么你只有3分,而有用的答案有50分。哦,是的,看看日期戳。 (SO的一个重大失败是在询问问题后很快回答的不成比例的益处)。 – iconoclast 2011-10-01 02:35:47
@iconoclast:我很高兴你发布了你所做的事情。我认为包括我自己在内的很多来这个职位的人都被问题标题“蒙上了一层阴影”。我现在意识到我的答案只是回答一个特定的用例,而不一定是这个问题的正确答案。我会在不久的将来更新它。也就是说,如果OP没有满足他/她的需求,OP应该没有标记我的答案是正确的。 – rwilliams 2012-01-22 09:18:27
我和我的同事有不同的Gemfile。因为我们使用不同的平台,windows和mac,而我们的服务器是linux。
我们决定删除repo中的Gemfile.lock,并在git repo中创建Gemfile.lock.server,就像database.yml一样。然后之前部署在服务器上,我们复制Gemfile.lock.server使用帽钩部署在服务器上Gemfile.lock的
我有一个应用程序,我在OSX中开发,然后必须在Windows服务器上部署。用git跟踪Gemfile.lock被证明是一个坏主意,所以它在我的.gitignore文件中。很多宝石需要不同的版本来适应不同的环境。理想情况下,你应该避免在这种情况下,但我没有选择(该死的你I.T部门!) – brad 2012-02-26 23:05:31
所述捆绑文档解决这个问题还有:
ORIGINAL:http://gembundler.com/v1.3/rationale.html
编辑: http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html
见“检查你的代码版本控制”一节:
制定一个WH您的应用程序后ile,与Gemfile和Gemfile.lock快照一起检入 应用程序。现在, 您的存储库记录了您上一次确定应用程序 工作时使用的所有宝石 的确切版本的记录。请记住,尽管您的Gemfile只列出了三个宝石 (具有不同程度的版本严格性),但您的应用程序依赖于 几十个宝石,一旦考虑了所依赖的宝石的所有隐含需求。
这很重要:Gemfile.lock使您的应用程序包含您自己的代码和第三方代码,它运行的最后一个 时间确保一切正常。指定在您的Gemfile中依赖的第三方代码的确切 版本 不能提供相同的保证,因为宝石通常会为其依赖项声明 版本的版本。
下一次在同一台机器上运行软件包安装时,bundler将 看到它已具有所需的所有依赖关系,并跳过 安装过程。
请勿检入.bundle目录或其中的任何文件。 这些文件是特定于每台特定计算机的,并且用于在软件包安装 命令的运行之间持续执行的安装选项 。
如果您已经运行了捆绑软件包,您的捆绑软件所需的宝石(尽管不是git宝石) 将被下载到供应商/缓存中。 Bundler 可以在没有连接到互联网(或RubyGems服务器)的情况下运行,如果 您需要的所有宝石都存在于该文件夹中并签入到 您的源代码管理。这是一个可选步骤,不建议使用,因为您的源代码控制库的大小增加了,因此不建议使用 。
很好的解释,谢谢。 – akostadinov 2014-03-11 14:20:45
晚会有点迟,但答案仍然花了我时间和外国读取,以了解这个问题。所以我想总结一下我对Gemfile.lock的了解。
当您构建Rails应用程序时,您正在本地机器中使用特定版本的gem。如果您想避免生产模式和其他分支出现错误,那么您必须随处使用一个Gemfile.lock文件,并告诉bundler到bundle
,以便在每次更改时重新构建宝石。
如果Gemfile.lock
已经改变了您的生产机器和Git不会让你git pull
,你应该写git reset --hard
,以避免文件的更改和重新写入git pull
。
如果文件自动更改,例如通过构建过程,这是一个明确的信号,它不应该添加到版本控制中。 – 2017-11-03 08:58:21
没有Gemfile.lock的意思是:因为奇怪的事情失败
- >经常检查Gemfile.lock的,让特拉维斯删除它如果你想要更加彻底https://grosser.it/2015/08/14/check-in-your-gemfile-lock/
相关:http://stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows – ripper234 2012-12-25 22:56:12
如果你发现你的因为你的Linux和Windows机器共享相同的回购,请参阅Joe Yang的回答。在我写这篇文章的时候,它排名第三。另请参阅http://stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows – 2013-10-10 19:11:52