Как заставить capistrano записать файл .rvmrc при развертывании? - PullRequest
5 голосов
/ 07 февраля 2011

В моем репозитории git есть локальный файл rvmrc, и при развертывании я хочу использовать другое имя набора гемов rvm и т. Д.

Есть ли способ заставить capistrano создавать файл .rvmrc (или перезаписывать его, если он есть) при каждом развертывании?

Ответы [ 4 ]

7 голосов
/ 07 февраля 2011

Команда 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

Примечание: пример взят из Создание книги рецептов Capistrano

put задокументировано в Capistrano gitub repo

2 голосов
/ 19 июня 2014

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
1 голос
/ 07 апреля 2013

Это поздний ответ, но согласно принятому ответу я создал задачу в пространстве имен 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
1 голос
/ 07 февраля 2011

Да, вы можете написать задачу rake для записи файла .rvmrc, например, следующая команда Ruby выполнит скрипт bash, который записывает rvm 1.9.2@mygemset в .rvmrc:

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

Моя рекомендация также состоит в том, чтобы не хранить ваш файл .rvmrc в вашем git-репозитории - этот файл действительно является системным файлом и может вызвать проблемы у других разработчиков, которые используют другие системные настройки, например, если они используют другой gemset, то каждый раз, когда они извлекают данные из центрального хранилища, им придется переписывать свои собственные файлы .rvmrc.

...