1

我将应用程序部署在 heroku 上作为测试,在亚马逊上部署作为生产。在测试和开发(本地)上,我使用了 postgresql,在 Amazon EC2 上我使用了 Mysql。所以我希望 pg gem 只在测试和开发中加载,mysql2 gem 在生产中加载。

解决该问题的最佳实践是什么?

谢谢

4

2 回答 2

1

最佳实践是使用相同的 dbms 进行开发、测试和生产。但我怀疑这就是你想听到的......

无论如何,bundler 不支持这种情况。也就是说,您不能简单地告诉它不要在给定环境中安装某些 gem - 即使它们不会被使用。您可以通过在块中声明它们来告诉它不加载某些 gem group(如@mind.blank 建议的那样),但它们仍将被安装。但是,您可以使用简单的 ruby​​ 构造,即if-elsecase块,在特定条件下仅运行某些代码(并加载/安装某些 gem)。

这样做的问题是您的 Gemfile.lock 文件将在您的部署中不同步 - 这不是 bundler(或 Capistrano)所期望的。但是,您可以使用一些标志来告诉您的部署忽略 Gemfile.lock 文件,并bundle install根据它对 Gemfile 的读取,如果您真的想...

于 2013-05-21T03:56:12.060 回答
1

Gemfile 在 Rails 3.2 和 Rails 4 中的行为是否不同?
如果没有,那么您可以指定应该在哪个环境中加载哪个 gem:

group :development, :test do
  gem "pg"
end

group :production do
  gem "mysql2"
end
于 2013-05-21T03:55:07.220 回答