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!

26
demandé sur Tombart 2013-10-18 19:08:05

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"
27
répondu Electrawn 2013-10-18 21:19:53

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
8
répondu bricker 2014-07-07 00:44:14

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 :)

7
répondu Jasper N. Brouwer 2014-01-11 21:04:19

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
4
répondu JellicleCat 2014-06-26 22:41:42

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.

3
répondu cdog 2015-09-10 10:26:37