我如何编写仅包含某些文件夹和文件夹本身的Albacore ZIP任务?
题
我正在尝试使用Albacore's来拉链耙子的制作 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
字段到false(这不是记录的字段,但您可以在 来源)。这产生了一个包含上述文件夹的拉链,但在整个文件的底部 ./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
数组,它还使AutomApper.dll和structureMap.dll(当然)也从BIN文件夹中排除。
我应该如何编辑以上任何任务以仅具有我想要的文件夹和文件的根源?
解决方案
您可以将所需的所有文件和文件夹复制到临时目录中,然后将其汇总。换句话说,设置属性 directories_to_zip
到一个已复制所有正确文件的文件夹 - 复制代码 就是所有的过滤。我认为这是未指定的预期用法(以及我使用的方式)。我将与两个想法进行对比,以表明这一点。
策略A:复制文件夹结构
将您需要的内容复制到临时目录中。这样,您将'Directories_to_zip'属性设置为一个文件夹:
directories_to_zip = 'ziptemp/all.my.stuff.copied.here/'
策略B:使用过滤器
(这是您目前的策略)
使用 directories_to_zip
属性作为原始目录上的过滤器(这是一个阵列,需要多个目录,因此假设它应该以这种方式工作,则不能指责您。然后,您使用各种属性来过滤所需的文件/文件夹。
可能的分辨率
那么,要解决您的问题,您可以采用策略A。实际上,除非有任何非凡问题(慢速PC,磁盘空间的低点),我会认为这将是一种更强大的方法,因为您可以确定,您的拉链正是您要复制的内容,可以通过检查Ziptemp目录来验证。
顺便说一句,我可以肯定的是策略A作品,因为我(与Albacore一起使用)将其用于安装程序。
其他提示
我使用“ Albacore”遇到了同样的问题,我想将一个称为“工具”的文件夹(不仅仅是内容)将其存储在一个名为“ 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)
}
}
我知道它很晚,但我希望这对某人有帮助。