2009-01-12 7 views
0

Je veux protéger mon fichier database.yml en le laissant hors de contrôle de version. Ainsi, j'ai deux tâches dans ma recette de déploiement Capistrano:Comment puis-je "copier à moins qu'une version ultérieure existe" dans 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 

Pouvez-vous aider à remplir la première tâche?

Répondre

0

Je n'ai pas de code qui fonctionne pour vous ici et maintenant, mais ..

vous pouvez l'horodatage local en utilisant Ruby. La classe File a une fonction ctime qui vous permet de savoir quand elle a été changée.

Exécutez la même commande sur les serveurs database.yml

Si le local est plus récent, Capistrano a une méthode pour le téléchargement sécurisé

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

0

J'ai eu le même problème, mais je me suis approché différemment. Peut-être que ce sera utile.

La tâche d'installation copie database.yml.example dans database.yml. La tâche de déploiement ne touche pas database.yml. J'ai des tâches séparées pour changer les noms de bases de données, les noms d'utilisateur et les mots de passe. Voici un exemple:

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 

Je les lance après la configuration mais avant le premier déploiement sur de nouvelles boîtes. Ensuite, à tout moment après, lorsque j'ai besoin de changer les paramètres de la base de données, j'utilise ces tâches au lieu de les copier dans un nouveau fichier.