Rails 捆绑安装仅生产
Posted
技术标签:
【中文标题】Rails 捆绑安装仅生产【英文标题】:Rails bundle install production only 【发布时间】:2012-06-10 08:58:59 【问题描述】:我对 rails/ruby/bundler 还是新手,有点困惑。
在我们的config/application.rb
文件中有这个捆绑程序段:
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require(*Rails.groups(:assets => %w(development test)))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end
在我们的Gemfile
中,我们使用不同的组,例如
group :development, :test do
gem "rspec-rails", ">= 2.7.0", :group => [:development, :test]
gem 'shoulda-matchers'
gem 'watchr'
gem 'spork', '~> 1.0rc'
gem 'spectator'
gem 'debugger'
gem 'wirble'
end
但是当我运行RAILS_ENV=production bundle install
(或bundle install --deployment
)时,它仍然会从开发/测试组安装gem...
为什么会发生这种情况,或者我怎样才能使它正常工作?
【问题讨论】:
【参考方案1】:另一种解决方案是使用bundle-only
ruby gem。可以这样使用:
> gem install bundle-only
> bundle-only production
这个库不会污染你的捆绑器配置或增加Gemfile.lock
;它是bundler
提供的内置bundle --without every other group
选项的简单替代方案。
【讨论】:
【参考方案2】:看看--without
选项:
bundle install --without development test
默认情况下,Bundler 会安装所有 gem,您的应用程序会使用它需要的 gem。 Bundler 本身对 Rails 和当前环境一无所知。
【讨论】:
我知道--without
,但它看起来很不优雅,特别是考虑到config/application.rb
中的那些配置指令(应该正好解决这个问题)并且还考虑到这句话:Rails 3 comes with baked in support with bundler.
Bundle install 命令完全独立于 Rails。它只是查看您的 Gemfile,它并不关心您的应用程序在上述配置中实际需要哪些库。实际上,您可以跳过 Bundler.require 并手动从任何组中要求库。我同意,Rails 在这种情况下可以与 Bundler 更好地集成,但事实并非如此。
我明白了。所以我想可以公平地说,rails 知道 bundler(即在config/application.rb
和config/boot.rb
),但是 bundler 对 rails 一无所知......它只读取 Gemfile 并且不使用其中任何一个轨道文件。我想硬币终于掉了。感谢您的帮助!
实际上这看起来很优雅,因为它排除了 Gemfile 中的“组”,而不是 Rails 应用程序中的环境。我知道有人这么说,但当我这样想时,它对我来说更有意义。
不确定这是否在过去四年中发生了变化,但--without
的参数应该用:
s 分隔,而不是空格。所以我认为应该是bundle install --without development:test
。以上是关于Rails 捆绑安装仅生产的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 webpack 捆绑 puppeteer 进行生产部署?
Rails 生产环境中的 config.assets.compile=true,为啥不呢?
Karaf - Kafka OSGI 捆绑包 - 生产者问题