Googleverseで見た他の多くのように、私はトラップの犠牲になりました。トラップはもちろん、デプロイ先のサーバーではなく、ローカルファイルシステムをFile.exists?
チェックします。
次のようなシェルハックを使用した結果が1つ見つかりました。
if [[ -d #{shared_path}/images ]]; then ...
しかし、Rubyメソッドでうまくラップされていない限り、それは私にはうまくいきません。
誰かがこれをエレガントに解決しましたか?
Googleverseで見た他の多くのように、私はトラップの犠牲になりました。トラップはもちろん、デプロイ先のサーバーではなく、ローカルファイルシステムをFile.exists?
チェックします。
次のようなシェルハックを使用した結果が1つ見つかりました。
if [[ -d #{shared_path}/images ]]; then ...
しかし、Rubyメソッドでうまくラップされていない限り、それは私にはうまくいきません。
誰かがこれをエレガントに解決しましたか?
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プログラムに返し、より単純なシェルコマンドで作業できるため便利です。
@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
@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
あなたがしたいのかもしれません:
isFileExist = 'if [ -d #{dir_path} ]; then echo "yes"; else echo "no"; fi'.strip
puts "File exist" if isFileExist == "yes"
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