我将应用程序部署在 heroku 上作为测试,在亚马逊上部署作为生产。在测试和开发(本地)上,我使用了 postgresql,在 Amazon EC2 上我使用了 Mysql。所以我希望 pg gem 只在测试和开发中加载,mysql2 gem 在生产中加载。
解决该问题的最佳实践是什么?
谢谢
我将应用程序部署在 heroku 上作为测试,在亚马逊上部署作为生产。在测试和开发(本地)上,我使用了 postgresql,在 Amazon EC2 上我使用了 Mysql。所以我希望 pg gem 只在测试和开发中加载,mysql2 gem 在生产中加载。
解决该问题的最佳实践是什么?
谢谢
最佳实践是使用相同的 dbms 进行开发、测试和生产。但我怀疑这就是你想听到的......
无论如何,bundler 不支持这种情况。也就是说,您不能简单地告诉它不要在给定环境中安装某些 gem - 即使它们不会被使用。您可以通过在块中声明它们来告诉它不加载某些 gem group
(如@mind.blank 建议的那样),但它们仍将被安装。但是,您可以使用简单的 ruby 构造,即if-else
或case
块,在特定条件下仅运行某些代码(并加载/安装某些 gem)。
这样做的问题是您的 Gemfile.lock 文件将在您的部署中不同步 - 这不是 bundler(或 Capistrano)所期望的。但是,您可以使用一些标志来告诉您的部署忽略 Gemfile.lock 文件,并bundle install
根据它对 Gemfile 的读取,如果您真的想...
Gemfile 在 Rails 3.2 和 Rails 4 中的行为是否不同?
如果没有,那么您可以指定应该在哪个环境中加载哪个 gem:
group :development, :test do
gem "pg"
end
group :production do
gem "mysql2"
end