Ruby On Rails:如何在使用Capistrano 3进行部署时在文件中编写yml配置?

时间:2014-05-09 14:07:35

标签: ruby-on-rails ruby-on-rails-3 capistrano capistrano3

我的问题非常简单,但我无法在谷歌上找到答案。

我想通过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

2 个答案:

答案 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