7

Albacore のZipTaskを使用して、rake ビルドのアーティファクトを圧縮しようとしています。私が構築しているソリューションには、個別に圧縮する必要があるアーティファクトを持つ 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

問題は、このタスクの出力が、フォルダー自体ではなく、これらのフォルダーの内容を含む zip ファイルであることです。これは明らかに望ましくありません。

次に、フィールドを false に切り替えてみました (これは文書化されたフィールドではありませんが、ソースflatten_zipで見つけることができます)。これにより、上記のフォルダーを含む zip が生成されましたが、フォルダー階層全体の最下部にありました。上記のフォルダーをzipのルートに配置したいので、それも機能しません。./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 フォルダーから除外されました。

上記のタスクを編集して、zip のルートに必要なフォルダーとファイルのみを配置するにはどうすればよいですか?

4

2 に答える 2

3

必要なすべてのファイルとフォルダーを一時ディレクトリにコピーし、それを圧縮できます。directories_to_zipつまり、すべての適切なファイルが既にコピーされている 1 つのフォルダーにプロパティを設定します。ここで、コピー コードがすべてのフィルター処理を行います。私はそれが不特定の予想される使用法(および私がそれを使用する方法)だと思います。明確にするために、2つのアイデアを対比します。

戦略 A: フォルダー構造をコピーする

必要なものを一時ディレクトリにコピーします。このようにして、'directories_to_zip' プロパティを 1 つのフォルダーに設定します。

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

戦略 B: フィルターを使用する

(これはあなたの現在の戦略です)

このプロパティを元のディレクトリのフィルターとして使用しdirectories_to_zipます (これは複数のディレクトリを取る配列であるため、このように動作すると仮定しても責められることはありません)。次に、さまざまなプロパティを使用して、必要なファイル/フォルダーをフィルター処理します。

考えられる解決策

あなたの問題を解決するには、戦略 A を採用することができます。実際、これに異常な問題 (PC の処理速度が遅い、ディスク容量が驚くほど少ない) がない限り、私はこれがもう少し堅牢な方法だと思っていたでしょう。 ziptemp ディレクトリを確認することで、zip する内容がコピーする内容と正確に一致することを確認できます。

ちなみに、インストーラーのファイルを圧縮するために (Albacore と共に) 戦略 A を使用しているため、戦略 A が機能することは確かです。

于 2010-12-15T03:25:52.973 に答える
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)
    }
}

遅いことはわかっていますが、これが誰かの役に立てば幸いです。

于 2013-07-15T14:24:53.350 に答える