特定のフォルダーとフォルダー自体のみを含むAlbacore ZIPタスクを書くにはどうすればよいですか?
質問
私はアバコーレを使用して、レーキビルドのアーティファクトをジップアップしようとしています ziptask. 。私が構築しているソリューションには、個別にジップアップする必要があるアーティファクトがある3つのプロジェクトがありますが、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
フィールドからフォールス(これは文書化されたフィールドではありませんが、で見つけることができます 起源)。これにより、上記のフォルダーが含まれている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も(もちろん)ビンフォルダーから除外されました。
上記のタスクのいずれかを編集して、ZIPのルートで必要なフォルダーとファイルのみを持つにはどうすればよいですか?
解決
必要なすべてのファイルとフォルダーをTEMPディレクトリにコピーして、それをzipにすることができます。つまり、プロパティを設定します directories_to_zip
すべての正しいファイルが既にコピーされている1つのフォルダーに - コピーコピー あなたのためのすべてのフィルタリングは何ですか。それは不特定の予想される使用法(そして私がそれを使用する方法)だと思います。私はそれを明確にするために2つのアイデアを対比するだけです。
戦略A:フォルダー構造をコピーします
必要なものをTEMPディレクトリにコピーします。これにより、「Directories_To_Zip」プロパティを1つのフォルダーに設定します。
directories_to_zip = 'ziptemp/all.my.stuff.copied.here/'
戦略B:フィルターを使用します
(これはあなたの現在の戦略です)
使用 directories_to_zip
元のディレクトリ上のフィルターとしてのプロパティ(複数のディレクトリを使用する配列であるため、このように機能することを想定することで非難することはできませんでした)。次に、さまざまなプロパティを使用して、必要なファイル/フォルダーをフィルタリングします。
可能な解像度
問題を解決するために、戦略Aを採用することができます。実際には、これに並外れた問題がない限り(PCが遅く、ディスクスペースが驚くほど低い)、これは少し堅牢な方法だと思っていたでしょう。あなたがジッピングしているのは、まさにあなたがコピーしているものであることを確認できます。これはZiptempディレクトリをチェックすることで検証できます。
ちなみに、私はそれを(Albacoreで)使用してインストーラーのファイルをzipするため、戦略Aが機能することを確認することができます。
他のヒント
「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)
}
}
私はそれが遅れていることを知っていますが、これが誰かを助けることを願っています。