我正在尝试使用Albacore的ZipTask压缩rake构建的工件。我正在构建的解决方案有三个具有需要单独压缩的工件的项目,但这里只提到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(这不是文档字段,但您可以在the 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根目录中只包含我想要的文件夹和文件?
答案 0 :(得分:3)
您可以将所需的所有文件和文件夹复制到临时目录中,然后将其压缩。换句话说,将属性directories_to_zip
设置为一个文件夹,该文件夹中已经复制了所有正确的文件 - 其中复制代码就是为您进行的所有过滤。我认为这是未指明的预期用法(以及我使用它的方式)。我只是将这两个想法进行对比以表明清楚。
将您需要的内容复制到临时目录中。这样,您可以将'directories_to_zip'属性设置为一个文件夹,例如:
directories_to_zip = 'ziptemp/all.my.stuff.copied.here/'
(这是您当前的策略)
使用directories_to_zip
属性作为原始目录的过滤器(它是一个带有多个目录的数组,因此不能因为假设它应该以这种方式工作而受到指责)。然后,您可以使用各种属性来过滤所需的文件/文件夹。
要解决您的问题,那么,您可以采用策略A.实际上,除非存在任何特殊问题(PC速度慢,磁盘空间非常低),我认为这将是一种稍微强大的方法。关于它,因为你可以确定你正在压缩的是你正在复制的东西,可以通过检查ziptemp目录来验证。
顺便说一下,我可以肯定策略A是有效的,因为我使用它(使用Albacore)为我们的安装程序压缩文件。
答案 1 :(得分:0)
我使用'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)
}
}
我知道它已经很晚了,但我希望这对某人有所帮助。