2012-02-10 13 views
3

にItemGroup内のメタデータの定義の中のよく知られたアイテムのメタデータを参照すると、ここでのMSBuildのスクリプトです:はターゲット

D:\t\File1.txt to dest\File1.txt 
    D:\t\File2.txt to dest\File2.txt 
    D:\t\File3.txt to dest\File3.txt 
    D:\t\File4.txt to dest\File4.txt 

しかし、結果は次のとおりです。私はそれから期待

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="AugmentItemGroup" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
<ItemGroup> 
    <ItmGrp Include="File1.txt"> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
    </ItmGrp> 
    <ItmGrp Include="File2.txt"> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
    </ItmGrp> 
    <ItmGrp Include="File3.txt"> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
    </ItmGrp> 
    </ItemGroup> 

    <Target Name="AugmentItemGroup"> 
    <ItemGroup> 
     <ItmGrp Include="File4.txt"> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
     </ItmGrp>   
    </ItemGroup> 
    <Message Text="%(ItmGrp.FullPath) to %(ItmGrp.Dest)" /> 
    </Target> 
</Project> 

出力されます:

D:\t\File1.txt to dest\File1.txt 
    D:\t\File2.txt to dest\File2.txt 
    D:\t\File3.txt to dest\File3.txt 
    D:\t\File4.txt to dest\File1.txt 
    D:\t\File4.txt to dest\File2.txt 
    D:\t\File4.txt to dest\File3.txt 

なぜ%(FileName)%(Extension)よく知られているメタデータreferenの振る舞いがありますItemGroupがターゲットの内部にあるときは、ceは異なりますか?

ターゲット内で「ターゲット外」動作を取得することは可能ですか?

答えて

5

これは、あなたが望む出力を与えます。それは一般的なケースでは正しいアプローチではないかもしれないけれども、それが習慣にすることによって、「FILE4」で発生したバッチ処理を回避していて計算された項目定義の一部メタデータ:

<Project 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    DefaultTargets="AugmentItemGroup" 
    ToolsVersion="4.0"> 
    <ItemDefinitionGroup> 
     <ItmGrp> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
     </ItmGrp> 
    </ItemDefinitionGroup> 

    <ItemGroup> 
     <ItmGrp Include="File1.txt" /> 
     <ItmGrp Include="File2.txt" /> 
     <ItmGrp Include="File3.txt" /> 
    </ItemGroup> 

    <Target Name="AugmentItemGroup"> 
     <ItemGroup> 
     <ItmGrp Include="File4.txt" /> 
     </ItemGroup> 
     <Message Text="%(ItmGrp.FullPath) to %(ItmGrp.Dest)" /> 
    </Target> 
</Project> 

編集:

を71

、#70 MSBuild Trickeryトリックより抜粋

<Project ...> 
    <ItemDefinitionGroup> 
     <ItmGrp> 
      <_Dest /> 
     </ItmGrp> 
    </ItemDefinitionGroup> 

    <ItemGroup> 
     <ItmGrp Include="File1.txt"><Dest>dest1</Dest></ItmGrp> 
     <ItmGrp Include="File2.txt"><Dest>dest2</Dest></ItmGrp> 
     <ItmGrp Include="File3.txt"><Dest>dest3</Dest></ItmGrp> 
    </ItemGroup> 

    <Target Name="AugmentItemGroup"> 
     <ItemGroup> 
      <ItmGrp Include="File4.txt"><Dest>dest4</Dest></ItmGrp> 
      <ItmGrp> 
      <_Dest>%(Dest)\%(FileName)%(Extension)</_Dest> 
      </ItmGrp> 
     </ItemGroup> 
     <Message Text="%(ItmGrp.FullPath) to %(ItmGrp._Dest)" /> 
    </Target> 
</Project> 

:(コメントは以下の言うように)各項目は、%(取引先)に異なる値を持つ場合

は、あなただけの最終計算値を作成する必要があります3210

+0

このアプローチの問題は、「dest」部分が項目ごとに異なるため、同じ定義をグループ内のすべての項目に適用できないことです。 – axk

+1

これで、上記の2番目の方法を試してみてください。 Dest vs. _Destの使用に注意を払う –

+0

これは全く別の仕事で私を助けました、ありがとう。また、本のリンクについては、私はそれを購入するつもりです。 –

関連する問題