2012-07-04 21 views
6

tôi có một danh sách các dự án trong tập tin MSBuild tôi:Thêm MSBuild batched đầu ra nhiệm vụ như mục siêu dữ liệu

<ItemGroup> 
    <SubProject Include="**\*.csproj" /> 
</ItemGroup> 

Và bây giờ, tôi muốn thiết lập, trên từng dự án, nó TargetPath trong một tài sản siêu dữ liệu cho mỗi dự án.

Tôi đã biết làm thế nào để trích xuất các đường dẫn đích cho từng dự án, và đặt nó trên một danh sách các mặt hàng riêng biệt:

<Target Name="ExtractTargetPaths"> 
    <MSBuild Projects="%(SubProject.Identity)" Targets="GetTargetPath"> 
     <Output TaskParameter="TargetOutputs" ItemName="SubProjectTargetPath" /> 
    </MSBuild> 
</Target> 

Tuy nhiên, tôi muốn để có thể truy cập rằng "SubProjectTargetPath" như siêu dữ liệu trên các mặt hàng SubProject thay vì có một danh sách các mục riêng biệt.

Tức là, thay vì viết, ví dụ: này:

<SomeTask Parameter="%(SubProjectTargetPath.Identity)" /> 

tôi sẽ có thể viết một cái gì đó như:

<SomeTask Parameter="%(SubProject.TargetPath)" /> 

Trả lời

5

OK, tôi đã tìm thấy một giải pháp, đó là sử dụng mục tiêu trạm trộn, với một tài sản tạm thời:

<ItemGroup> 
    <SubProject Include="**\*.csproj" /> 
</ItemGroup> 

<Target Name="UpdateSubProjectMetadata" Outputs="%(SubProject.Identity)"> 
    <!-- Retrieves the Target DLL path and puts it in the temporary property "_TempTargetPath" --> 
    <MSBuild Projects="%(SubProject.Identity)" Targets="GetTargetPath"> 
     <Output TaskParameter="TargetOutputs" PropertyName="_TempTargetPath" /> 
    </MSBuild> 

    <!-- Set the metadata item for TestProject to the value of the temporary property --> 
    <ItemGroup> 
     <SubProject Condition="'%(SubProject.Identity)' == '%(Identity)'" > 
      <TargetPath>$(_TempTargetPath)</TargetPath> 
     </SubProject> 
    </ItemGroup> 
    <!-- Clear the temporary property --> 
    <PropertyGroup> 
     <_TempTargetPath></_TempTargetPath> 
    </PropertyGroup> 
</Target> 

Khi mục tiêu đó đã chạy, TargetPath khả dụng trên mọi mục siêu dữ liệu.

lưu ý thực hiện: Đoạn mã trên chỉ được thử nghiệm cho MSBuild 4,0 - Tôi nghĩ rằng nó hoạt động như là trên MSBuild 3.5, và người sử dụng các phiên bản trước sẽ sử dụng <CreateItem><CreateProperty> nhiệm vụ thay vì đặt <PropertyGroup><ItemGroup>.

+0

@ImmoLandwerth: Cảm ơn Immo Landwerth đã đề xuất chỉnh sửa (mặc dù nó bị từ chối - tôi đoán là chỉnh sửa được đề xuất là công cụ sai để sửa lỗi đó). –