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

时间:2012-09-24 22:06:45

标签: ruby-on-rails heroku ruby-on-rails-3.2 bundler

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

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

Rails默认为什么vendor/bundle不会自动.gitignore

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

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

为了让这更令人困惑,Ryan McGeary有一篇名为"Vendor Everything" Still Applies的热门博客文章强烈主张运行bundle install --path vendorecho 'vendor/ruby' >> .gitignore并在{{1}中打包宝石通过运行vendor/cache。任何与我的其他问题有关的亮点都将不胜感激。

谢谢。

bundle package

1 个答案:

答案 0 :(得分:80)

如果您的项目中有vendor/bundle目录,那么某点you must have run the bundle command with the --path vendor/bundle argument。这会将所有项目的宝石(在Gemfile中列出)的文件加载到本地项目的vendor/bundle目录中,而不是加载到系统gem位置。您可以这样做,将项目的宝石与任何其他项目完全隔离。

Bundler擅长解析所有依赖项,因此没有必要使用--path,但是有些人选择这样做,因为他们希望将他们的宝石与他们的项目分开并组织起来。这也意味着本地计算机上的bundler设置方式与Heroku使用bundler的方式相同。

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

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

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

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

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

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

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