كيف يمكنك التحقق لمعرفة ما إذا كان الملف موجود (على الخادم البعيد) في Capistrano؟
-
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