43

Googleverseで見た他の多くのように、私はトラップの犠牲になりました。トラップはもちろん、デプロイ先のサーバーではなく、ローカルファイルシステムをFile.exists?チェックします。

次のようなシェルハックを使用した結果が1つ見つかりました。

if [[ -d #{shared_path}/images ]]; then ...

しかし、Rubyメソッドでうまくラップされていない限り、それは私にはうまくいきません。

誰かがこれをエレガントに解決しましたか?

4

5 に答える 5

61

capistrano 3では、次のことができます。

on roles(:all) do
  if test("[ -f /path/to/my/file ]")
    # the file exists
  else
    # the file does not exist
  end
end

これは、リモートテストの結果をローカルのrubyプログラムに返し、より単純なシェルコマンドで作業できるため便利です。

于 2014-01-02T04:28:50.020 に答える
49

@knocteは正しいですが、これcaptureは問題があります。通常、誰もが展開を複数のホストに向けます(そして、キャプチャは最初のホストからの出力のみを取得します)。すべてのホストをチェックするには、invoke_command代わりにを使用する必要があります(これはcapture内部で使用されます)。一致するすべてのサーバーにファイルが存在することを確認する例を次に示します。

def remote_file_exists?(path)
  results = []

  invoke_command("if [ -e '#{path}' ]; then echo -n 'true'; fi") do |ch, stream, out|
    results << (out == 'true')
  end

  results.all?
end

デフォルトでinvoke_command使用することに注意してください-より詳細な制御のために渡すことができるオプションを確認してください。run

于 2013-03-15T15:28:07.620 に答える
21

@bhupsの応答に触発され、テストが行​​われました。

def remote_file_exists?(full_path)
  'true' ==  capture("if [ -e #{full_path} ]; then echo 'true'; fi").strip
end

namespace :remote do
  namespace :file do
    desc "test existence of missing file"
    task :missing do
      if remote_file_exists?('/dev/mull')
        raise "It's there!?"
      end
    end

    desc "test existence of present file"
    task :exists do
      unless remote_file_exists?('/dev/null')
        raise "It's missing!?"
      end
    end
  end
end
于 2009-11-02T15:36:01.190 に答える
5

あなたがしたいのかもしれません:

isFileExist = 'if [ -d #{dir_path} ]; then echo "yes"; else echo "no"; fi'.strip
puts "File exist" if isFileExist == "yes"
于 2009-11-02T14:36:59.070 に答える
4

capistranoでrunコマンド(リモートサーバーでシェルコマンドを実行する)を使用する前に、これを実行しました。

たとえば、これは、database.ymlがshared / configsディレクトリに存在するかどうかを確認し、存在する場合はリンクする1つのcapistranoタスクです。

  desc "link shared database.yml"
  task :link_shared_database_config do
    run "test -f #{shared_path}/configs/database.yml && ln -sf 
    #{shared_path}/configs/database.yml #{current_path}/config/database.yml || 
    echo 'no database.yml in shared/configs'"
  end
于 2009-11-02T22:20:50.663 に答える