Как написать задание Albacore zip, которое включает только определенные папки и сами папки? - PullRequest
7 голосов
/ 30 июня 2010

Я пытаюсь заархивировать артефакты сборки рейка, используя 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

Проблема в том, что результатом этой задачи является zip-файл, содержащий содержимое этих папок, а не сами папки, что явно нежелательно.

Затем я попытался переключить поле flatten_zip на false (что не является документированным полем, но вы можете найти его в source ). Это привело к созданию zip-файла, содержащего указанные выше папки, но в нижней части всей иерархии папок ./src/website/. Я хочу, чтобы указанные выше папки находились в корне zip-файла, так что это тоже не работает.

Итак, мой следующий снимок был с использованием 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, это также привело к тому, что AutoMapper.dll и StructureMap.dll (конечно) также были исключены из папки bin.

Как мне отредактировать любую из вышеперечисленных задач, чтобы в корне моего zip-файла были только нужные папки и файлы?

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Вы можете скопировать все нужные вам файлы и папки во временный каталог и затем сжать его. Другими словами, установите свойство directories_to_zip для одной папки, в которую уже скопированы все правильные файлы - где код для копирования - это то, что делает всю фильтрацию за вас. Я думаю, что это неопределенное ожидаемое использование (и способ, которым я его использую). Я просто сопоставлю две идеи, чтобы прояснить это.

Стратегия A: скопировать структуру папок

Скопируйте то, что вам нужно, во временный каталог. Таким образом, вы устанавливаете свойство directoryies_to_zip в одну папку, например:

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

Стратегия B: использовать фильтр

(Это ваша текущая стратегия)

Используйте свойство directories_to_zip в качестве фильтра для исходного каталога (это массив, который занимает несколько каталогов, поэтому вы не можете быть обвинены в предположении, что он должен работать именно так). Затем вы используете различные свойства для фильтрации необходимых вам файлов / папок.

Возможное разрешение

Тогда, чтобы решить вашу проблему, вы можете принять стратегию А. На самом деле, если с этим не возникнет каких-либо чрезвычайных проблем (медленный ПК, удивительно мало места на диске), я бы подумал, что это будет несколько более надежный способ решения этой проблемы. об этом, потому что вы можете быть уверены, что вы копируете именно то, что копируете, что можно проверить, проверив каталог ziptemp.

Кстати, я могу быть уверен, что Стратегия А работает, потому что я использую ее (с Albacore) для архивирования файлов для наших установщиков.

0 голосов
/ 15 июля 2013

У меня была та же проблема с использованием 'albacore', я хотел сжать папку с именем 'tools' (не только содержимое), сохранить ее в папке с именем 'out' и назвать zip 'tools.zip ... поэтому вместо этого я использовал это;

require 'zip/zipfilesystem'

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

Я знаю, что уже поздно, но надеюсь, это кому-нибудь поможет.

...