使用MSBuild批处理时,是否可以依赖检查每个输出的多个输入?
我以为我通过在输出文件的元数据中构建输入列表找到了解决方案,如下所示:
<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>
但是,MSBuild抱怨文件“input1a; input1b”不存在。似乎string-&gt; items转换发生在表达式求值之前。
除了编写自己的依赖项检查之外,还有其他解决方案吗?
答案 0 :(得分:18)
如果项目组以编译结果的相反方式设置为元数据,则检查多个依赖项是有效的。
<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>
而不是手动转换Foo
项目组,您可以在构建新项目组_Foo
的先决条件目标中对此进行转换,如下所示。
<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>