3

我有想法将我的应用程序配置为使用不同的 gemset 进行登台和生产。我的想法是,通过将环境拆分为单独的 gemset,当/如果我需要更新 gems/ruby/rails 时,我将有更多的自由。我将能够做出这种改变,并在不影响生产应用程序/gemset 的情况下在暂存时测试整个事情。

为此,我将在服务器上有两个文件,一个位于每个环境的共享目录中,名为 rvmrc。这包含rvm use ree-1.8.7-2012.02@appname-production --create用于生产和rvm use ree-1.8.7-2012.02@appname-staging --create登台。

我会在部署脚本中包含一个任务,以将相应的shared/rvmrc文件链接到应用程序中.rvmrc

namespace :deploy do
  task :rvmrc do
    run "rm #{latest_release}/.rvmrc; ln -s #{shared_path}/rvmrc #{latest_release}/.rvmrc"
  end
end

before "bundle:install", "deploy:rvmrc"

这实际上是一个好主意,还是我把事情复杂化了?

4

2 回答 2

3

理想情况下,您希望在开发时使用您在生产中使用的所有 gem。我只会拆分特定于特定环境而在另一个环境中不需要的宝石。在我的大多数应用程序中,我通常只有开发所需的特定 gem。如果您需要拆分宝石,您可以简单地将它们分组,例如:

group :development do 
  gem 'development gem'
end

group :production do
  gem 'production gem'
end
于 2013-01-04T07:34:33.653 回答
0

上面, house9是正确的,他说:

我很确定'bundler/capistrano'会将所有gem安装到安装目录下的shared/bundle,如果在同一台机器上运行staging和production,你的安装目录需要不同,所以我认为你可以通过gem隔离默认?

cd /path/to/staging; bundle list您可以通过运行和在您的服务器上看到这一点cd /path/to/production; bundle list。如果您在每个环境中安装了不同的 gem,您将从每个命令中获得不同的列表。

正如house9还提到的,您只需要确保bundle exec从登台或生产运行时所做的一切都使用:rake 任务、启动服务器等。

由于在使用 bundler/capistrano 时默认存在 gem 隔离,因此没有理由将您的环境放在单独的 gemset 中。

于 2013-01-05T00:55:11.050 回答