2008-10-30 4 views
4

Ceci est probablement une question ruby ​​débutant. J'ai plusieurs bibliothèques et applications que j'ai besoin de déployer sur plusieurs hôtes différents. Toutes les applications et toutes les bibliothèques partagent des paramètres communs pour ces hôtes, par exemple. le nom d'hôte, base de données serveur/utilisateur/pass, etc.Capistrano: comment inclure les paramètres communs dans plusieurs fichiers deploy.rb de projet

Mon but est de faire quelque chose comme:

cap host1 stage deploy 
cap host2 stage deploy 
cap host1 prod deploy 
# ... 

Ma question est de savoir comment inclure ces paramètres communs dans tous vos fichiers deploy.rb? Plus précisément, je veux créer un fichier rb que je peux inclure qui a des paramètres communs et plusieurs définitions de tâches spécifiques d'accueil:

set :use_sudo, false 
# set some other options 

task :host1 do 
    role :app, "host1.example.com" 
    role :web, "host1.example.com" 
    role :db, "host1.example.com", :primary => true 

    set :rodb_host, "dbhost" 
    set :rodb_user, "user" 
    set :rodb_pass, "pass" 
    set :rodb_name, "db" 
end 

task :host2 do 
    #... 
end 

deploy.task :carsala do 
    transaction do 
     setup 
     update_code 
     symlink 
    end 
end 

Et puis « inclure » ce fichier dans tous mes fichiers deploy.rb où Je définis l'étape, prod, etc et écrase tous les paramètres de configuration "communs" si nécessaire. Toute suggestion serait appréciée. J'ai essayé quelques choses différentes, mais je reçois des erreurs de la part de tous.

Edit: J'ai essayé

require 'my_module' 

Mais je reçois des erreurs qui se plaignent d'un objet de tâche non définie.

Répondre

2
require 'my_extension' 

Enregistrer vos extensions dans my_extension.rb

0

Jon a raison, c'est le moyen le plus simple d'aller, juste l'enregistrer dans un fichier séparé et utiliser require 'filename'. Vous pouvez également utiliser quelque chose de fantaisie comme Webistrano pour le déploiement qui prend également en charge ce sous la forme de Capistrano 'Recipes'. Je l'utilise depuis un moment sur quelques projets et je l'aime.

+0

J'ai essayé ceci, mais je reçois des erreurs en me plaignant que l'objet de tâche n'est pas défini. Avez-vous besoin de quelque chose au sommet de 'my_extension'? – drsnyder

9

Je viens expérimenta un peu plus et ce que j'ai découvert est que vous devez:

load 'config/my_module' 

Je peux mettre toutes mes définitions communes ici et le charger dans mon deploy.rb.

Il apparaît des documents qui chargent et exécute le fichier. Vous pouvez également demander des tentatives de chargement de la bibliothèque spécifiée. Je ne suis pas totalement sûr de la différence réelle, mais il semble qu'il y ait une certaine séparation entre l'espace de symbole de l'application actuelle et la bibliothèque requise (d'où les erreurs sur l'objet de tâche indéfini) qui ne pose pas de problème lorsque vous faites un charge.

+0

Require est utilisé pour charger les Rubygems, mais chargera d'abord les fichiers locaux d'un donné s'il les trouve. En outre, require n'exécute pas le fichier une deuxième fois s'il a été chargé précédemment, alors que load le fait. A part ça, ils sont parfaitement équivalents. Vous pouvez donc utiliser require pour charger vos propres fichiers. – webmat

+0

Si j'utilise require, j'obtiens une erreur: "undefined method' namespace '", mais si j'utilise load, ça marche bien. –

0

Je ne sais pas la complexité de vos besoins, mais cela fonctionne bien pour moi pour le déploiement:

set :application, "app" 

set :scm,   :subversion 
# ... set all your common variables 

task :staging do 
    set :repository, "http://app/repository/trunk/" 
    # ... set other uncommon variables in task 
end 

task :production do 
    set :repository, "http://app/repository/production/" 
    # ... 
end 

déploiement est juste

cap staging deploy 

ou

cap production deploy 
Questions connexes