32

現在のリリースのディレクトリ内で「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

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

これをもう少し掘り下げたところ、次のような単一の単語コマンドを実行したときに次のことがわかりました。

within release_path do
    execute "pwd"
end

問題なく動作し、現在のリリース ディレクトリでコマンドを実行します。しかし...次のように、スペースを含むコマンドを実行すると:

within release_path do
    execute "pwd && ls"
end

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

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

4

5 に答える 5

33

キャップ 3 バグのようなにおいがします。

シェルの観点から、目的の場所にいることを保証することをお勧めします。

execute "cd '#{release_path}'; #{fetch(:composer_command)} install"
于 2013-10-18T21:19:53.167 に答える
7

いくつかのヒント:

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')}"

PHP設定に関するセキュリティに関するアドバイスについては、iniscanを参照してください。

3) Composer には、他のディレクトリから Composer を実行するために-d, --working-dir、ファイルを含むディレクトリを指定できるオプションがあります。composer.jsonこれで問題が解決するはずです:

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

4) capistrano-composerプロジェクトを参照してください:)

于 2014-01-11T21:04:19.203 に答える
5

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

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

within release_path do
    execute fetch(:composer_command).to_sym, "install"
    execute :pwd
    execute :ls
end
于 2014-06-26T22:41:42.387 に答える
3

参考までに、空白を含む引数で が機能しない理由を説明するCapistrano Docを次に示します。within {}これが役立つことを願っています。

于 2015-09-10T10:26:37.303 に答える