كيف يمكنك التحقق لمعرفة ما إذا كان الملف موجود (على الخادم البعيد) في Capistrano؟

StackOverflow https://stackoverflow.com/questions/1661586

  •  12-09-2019
  •  | 
  •  

سؤال

مثل العديد من الآخرين الذين رأيتهم في الجوغرافس، لقد وقعت ضحية File.exists? فخ، والذي يتحقق من الدورة محلي نظام الملفات، وليس الخادم الذي تقوم بنشره إليه.

لقد وجدت نتيجة واحدة تستخدم اختراق قذيفة مثل:

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

لكن هذا لا يجلس جيدا معي، ما لم يتم لفه بشكل جيد بطريقة روبي.

هل قام أي شخص بحل هذا بأناقة؟

هل كانت مفيدة؟

المحلول

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 افتراضيا - تحقق من الخيارات يمكنك المرور لمزيد من السيطرة.

نصائح أخرى

في 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 المحلي الخاص بك ويمكنك العمل في أوامر Shell Simpler.

مستوحاة من استجابة 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"

لقد فعلت ذلك قبل استخدام الأمر RUN في Capistrano (الذي ينفذ أمر Shell على الخادم البعيد)

على سبيل المثال هنا هي مهمة 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top