Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Gemfile.lock是否应包含在.gitignore中?_Ruby_Git_Version Control_Bundler_Gemfile - Fatal编程技术网

Ruby Gemfile.lock是否应包含在.gitignore中?

Ruby Gemfile.lock是否应包含在.gitignore中?,ruby,git,version-control,bundler,gemfile,Ruby,Git,Version Control,Bundler,Gemfile,我对bundler及其生成的文件有点陌生。我有一份来自GitHub的git repo的副本,许多人都在为它捐款,因此我惊讶地发现bundler创建了一个文件,该文件在repo中不存在,也不在.gitignore列表中 因为我已经分叉了它,我知道将它添加到回购协议中不会破坏主回购协议的任何内容,但是如果我执行拉取请求,它会导致问题吗 是否应该将Gemfile.lock包含在存储库中?假设您没有编写rubygem,Gemfile.lock应该包含在存储库中。它被用作所有必需gem及其依赖项的快照。这

我对bundler及其生成的文件有点陌生。我有一份来自GitHub的git repo的副本,许多人都在为它捐款,因此我惊讶地发现bundler创建了一个文件,该文件在repo中不存在,也不在
.gitignore
列表中

因为我已经分叉了它,我知道将它添加到回购协议中不会破坏主回购协议的任何内容,但是如果我执行拉取请求,它会导致问题吗


是否应该将
Gemfile.lock
包含在存储库中?

假设您没有编写rubygem,Gemfile.lock应该包含在存储库中。它被用作所有必需gem及其依赖项的快照。这样,bundler就不必在每次部署时重新计算所有gem依赖项,等等

牛仔的评论如下:

如果您正在处理gem,则不要签入Gemfile.lock。如果您正在使用Rails应用程序,请签入Gemfile.lock


这里有一个很好的解释锁定文件是什么。

同意r-dub,将其保留在源代码管理中,但对我来说,真正的好处是:

在相同的环境中协作(不考虑windohs和linux/mac的内容)。在Gemfile.lock之前,下一个安装该项目的人可能会看到各种令人困惑的错误,并责怪自己,但他只是那个幸运的家伙,获得了下一个版本的超级宝石,打破了现有的依赖关系

更糟糕的是,这种情况发生在服务器上,得到的是未经测试的版本,除非严格要求并安装确切的版本。Gemfile.lock使这一点显式化,它将显式地告诉您,您的版本是不同的


注意:请记住将内容分组,例如:开发和:测试。当您在开发一个需要配置数据库适配器的开源Rails应用程序时,真正的问题就会发生。我正在开发无脂CRM的Rails 3分支。 我的首选是postgres,但我们希望默认数据库是mysql2

在这种情况下,
Gemfile.lock
仍然需要使用默认的gem集签入,但我需要忽略我在计算机上对它所做的更改。为了实现这一点,我运行:

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]
# -----------------------------------------------------------------------------

我不能说这是否是一个既定的最佳实践,但它对我来说效果很好。

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


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

Bundler文档也解决了这个问题:

原件:

编辑:

请参阅“将代码检入版本控制”一节:

开发应用程序一段时间后,请签入 应用程序以及Gemfile和Gemfile.lock快照。现在, 您的存储库记录了所有gem的确切版本 您上次确定应用程序 工作。请记住,虽然您的Gemfile只列出了三个gem (版本严格程度不同),您的应用程序取决于 在几十颗宝石上,一旦你考虑到所有的 您所依赖的gems的隐含要求

这一点很重要:Gemfile.lock使您的应用程序成为单个 包含您自己的代码和上次运行的第三方代码的包 是时候让你确定一切都正常了。指定精确的 您在GEM文件中依赖的第三方代码的版本将 不提供相同的保证,因为gems通常声明一个范围 其依赖项的版本

下次在同一台计算机上运行bundle安装时,bundler将 请确保它已经具有所需的所有依赖项,并跳过 安装过程

不要签入.bundle目录或其中的任何文件。 这些文件是特定于每台特定机器的,用于 在包安装的运行之间保留安装选项 指挥部

如果您运行了bundlepack,gems(尽管不是git gems) 捆绑包所需的数据将下载到供应商/缓存中。捆扎机 可以在不连接到internet(或RubyGems服务器)的情况下运行 您需要的所有宝石都存在于该文件夹中并已签入 您的源代码管理。这是一个可选步骤,不推荐使用, 由于源代码管理存储库的大小增加


参加聚会有点晚了,但我还是花了时间和外国读物来理解这个问题。所以我想总结一下我对Gemfile.lock的了解

当您构建Rails应用程序时,您正在本地计算机中使用特定版本的gems。如果您想避免在生产模式和其他分支中出现错误,则必须在任何地方使用一个Gemfile.lock文件,并在每次gems发生更改时告诉bundler进行
bundle
以重新生成gems

如果生产机器上的
Gemfile.lock
已更改,并且Git不允许您
Git pull
,则应编写
Git reset--hard
以避免文件更改,并再次写入
Git pull

  • 新的贡献者无法运行测试,因为奇怪的事情失败了,所以他们不会贡献或得到失败的PRs。。。糟糕的第一次经历
  • 如果丢失了本地Gemfile.lock,则不必更新/重写项目,就无法返回到有x年历史的项目并修复错误

->始终签入Gemfile.lock,如果您想更彻底,请让travis将其删除

这里的其他答案是正确的:是的,您的Ruby应用程序(不是yo