質問

いくつかの場所にコピーしたいディレクトリを取得しました。

持っていると言ってください

  • ホーム.aspx

にコピーしたいです

  • abc/home.aspx
  • def/home.aspx
  • ghi/home.aspx

そこで私に2つの質問があります:

  • リスト abc、def、ghi を定義するにはどうすればよいですか?
  • このリストの各要素を使用してコピー タスクを実行するにはどうすればよいですか?
役に立ちましたか?

解決

ここにあなたが探していたものを示している、私は一緒に入れていること、実際の例です。

<?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 の高度なトピックですが、明らかに無視されています。私自身、それについて十分に書かなかった罪を認めなければなりません。優れたバッチ処理リソースがいくつかあります。以下にリストします。


ここでは、私が投稿した他のバッチ処理関連のブログ エントリをいくつか紹介します。

ありがとう、イブラヒム・ハシミと言った

私の本: Microsoft ビルド エンジンの内部:MSBuild と Team Foundation ビルドの使用

あなたは本当にむしろマジックボックスとしてMSBUILDを処理するよりも、学習運動として自分自身をこれをやってオフに最適です。 パトリックSmacchiaするからこの記事では、あなたに含まれる技術のほとんどを提供します。

次に、このリスト(@Destination)でコピータスクを起動します。あなたは目的地のリスト( "<宛先> ABC ...など)を構築itemgroupを持っています。

私はあなたがそれを検索した場合、あなたはたくさんの例を見つけることができます確信しています。 http://keithhill.spaces.live.com/?_c11_BlogPart_BlogPart= blogview&_c =ブログパーツ&partqs =猫%3dMSBuildする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top