現在のリリースのディレクトリ内で「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
ブロックで設定されたディレクトリではなく、親ディレクトリで実行されます。
誰かがこれに光を当てることができますか?ありがとう!
キャップ3のバグのような匂い。
シェルの観点から、あなたが居たい場所にいることを保証することをお勧めします。
execute "cd '#{release_path}'; #{fetch(:composer_command)} install"
within()
、with()
、default_env
など、自然な文字列構文を維持しながら:
within release_path do
execute *%w[ pip install -r requirements.txt ]
end
いくつかのヒント:
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 プロジェクトをご覧ください:)
実際、within
関数の使用はほぼ正しいです。文字列全体をコマンドとして指定しましたが、ドキュメントでは、これにより信頼性の低い動作が発生することが指摘されています(私はこれを経験しました)。
execute
の最初の引数を、文字列(空白を含む)ではなくシンボルにします。
within release_path do
execute fetch(:composer_command).to_sym, "install"
execute :pwd
execute :ls
end
ここで参照するのは Capistrano Doc 理由を説明するwithin {}
は、空白を含む引数では機能しません。これがお役に立てば幸いです。