29

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

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

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

我应该跑bundle pack吗?(真的bundle package吗??)

bundle pack(相对于development和)的优缺点是什么production

更令人困惑的是,有一篇由 Ryan McGeary 撰写的热门博客文章,标题为“Vendor Everything”Still Applys,强烈主张通过running 运行bundle install --path vendorecho 'vendor/ruby' >> .gitignore打包 gems 。与我的其他问题相关的任何有关此问题的信息将不胜感激。vendor/cachebundle 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)
       ...
4

1 回答 1

90

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

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

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

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

Herokubundle每次都会运行命令git push,读取Gemfile.lock并安装应用程序运行所需的 gem。默认情况下--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作为 gem 源,而不是使用rubygems. 这是否有用取决于个人喜好、您正在构建的应用程序类型以及您更新 gem 的频率。Ryan McGeary 的帖子表明,bundle package如果旧的 gem 在未来某个时候变得不可用,使用很有用。对于不定期更新的项目/应用程序来说,这似乎是一个更大的问题。

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

Rails 的文件非常有限.gitignore。实际上,您应该自己建立自己需要的东西,这就是vendor/bundle默认情况下不包括在内的原因。

我认为 Heroku 的意思是bundle package当他们说bundle pack.

于 2012-09-26T12:40:42.230 回答