Capistrano 3 exécute dans un répertoire
j'essaie d'écrire une tâche pour Capistrano 3 qui implique d'exécuter 'composer install' dans le répertoire de la version courante. Il ressemble à quelque chose comme ceci:
namespace :composer do
desc 'Install dependencies with Composer'
task :install do
on roles(:web) do
within release_path do
execute "#{fetch(:composer_command)} install"
end
end
end
end
composer_command
est défini dans les fichiers de mise en scène et de production - dans mon cas particulier à php /home/user/composer.phar
pour une raison quelconque, cette commande ne s'exécute pas dans le répertoire de publication courant, mais dans le répertoire parent (contenant current, shared, releases, etc)
je j'ai creusé un peu plus loin et j'ai trouvé que lorsque j'ai lancé une seule commande de mot, comme:
within release_path do
execute "pwd"
end
Il fonctionne très bien, et exécute la commande dans la version actuelle répertoire. Mais... quand j'exécute une commande avec des espaces, comme:
within release_path do
execute "pwd && ls"
end
il s'exécute dans le répertoire parent, et non dans le répertoire défini par le within
bloc.
Quelqu'un peut-il nous éclairer à ce sujet? Merci!
5 réponses
sent comme un bug Cap 3.
je suggère simplement de garantir que vous êtes là où vous voulez être de la coquille point de vue:
execute "cd '#{release_path}'; #{fetch(:composer_command)} install"
Vous pouvez conserver toutes les subtilités de within()
,with()
, default_env
, etc, tout en conservant la syntaxe de chaîne naturelle:
within release_path do
execute *%w[ pip install -r requirements.txt ]
end
quelques conseils:
1) Capistrano utilisations SSHKit pour beaucoup de choses, dont l'exécution de commande. Afin de simplifier l'utilisation Compositeur, vous pouvez configurer la commande de la carte (dans deploy.rb
ou production.rb
, etc), Voici 2 Exemples:
SSHKit.config.command_map[:composer] = "#{shared_path.join('composer.phar')}"
SSHKit.config.command_map[:composer] = '/usr/bin/env composer.phar'
Ensuite, vous pouvez l'exécuter comme suit:
execute :composer, :install
2) du point de vue de la sécurité, il est sage de désactiver le paramètre php allow_url_fopen
, mais malheureusement Composer a besoin qu'il soit activé pour fonctionner. Vous pouvez utilisez cette astuce pour la désactiver globalement:
SSHKit.config.command_map[:composer] = "/usr/bin/env php -d allow_url_fopen=On #{shared_path.join('composer.phar')}"
découvrez iniscan pour plus de sécurité, conseillez sur les paramètres de php.
3) Composer a une option -d, --working-dir
, que vous pouvez pointer vers le répertoire contenant le composer.json
fichier pour exécuter Composer à partir de n'importe quel autre répertoire. Cela devrait résoudre votre problème:
execute :composer, '-d', release_path, :install
4) Vous pouvez jeter un coup d'oeil à la capistrano-compositeur projet :)
en Fait, votre utilisation de l' within
la fonction est presque correct. Vous lui avez fourni une chaîne entière à titre de commande, mais le doc fait remarquer qu'il en résulte un comportement peu fiable (ce que j'ai moi-même expérimenté).
Laissez-le premier argument de execute
être un symbole au lieu d'une chaîne de caractères (qui contient des espaces):
within release_path do
execute fetch(:composer_command).to_sym, "install"
execute :pwd
execute :ls
end
juste pour la référence ici est le Capistrano Doc expliquer pourquoi within {}
ne fonctionne pas avec les arguments avec les espaces. J'espère que cette aide.