我的问题非常简单,但我无法在谷歌上找到答案。
我想通过Capistrano任务将yml配置插入到我服务器上的远程文件中。
虽然Capistrano 2和" put"真的很容易。命令,我无法通过Capistrano 3找到正确的方法。
例如,这是我的yml配置:
set(:database_username, "db_user")
ask(:database_password, "Database Password: ")
db_config = <<-EOF
base: &base
adapter: postgresql
encoding: unicode
reconnect: false
pool: 10
username: #{fetch(:database_username)}
password: #{fetch(:database_password)}
staging:
database: #{fetch(:application)}_staging
<<: *base
production:
database: #{fetch(:application)}_production
<<: *base
EOF
我想插入我的&#34; db_config&#34; database.yml文件中的变量。使用Capistrano 2我会这样做:
put db_config, "#{shared_path}/config/database.yml"
但是随着Capistrano 3它不再有效。 我试过这样的事情:
execute "echo '#{db_config}' > #{shared_path}/config/database.yml"
但是没有保留行尾,它们被&#34;;&#34;取代。因为回声&#39;命令。
有没有人用Capistrano 3做过类似的事情?
否则,我将继续使用&#34; database.yml.example&#34;并在部署后直接修改它。
谢谢!
[更新]这是我的整个Capistrano 3任务代码:
namespace :db do
desc "Create database yaml in shared path"
task :configure do
on roles(:db) do
if capture("cat #{shared_path}/config/database.yml").length > 0
puts "### INFO: Database.yml already exists"
else
set(:database_username, "db_user")
ask(:database_password, "Database Password: ")
db_config = <<-EOF
base: &base
adapter: postgresql
encoding: unicode
reconnect: false
pool: 10
username: #{fetch(:database_username)}
password: #{fetch(:database_password)}
staging:
database: #{fetch(:application)}_staging
<<: *base
production:
database: #{fetch(:application)}_production
<<: *base
EOF
execute "mkdir -p #{shared_path}/config"
execute "touch #{shared_path}/config/database.yml"
# Everything works so far. This is the buggy part:
#execute "echo '#{db_config}' > #{shared_path}/config/database.yml"
execute "cat '#{db_config}' > #{shared_path}/config/database.yml"
end
end
end
end
答案 0 :(得分:0)
这应该有效。
execute "cat '#{db_config}' > #{shared_path}/config/database.yml"
答案 1 :(得分:0)
我遇到了这个解决方案的问题,因为capistrano 3用分号替换了换行符。所以这是我的代码:
namespace :setup do
task :setup_database do
ask(:db_user, 'db_user')
ask(:db_pass, 'db_pass')
ask(:db_name, 'db_name')
db_config = <<-EOF
production:
adapter: mysql2
database: #{fetch(:db_name)}
username: #{fetch(:db_user)}
password: #{fetch(:db_pass)}
EOF
on roles(:app) do
execute "mkdir -p #{shared_path}/config"
upload! StringIO.new(db_config), "#{shared_path}/config/database.yml"
end
end
end