在向Heroku推送一些更改后,我注意到有关vendor/bundle
的警告(请参阅下面的警告)。
如果根据警告,它应该从Git跟踪中“删除”,该目录的目的是什么?
Rails默认为什么vendor/bundle
不会自动.gitignore
?
我应该运行bundle pack
吗? (它实际上是bundle package
??)
围绕bundle pack
(相对于development
和production
)的优缺点是什么?
为了让这更令人困惑,Ryan McGeary有一篇名为"Vendor Everything" Still Applies的热门博客文章强烈主张运行bundle install --path vendor
和echo 'vendor/ruby' >> .gitignore
并在{{1}中打包宝石通过运行vendor/cache
。任何与我的其他问题有关的亮点都将不胜感激。
谢谢。
bundle package
答案 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
。