いくつかの場所にコピーしたいディレクトリを取得しました。
私が持っていると言う
- home.aspx
コピーしたい
- abc / home.aspx
- def / home.aspx
- ghi / home.aspx
だから私にとって2つの質問:
- リストabc、def、ghiを定義するにはどうすればよいですか?
- このリストの各要素を使用してコピータスクを実行するにはどうすればよいですか?
いくつかの場所にコピーしたいディレクトリを取得しました。
私が持っていると言う
コピーしたい
だから私にとって2つの質問:
これは私がまとめた実際の例で、あなたが探していたものを示しています:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test" ToolsVersion="3.5">
<!--Declare an ItemGroup that points to your file you want to copy.-->
<ItemGroup>
<ItemToCopy Include=".\Home.aspx" />
</ItemGroup>
<!--Declare an ItemGroup that points to your destination Locations-->
<ItemGroup>
<DestLocations Include=".\abc\home.aspx" />
<DestLocations Include=".\def\home.aspx" />
<DestLocations Include=".\ghi\home.aspx" />
</ItemGroup>
<Target Name="CopyFiles">
<!--Run the copy command to copy the item to your dest locations-->
<!--This is where the magic happens. The % sign before the DestLocations reference says to use
Batching. So Copy will be run for each unique FullPath MetaData in the DestLocations ItemGroup.-->
<Copy SourceFiles="@(ItemToCopy)" DestinationFolder="%(DestLocations.FullPath)" />
</Target>
</Project>
注目すべき概念は、バッチ処理として知られています。
この正確なシナリオについては、 http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspxのブログで取り上げました。
これがそのブログ エントリのテキストです。上記のリンクから上記のファイルをダウンロードできます。
今日、誰かが MSBuild で問題を抱えている同僚について話してくれました。彼は、一連のファイルを一連の異なるサーバーにコピーしようとしていると私に言いました。しかし問題は、複数回のコピー タスク呼び出しを実行せずにこれを達成する方法を知らなかったことです。私は彼に、MSBuild のバッチ処理を使用してこれを達成できると伝えました。バッチ処理は、一連のアイテム (バッチ) に対して一度にタスク (またはターゲット) を実行するプロセスです。バッチには、単一のアイテムを含めることもできます。したがって、このシナリオでは、デプロイ先のサーバーごとに 1 回コピーを実行する必要があります。これを 2 つの異なる方法で示す単純な msbuild ファイルを作成しました。最初の方法では、テスト ターゲットで確認できるタスクのバッチ処理を使用します。もう 1 つは、DoItCore ターゲットで確認できるターゲット バッチ処理を使用します。クリーン ターゲットも作成しました。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test">
<ItemGroup>
<SourceFiles Include="*.txt"/>
<Dest Include="One;Two;Three;Four;Five"/>
</ItemGroup>
<Target Name="Test">
<Copy SourceFiles ="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
<Message Text="Fullpath: %(Dest.FullPath)"/>
</Target>
<!-- These targets demonstrate target batching -->
<Target Name="DoIt" DependsOnTargets="DoItCore"/>
<Target Name="DoItCore" Inputs="@(SourceFiles)" Outputs="%(Dest.FullPath)">
<Copy SourceFiles="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
</Target>
<!-- This will clean up the files -->
<Target Name="Clean">
<CreateItem Include="%(Dest.FullPath)\**\*">
<Output ItemName="FilesToDelete" TaskParameter="Include"/>
</CreateItem>
<Delete Files="@(FilesToDelete)"/>
</Target>
</Project>
バッチ処理は MSBuild の高度なトピックであり、明らかに無視されています。私はそれについて自分で十分に書いていないことに罪を犯していることを認めなければなりません. 優れたバッチ リソースがいくつかあります。それらを以下に示します。
私が投稿した他のバッチ処理関連のブログ エントリを次に示します。
ありがとう、サイード・イブラヒム・ハシミ
My Book: Microsoft Build Engine の内部 : MSBuild と Team Foundation Build の使用
この宛先のリスト( "<Destination> abc </ Destionation> ...など)を作成するアイテムグループを作成します。次に、このリスト(@Destination)を使用してコピータスクを呼び出します。
検索するとたくさんの例が見つかると思います。http://keithhill.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3dMSBuild
MSBUILD を魔法の箱として扱うのではなく、自分でこれを学習演習として行うのが最善です。 Patrick Smacchia によるこの記事では、関連するテクニックのほとんどを紹介しています。