如何在卡皮斯特拉诺“复制,除非以后的版本存在”?

时间:2009-01-12 13:34:42

标签: ruby-on-rails ruby security deployment capistrano

我想保护我的database.yml文件,使其不受版本控制。因此,我在Capistrano部署配方中有两个任务:

task :copy_db_config do
  # copy local config file if it exists and is more
  # recent than the remote one
end

task :symlink_db_config do
  run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end

你能帮忙填写第一个任务吗?

2 个答案:

答案 0 :(得分:0)

我现在和你现在没有正常运行的代码,但是......

您可以使用ruby来获取本地时间戳。文件类有一个函数ctime,让你知道它何时被更改。

在服务器database.yml上运行相同的命令

如果本地最新,capistrano有一个安全上传的方法

upload("products.txt", "/home/medined", :via => :scp)

答案 1 :(得分:0)

我有同样的问题,但我接触的方式不同。也许它会有所帮助。

安装任务将database.yml.example复制到database.yml。部署任务不会触及database.yml。我有单独的任务来更改数据库名称,用户名和密码。这是一个例子:

desc "Change the database name"
task :change_db_database, :roles => :app do
  database = prompt('Enter new database name: ')
  run <<-CMD
    cd #{shared_path}/config &&
    perl -i -pe '$env = $1 if /^(\\w+)/; s/database:.*/database: #{database}/ if $env eq "#{ENV['CONNECTION'] || ENV['TARGET']}"' database.yml
  CMD
end

我在安装后但在第一次部署新盒子之前运行这些。然后,在我需要更改数据库参数之后的任何时候,我都会使用这些任务而不是复制到新文件中。