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

use*_*833 25 ruby-on-rails heroku bundler ruby-on-rails-3.2

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

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

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

我该跑bundle pack吗?(实际上是bundle package??)

有什么利弊bundle pack(相对于两者developmentproduction)?

为了使这更混乱,有一个流行的博客文章,由Ryan McGeary,标题为"供应商的一切"仍然适用强烈主张的运行bundle install --path vendorecho 'vendor/ruby' >> .gitignore在包装宝石vendor/cache运行bundle package.任何与我的其他关注相关的光线都将不胜感激.

谢谢.

-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)
       ...
Run Code Online (Sandbox Code Playgroud)

nmo*_*ott 84

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

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

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

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

Heroku bundle每次都会运行命令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默认情况下不包含的原因.

我认为Heroku意味着bundle package什么时候说bundle pack.

  • 如果你想保持你所有的宝石系统(我喜欢这样做),请务必查看你的`〜/ .bundle/config`文件以确保它没有任何强制你的选项要安装到`/ vendor/bundle`的gem. (6认同)
  • @varatis,你的意思是项目根目录中的`.bundle/config`,不是吗?但是,救生员.谢谢. (5认同)
  • “每次推送到 Heroku 时,使用捆绑包 [...] 还会增加部署时间和带宽要求。” 除非我们进行基准测试,否则很难说它是否真的会。git repo 将具有更大的大小,但只有在 `git push` 包含对 `vendor/cache` 的更改时才重要。另一方面,将所有 gem 放在 `vendor/cache` 中会使 `bundle install` 运行得更快。 (3认同)
  • 谢谢。如何撤消--path / vendor / bundle?自从现在Ruby位于vendor / cache / ruby​​ / 2.2.0中以来,我的应用程序大小已大大增加,现在所有gems都位于该gems /文件夹中 (2认同)