2011-08-03 34 views
8

Có thể kiểm tra phụ thuộc nhiều đầu vào cho mỗi đầu ra khi sử dụng tính năng tạo nhóm MSBuild không?MSBuild trộn nhiều đầu vào vào mỗi đầu ra

tôi nghĩ rằng tôi đã tìm thấy một giải pháp cho điều này bằng cách xây dựng danh sách đầu vào của tôi trong siêu dữ liệu của tập tin đầu ra, như sau:

<ItemGroup> 
    <Foo Include="output1"> 
    <Inputs>input1a;input1b</Inputs> 
    </Foo> 
    <Foo Include="output2"> 
    <Inputs>input2a;input2b</Inputs> 
    </Foo> 
</ItemGroup> 

<Target Name="_CompileFoo" Outputs="@(Foo)" Inputs="%(Foo.Inputs)"> 
    <FooCompiler Src="%(Foo.Inputs)" Out="@(Foo)" /> 
</Target> 

Tuy nhiên, MSBuild phàn nàn rằng các tập tin "input1a; input1b" làm không tồn tại. Dường như việc chuyển đổi chuỗi ký tự diễn ra trước khi đánh giá biểu thức.

Có giải pháp nào khác ngoài việc viết kiểm tra phụ thuộc của riêng tôi không?

+0

Hãy thử dùng thuộc tính 'Đầu ra' và' Mục tiêu đầu vào'. – Mrchief

+0

Sau đó, nó sẽ không làm kiểm tra phụ thuộc, nó sẽ luôn luôn chạy FooCompiler cho mỗi mục. –

+0

Kiểm tra sự phụ thuộc ở đâu? – Mrchief

Trả lời

18

Kiểm tra nhiều phụ thuộc hoạt động nếu nhóm mục được thiết lập theo cách khác với kết quả biên dịch dưới dạng siêu dữ liệu.

<ItemGroup> 
    <Foo Include="input1a"> 
    <Result>output1</Result> 
    </Foo> 
    <Foo Include="input1b"> 
    <Result>output1</Result> 
    </Foo> 
    <Foo Include="input2a"> 
    <Result>output2</Result> 
    </Foo> 
    <Foo Include="input2b"> 
    <Result>output2</Result> 
    </Foo> 
</ItemGroup> 

<Target Name="_CompileFoo" Inputs="@(Foo)" Outputs="%(Result)"> 
    <FooCompiler Overwrite="true" Src="@(Foo)" Out="%(Foo.Result)"/> 
</Target> 

Và thay vì bằng tay chuyển đổi nhóm Foo mục, bạn có thể chuyển đổi này vào một mục tiêu điều kiện tiên quyết xây dựng một nhóm mục mới _Foo như sau.

<ItemGroup> 
    <Foo Include="output1"> 
    <Inputs>input1a;input1b</Inputs> 
    </Foo> 
    <Foo Include="output2"> 
    <Inputs>input2a;input2b</Inputs> 
    </Foo> 
</ItemGroup> 

<Target Name="_PrepareItemsForCompileFoo"> 
    <ItemGroup> 
    <_Foo Include="%(Foo.Inputs)"> 
     <Result>%(Foo.Identity)</Result> 
    </_Foo> 
    </ItemGroup> 
</Target> 

<Target Name="_CompileFoo" DependsOnTargets="_PrepareItemsForCompileFoo" Inputs="@(_Foo)" Outputs="%(Result)"> 
    <FooCompiler Overwrite="true" Src="@(_Foo)" Out="%(_Foo.Result)"/> 
</Target> 
+0

Điều đó làm việc hoàn hảo, cảm ơn! Các mục trong ví dụ của tôi đã thực sự được tạo bằng cách tổng hợp các mục khác bằng cách sử dụng tác vụ C#. Nhờ ví dụ thứ hai của bạn, tôi đã có thể loại bỏ nó. –

Các vấn đề liên quan