MSBuild将多个输入批处理到每个输出中

时间:2011-08-03 18:04:41

标签: msbuild

使用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转换发生在表达式求值之前。

除了编写自己的依赖项检查之外,还有其他解决方案吗?

1 个答案:

答案 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>