MSBuild пакетирует несколько входов в каждый выход - PullRequest
8 голосов
/ 03 августа 2011

Можно ли проверять зависимость нескольких входов для каждого выхода при использовании пакетирования 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-> items происходит до вычисления выражения.

Есть ли какое-либо решение, кроме написания моей собственной проверки зависимостей?

1 Ответ

18 голосов
/ 04 августа 2011

Проверка нескольких зависимостей работает, если группа элементов настроена наоборот с результатом компиляции в виде метаданных.

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...