供应商/捆绑的目的是什么? Heroku告诉我要删除它
在向Heroku推送一些更改后,我注意到有关vendor/bundle
警告 (请参阅下面的警告 )。
如果根据警告它应该从Git跟踪中“删除”,这个目录的目的是什么?
为什么vendor/bundle
没有自动.gitignore
默认为Rails?
我应该运行bundle pack
吗? (它实际上是bundle package
??)
bundle pack
的优缺点是什么(相对于development
和production
)?
为了让这更令人困惑,Ryan McGeary的热门博客post名为“Vendor Everything”,仍然适用于运行bundle install --path vendor
和echo '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
。