2010-11-11 109 views
430

我对捆绑器及其生成的文件有点新鲜。我有一份GitHub的git repo副本,许多人都在贡献它,所以我很惊讶地发现bundler创建了一个不存在于repo中但不在.gitignore列表中的文件。Gemfile.lock应该包含在.gitignore中吗?

由于我已经分叉它,我知道将其添加到回购不会破坏主回购的任何东西,但如果我做了拉请求,会导致问题?

Gemfile.lock应该包含在存储库中吗?

+0

相关:http://stackoverflow.com/questions/14034561/should-gemfile-lock-be-committed-to-source-control-on-windows – ripper234 2012-12-25 22:56:12

+2

如果你发现你的因为你的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

回答

476

假设你没有编写rubygem,Gemfile.lock应该在你的仓库中。它被用作所有你需要的宝石及其依赖关系的快照。这样bundler不必重新计算每次部署时所有的gem依赖关系,等等。

来自cowboycoded的评论。

如果您正在开发一个gem,那么DO 不要检查您的Gemfile.lock。

下面是一个不错的article解释锁文件是什么。

+78

取决于你在做什么。如果你正在开发一个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

+0

非常好的一点。 – rwilliams 2011-02-04 22:24:12

+0

Thx帮助文章。 – a5his 2011-03-21 04:49:20

11

与R-DUB达成一致,保持它在源代码控制,但对我来说,真正受益的是这样的:在相同的环境(不考虑windohs和Linux/MAC的东西)

合作。在Gemfile.lock之前,下一个安装该项目的人可能会看到各种令人困惑的错误,并指责自己,但他只是那个幸运的人获得下一版超级宝石,打破现有的依赖关系。

更糟糕的是,这种情况发生在服务器上,除非受到处罚并安装确切的版本,否则会获得未经测试的版本。 Gemfile.lock明确表示,它会明确告诉你,你的版本是不同的。

注:记到的东西,如:开发:测试

46

,当你在一个开源的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

+1感谢您的输入。 – DJTripleThreat 2011-03-19 20:35:26

+2

非常有用的信息...不确定为什么你只有3分,而有用的答案有50分。哦,是的,看看日期戳。 (SO的一个重大失败是在询问问题后很快回答的不成比例的益处)。 – iconoclast 2011-10-01 02:35:47

+1

@iconoclast:我很高兴你发布了你所做的事情。我认为包括我自己在内的很多来这个职位的人都被问题标题“蒙上了一层阴影”。我现在意识到我的答案只是回答一个特定的用例,而不一定是这个问题的正确答案。我会在不久的将来更新它。也就是说,如果OP没有满足他/她的需求,OP应该没有标记我的答案是正确的。 – rwilliams 2012-01-22 09:18:27

31

我和我的同事有不同的Gemfile。因为我们使用不同的平台,windows和mac,而我们的服务器是linux。

我们决定删除repo中的Gemfile.lock,并在git repo中创建Gemfile.lock.server,就像database.yml一样。然后之前部署在服务器上,我们复制Gemfile.lock.server使用帽钩部署在服务器上Gemfile.lock的

+5

我有一个应用程序,我在OSX中开发,然后必须在Windows服务器上部署。用git跟踪Gemfile.lock被证明是一个坏主意,所以它在我的.gitignore文件中。很多宝石需要不同的版本来适应不同的环境。理想情况下,你应该避免在这种情况下,但我没有选择(该死的你I.T部门!) – brad 2012-02-26 23:05:31

9

所述捆绑文档解决这个问题还有:

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服务器)的情况下运行,如果 您需要的所有宝石都存在于该文件夹中并签入到 您的源代码管理。这是一个可选步骤,不建议使用,因为您的源代码控制库的大小增加了,因此不建议使用 。

+0

很好的解释,谢谢。 – akostadinov 2014-03-11 14:20:45

3

晚会有点迟,但答案仍然花了我时间和外国读取,以了解这个问题。所以我想总结一下我对Gemfile.lock的了解。

当您构建Rails应用程序时,您正在本地机器中使用特定版本的gem。如果您想避免生产模式和其他分支出现错误,那么您必须随处使用一个Gemfile.lock文件,并告诉bundler到bundle,以便在每次更改时重新构建宝石。

如果Gemfile.lock已经改变了您的生产机器和Git不会让你git pull,你应该写git reset --hard,以避免文件的更改和重新写入git pull

+0

如果文件自动更改,例如通过构建过程,这是一个明确的信号,它不应该添加到版本控制中。 – 2017-11-03 08:58:21

3

没有Gemfile.lock的意思是:因为奇怪的事情失败

  • 新的贡献者无法运行测试,所以他们不会贡献或取得永久居民失败...坏第一次经历。
  • 你不能回去斧头岁的项目和修复bug,而不必更新/重写项目,如果你失去了你的本地Gemfile.lock的

- >经常检查Gemfile.lock的,让特拉维斯删除它如果你想要更加彻底https://grosser.it/2015/08/14/check-in-your-gemfile-lock/

相关问题