如何让capistrano在部署时编写.rvmrc文件?

时间:2011-02-06 22:25:45

标签: ruby-on-rails capistrano rvm

我的git repo中包含我的本地rvmrc文件,当我部署时,我想使用不同的rvm gemeset名称等。

有没有办法可以让capistrano在我部署时创建一个.rvmrc文件(或者如果存在则覆盖它)?

4 个答案:

答案 0 :(得分:7)

Capistrano的put命令可以从字符串中写入文件,如下所示:

desc 'Generate a config yaml in shared path'
  task :generate_yaml, :roles => :app do
    sphinx_yaml = <<-EOF
development: &base
  morphology: stem_en
  config_file: #{shared_path}/config/sphinx.conf
test:
  <<: *base
production:
  <<: *base
EOF
    run "mkdir -p #{shared_path}/config"
    put sphinx_yaml, "#{shared_path}/config/sphinx.yml"
  end

注意:示例取自Making Your Capistrano Recipe Book

put记录在Capistrano gitub repo

答案 1 :(得分:2)

put方法在Capistrano 3中不再有效

此解决方案适合我

task :generate_yml do
  on roles(:app) do
  set :db_username, ask("DB Server Username", nil)
  set :db_password, ask("DB Server Password", nil)
  db_config = <<-EOF
development:
  database: #{fetch(:application)}_development
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  username: #{fetch(:db_username)}
  password: #{fetch(:db_password)}       
test:
  database: #{fetch(:application)}_test
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  username: #{fetch(:db_username)}
  password: #{fetch(:db_password)}   
production:
  database: #{fetch(:application)}_production
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  username: #{fetch(:db_username)}
  password: #{fetch(:db_password)}
EOF
   location = fetch(:template_dir, "config/deploy") + '/database.yml'
   execute "mkdir -p #{shared_path}/config"
   File.open(location,'w+') {|f| f.write db_config }
   upload! "#{location}", "#{shared_path}/config/database.yml"
end
end

答案 2 :(得分:1)

是的,您可以编写一个rake任务来编写.rvmrc文件,例如,以下Ruby命令将执行一个将rvm 1.9.2@mygemset写入.rvmrc的bash脚本:

system "echo 'rvm 1.9.2@mygemset' > .rvmrc"

我的建议也是不将你的.rvmrc文件存储在你的git存储库中 - 这个文件实际上是一个系统特定的文件,可能会给使用不同系统设置的其他开发人员带来问题,例如,如果他们使用不同的gemset那么无论何时他们从中央存储库中取出,他们都必须重新编写自己的.rvmrc文件。

答案 3 :(得分:1)

这是一个迟到的答案,但根据接受的答案,我在 rvm 命名空间中创建了一个任务来完成这项工作。它使用新的ruby版本:

after 'deploy:update_code', 'rvm:create_ruby_version'

namespace :rvm do
  task :create_ruby_version do
    run "cd #{latest_release} && rvm rvmrc create #{rvm_ruby_string} --ruby-version"
  end
end