Ruby 如何编写只包含特定文件夹和文件夹本身的Albacore zip任务?

Ruby 如何编写只包含特定文件夹和文件夹本身的Albacore zip任务?,ruby,rake,albacore,Ruby,Rake,Albacore,我正在尝试使用Albacore的技术来压缩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)

我正在尝试使用Albacore的技术来压缩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文件,而不是文件夹本身,这显然是不可取的

接下来,我尝试将
flant\u zip
字段翻转为false(这不是一个文档化字段,但您可以在中找到它)。这产生了一个包含上述文件夹的zip,但位于整个
/src/website/
文件夹层次结构的底部。我希望上面的文件夹位于zip的根目录下,因此这也不起作用

因此,我的下一个镜头是,使用
排除
,这也是没有记录的:

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/
添加到
排除
数组中时,它还导致AutoMapper.dll和StructureMap.dll(当然)也从bin文件夹中排除


我应该如何编辑上述任务,使我的zip根目录中只有我想要的文件夹和文件?

您可以将所有需要的文件和文件夹复制到临时目录中,然后将其压缩。换言之,将属性
directories\u to_zip
设置为一个文件夹,该文件夹中已复制了所有正确的文件,其中复制代码是执行所有筛选的关键。我认为这是未指明的预期用途(以及我使用它的方式)。我将把这两个想法进行对比,以清楚地说明这一点

策略A:复制文件夹结构 将所需内容复制到临时目录中。这样,您可以将“directories\u to\u zip”属性设置为一个文件夹,例如:

directories_to_zip = 'ziptemp/all.my.stuff.copied.here/'
策略B:使用过滤器 (这是您当前的战略)

使用
directories\u to\u zip
属性作为原始目录的筛选器(它是一个包含多个目录的数组,因此您不会因为假设它应该以这种方式工作而受到责备)。然后使用各种属性筛选所需的文件/文件夹

可能的解决方案 为了解决你的问题,你可以采用策略A。事实上,除非这有什么特别的问题(电脑速度慢,磁盘空间低得惊人),否则我会认为这是一种更稳健的方法,因为你可以确定你正在压缩的正是你正在复制的,可以通过检查ziptemp目录来验证


顺便说一句,我可以肯定策略A是有效的,因为我使用它(与Albacore一起)为我们的安装人员压缩文件。

我在使用“Albacore”时遇到同样的问题,我想压缩一个名为“tools”的文件夹(不仅仅是内容),将其存储在一个名为“out”的文件夹中,并将其命名为“tools.zip…”。。。所以我用了这个

require 'zip/zipfilesystem'

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

我知道现在已经很晚了,但我希望这能对其他人有所帮助。

不幸的是,您偶然发现了albacore中使用最少、更新最少的任务之一。我可以立即更新文档以包含缺少的属性。要获得您想要的其他功能(我同意,它应该是这样工作的)需要做更多的工作。不过,我会看看我能找到什么解决办法。酷!我真的很感激。:)回顾过去,战略A似乎显而易见。哦!有空的时候我会试一试的,谢谢。:)