كيف يمكنني كتابة مهمة albacore zip التي تتضمن فقط مجلدات معينة والمجلدات نفسها؟

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

  •  01-10-2019
  •  | 
  •  

سؤال

أحاول أن أضغط على القطع الأثرية لبناء أشعل النار ، باستخدام ألباكور Ziptask. يحتوي الحل الذي أقوم بإنشائه على ثلاثة مشاريع تحتوي على قطع أثرية تحتاج إلى ضرب بشكل فردي ، ولكن سيتم ذكر مشروع ASP.NET MVC فقط هنا. إليك بنية الدليل للحل:

rakefile.rb
solution.sln
src/
    (other projects that are not relevant)
    website/
        (various folders I don't want included in the artifacts)
        bin/
        Content/
        Scripts/
        Views/
        Default.aspx
        Global.asax
        web.config

في البداية كتبت هذه المهمة:

website_directory = File.join '.', 'src', 'website'
website_project_name = 'website'

zip :zip => [ :run_unit_tests, :less ] do |zip|
  zip.directories_to_zip = [ 'bin', 'Content', 'Scripts', 'Views' ].map{ |folder| File.join website_directory, folder }
  zip.additional_files = [ 'Default.aspx', 'favicon.ico', 'Global.asax', 'web.config'].map{ |file| File.join website_directory, file }
  zip.output_file = get_output_file_name
  zip.output_path = get_artifacts_output_path website_project_name
end

المشكلة هي أن إخراج هذه المهمة هو ملف مضغوط يحتوي على محتويات من تلك المجلدات ، وليس المجلدات نفسها ، والتي من الواضح أنها غير مرغوب فيها.

بعد ذلك ، حاولت التقليب flatten_zip حقل إلى خطأ (وهو ليس حقلًا موثقًا ولكن يمكنك العثور عليه فيه المصدر). أنتج هذا الرمز البريدي الذي يحتوي على المجلدات أعلاه ، ولكن في أسفل الكل ./src/website/ التسلسل الهرمي للمجلد. أريد المجلدات أعلاه في جذر الرمز البريدي ، بحيث لا يعمل أيضًا.

لذلك كانت هذه اللقطة التالية ، باستخدام exclusions, ، والتي لم يتم توثيقها أيضًا:

zip :zip => [ :run_unit_tests, :less ] do |zip|
  zip.directories_to_zip website_directory
  zip.exclusions = [ /.git/, /.+\.cs/, /App_Data/, /Attributes/, /AutoMapper/, /Controllers/, /Diagrams/, /Extensions/, /Filters/, /Helpers/, /Models/, /obj/, /Properties/, /StructureMap/, /Templates/, /CompTracker.Web.csproj/, /Default.aspx.cs/, /Global.asax.cs/, /Publish.xml/, /pdb/ ]
  zip.output_file = get_output_file_name
  zip.output_path = get_artifacts_output_path website_project_name
end

لقد نجح هذا الأمر بالنسبة لي ، لكن عندما أضفت مؤخرًا /AutoMapper/ و /StructureMap/ إلى exclusions Array ، تسبب أيضًا في استبعاد Automapper.dll و structuremap.dll (بالطبع) من مجلد Bin.

كيف يمكنني تعديل أي من المهام المذكورة أعلاه للحصول على المجلدات والملفات التي أريدها فقط في جذر الرمز البريدي الخاص بي؟

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

المحلول

يمكنك نسخ جميع الملفات والمجلدات التي تحتاجها في دليل مؤقت ثم zip. بمعنى آخر ، اضبط العقار directories_to_zip إلى مجلد واحد يحتوي على جميع الملفات الصحيحة التي تم نسخها بالفعل - حيث كود نسخ هو ما يفعل كل التصفية لك. أعتقد أن هذا هو الاستخدام المتوقع غير المحدد (وطريقة استخدامه). سأقابل الفكرتين فقط لتوضيح الأمر.

الاستراتيجية أ: انسخ هيكل المجلد

انسخ ما تحتاجه في دليل مؤقت. وبهذه الطريقة ، قمت بتعيين خاصية "Musticies_TO_ZIP" على مجلد واحد على سبيل المثال:

directories_to_zip = 'ziptemp/all.my.stuff.copied.here/'

الاستراتيجية ب: استخدم مرشح

(هذه هي استراتيجيتك الحالية)

استخدم ال directories_to_zip الملكية كمرشح على دليل أصلي (إنها صفيف يأخذ أدلة متعددة ، لذلك لا يمكن إلقاء اللوم عليك على افتراض أنه يجب أن يعمل بهذه الطريقة). ثم تستخدم خصائص مختلفة لتصفية الملفات/المجلدات التي تحتاجها.

قرار ممكن

لحل مشكلتك ، إذن ، يمكنك تبني الاستراتيجية A. في الواقع ، ما لم تكن هناك أي مشاكل غير عادية مع هذا (الكمبيوتر البطيء ، منخفضة بشكل مثير للدهشة على مساحة القرص) ، كنت أعتقد أن هذا سيكون أكثر قوة قليلاً للذهاب إلى ذلك بسبب يمكنك أن تتأكد من أن ما تقوم به هو بالضبط ما تقوم بنسخه ، والذي يمكن التحقق منه من خلال التحقق من دليل Ziptemp.

بالمناسبة ، يمكنني أن أكون متأكدًا من الإستراتيجية لأعمال لأنني أستخدمها (مع Albacore) لضغط الملفات للمثبتات لدينا.

نصائح أخرى

لقد واجهت نفس المشكلة باستخدام "Albacore" ، أردت أن أضغط على مجلد يسمى "أدوات" (وليس فقط المحتويات) ، وتخزينه في مجلد يسمى "Out" وتسمية الأدوات zip. استخدم هذا ؛

require 'zip/zipfilesystem'

Zip::ZipFile::open("out/tools.zip", Zip::ZipFile::CREATE) { |z|
    Dir['{tools}/**/*'].each { |f|
        z.add(f, f)
    }
}

أعلم أنه متأخر ولكن آمل أن يساعد هذا شخصًا ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top