web-dev-qa-db-ja.com

Capistrano 3はディレクトリ内で実行します

現在のリリースのディレクトリ内で「composer install」を実行することを含むCapistrano 3のタスクを作成しようとしています。次のようになります。

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はステージングファイルとプロダクションファイルで設定されます-私の特定のケースではphp /home/user/composer.phar

何らかの理由で、このコマンドは実際には現在のリリースディレクトリで実行されるのではなく、親ディレクトリ(現在、共有、リリースなどを含む)で実行されます

私はこれをもう少し詳しく調べて、次のように単一のWordコマンドを実行したとき、

within release_path do
    execute "pwd"
end

正常に機能し、現在のリリースディレクトリでコマンドを実行します。 ただし...スペースを使用してコマンドを実行すると、次のようになります。

within release_path do
    execute "pwd && ls"
end

withinブロックで設定されたディレクトリではなく、親ディレクトリで実行されます。

誰かがこれに光を当てることができますか?ありがとう!

29
Rahul Sekhar

キャップ3のバグのような匂い。

シェルの観点から、あなたが居たい場所にいることを保証することをお勧めします。

execute "cd '#{release_path}'; #{fetch(:composer_command)} install"
31
Electrawn

within()with()default_envなど、自然な文字列構文を維持しながら:

within release_path do
  execute *%w[ pip install -r requirements.txt ]
end
9
bricker

いくつかのヒント:

1)Capistranoは SSHKit を使用して、コマンドの実行など多くのことを行います。 Composer=)を使用して単純化するために、コマンドマップ(deploy.rbまたはproduction.rbなど)を構成できます。2つの例を次に示します。

SSHKit.config.command_map[:composer] = "#{shared_path.join('composer.phar')}"
SSHKit.config.command_map[:composer] = '/usr/bin/env composer.phar'

次に、次のように実行できます。

execute :composer, :install

2)セキュリティの観点から、PHP設定allow_url_fopenを無効にするのが賢明ですが、残念ながらComposerは機能するために有効にする必要があります。

SSHKit.config.command_map[:composer] = "/usr/bin/env php -d allow_url_fopen=On #{shared_path.join('composer.phar')}"

iniscan をチェックして、PHP設定に関するセキュリティのアドバイスを確認してください。

3)Composerにはオプション-d, --working-dirがあり、composer.jsonファイルを含むディレクトリをポイントして、Composer他のディレクトリからこれで問題が解決します:

execute :composer, '-d', release_path, :install

4) capistrano-composer プロジェクトをご覧ください:)

7

実際、within関数の使用はほぼ正しいです。文字列全体をコマンドとして指定しましたが、ドキュメントでは、これにより信頼性の低い動作が発生することが指摘されています(私はこれを経験しました)。

executeの最初の引数を、文字列(空白を含む)ではなくシンボルにします。

within release_path do
    execute fetch(:composer_command).to_sym, "install"
    execute :pwd
    execute :ls
end
4
JellicleCat

ここで参照するのは Capistrano Doc 理由を説明するwithin {}は、空白を含む引数では機能しません。これがお役に立てば幸いです。

3
cdog