供应商/捆绑的目的是什么? Heroku告诉我要删除它

在向Heroku推送一些更改后,我注意到有关vendor/bundle 警告 (请参阅下面的警告 )。

如果根据警告它应该从Git跟踪中“删除”,这个目录的目的是什么?

为什么vendor/bundle没有自动.gitignore默认为Rails?

我应该运行bundle pack吗? (它实际上是bundle package ??)

bundle pack的优缺点是什么(相对于developmentproduction )?

为了让这更令人困惑,Ryan McGeary的热门博客post名为“Vendor Everything”,仍然适用于运行bundle install --path vendorecho 'vendor/ruby' >> .gitignore和包装gem通过运行bundle package vendor/cache 。 任何与我的其他关注相关的光线都将不胜感激。

谢谢。

 -bash> git push production master ... -----> Heroku receiving push -----> Ruby/Rails app detected -----> WARNING: Removing `vendor/bundle`. Checking in `vendor/bundle` is not supported. Please remove this directory and add it to your .gitignore. To vendor your gems with Bundler, use `bundle pack` instead. -----> Installing dependencies using Bundler version 1.2.1 Running: bundle install --without development:test --path vendor/bundle --binstubs bin/ --deployment Using rake (0.9.2.2) Using i18n (0.6.0) ... 

如果您的项目中有vendor/bundle目录,那么在某些时候您必须使用--path vendor/bundle参数运行bundle命令 。 这会将所有项目的gem(在Gemfile列出)的文件加载到本地项目的vendor/bundle目录中,而不是Gemfile到系统gem位置。 您可以这样做以将项目的gem与任何其他项目完全隔离。

Bundler擅长解决所有依赖关系,所以没有必要使用--path但有些人选择这样做,因为他们希望保持他们的gem与他们的项目分开和组织。 这也意味着本地计算机上的bundler设置方式与Heroku使用bundler的方式相同。

使用此选项,每次运行bundle命令时,仍然会从rubygems服务器下载所有gem。

bundle package更进一步,实际上从rubygems下载原始gem文件并将它们缓存到vendor/cache目录中。 这意味着您不再需要连接rubygems来运行bundle命令,因为它将使用打包的文件作为源。 如果您需要更新gem版本,那么它将需要连接到rubygems以在第一次请求时收集新版本。 使用bundle package当然需要额外的磁盘空间,这可能是也可能不是问题,具体取决于具体情况。 每次推送到Heroku时,它还会增加部署时间和带宽要求。

每次git push ,Heroku都会运行bundle命令,读取你的Gemfile.lock并安装应用程序运行所需的gem。 默认情况下,使用--path vendor/bundle选项。 这样每个应用程序都有一组与Heroku上的所有其他应用程序分开的gem文件。 如果源控件中有vendor/bundle目录并将其推送到Heroku,那么您可以看到存在重大冲突的可能性,因为它会尝试将gem加载到已存在的vendor/bundle目录中。 如果它被推送,那么Heroku会在运行bundle install之前删除vendor/bundle目录,以消除这些潜在的冲突。 如果是这种情况,那么您将通过将vendor/bundle置于版本控制之下来浪费部署时间和带宽,最好将其添加到您的.gitignore

如果要在Heroku上完全控制您的gem,请使用bundle package命令并确保vendor/cache目录受源代码管理。 当Heroku运行bundle install ,它将使用vendor/cache的内容作为gem源而不是使用rubygems 。 这是否有用将取决于个人偏好,您正在构建的应用程序类型以及更新gem的频率。 Ryan McGeary的post表明,如果旧的gem在将来的某个时刻变得不可用,使用bundle package是有用的。 对于那些没有定期更新的项目/应用来说,这似乎是一个更大的问题。

从我的角度来看,我通常使用--path vendor/bundle来保持我的本地设置尽可能接近Heroku。 我将vendor/bundle放入我项目的.gitignore文件中,并且我没有打包 gems,因为我的项目是相对定期更新的。

Rails有一个非常有限的.gitignore文件。 实际上,您可以自己构建所需的内容,这就是默认情况下不包含vendor/bundle原因。

我认为Heroku在他们说bundle pack bundle package时意味着bundle package