Как мне выполнить задачу EXEC в "цикле" с MSBuild ItemGroups?

Как мне выполнить задачу EXEC в "цикле" с MSBuild ItemGroups?

Вместо того, чтобы повторять эту команду снова и снова, вот так:

    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22account%22 -i data\add_sql_cache.sql -b" />
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22services%22 -i data\add_sql_cache.sql -b" />
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22servicesGroup%22 -i data\add_sql_cache.sql -b" />
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22servicesCategory%22 -i data\add_sql_cache.sql -b" />

Я бы лучше определил ItemGroup и просто выполнил "цикл". У меня есть ItemGroup:

<ItemGroup>
    <CachedTables Include="account" />
    <CachedTables Include="services" />
    <CachedTables Include="servicesGroup" />
    <CachedTables Include="servicesCategory" />

Но из-за удивительно не интуитивного синтаксиса MSBuild я понятия не имею, как выполнить задачу Exec в цикле с ItemGroup выше в качестве входных данных.

2 ответа

Есть два способа сделать это, оба являются формами "пакетирования"

Вы можете группировать цель и выполнять Exec и другие операции,

<Target Name="ExecMany"
  Outputs="%(CachedTables.Identity)">
  <Exec
    Command="sqlcmd -S ... TableName=%22%(CachedTables.Identity)%22 -i ..."
    />
  <SomeOtherTask ThatUses="%(CachedTables.Identity)" />
</Target>

Другой - использовать пакетную задачу, только для задачи Exec. Это похоже,

<Target Name="ExecMany">
  <Exec
    Command="sqlcmd -S ... TableName=%22%(CachedTables.Identity)%22 -i ..."
    />
  <SomeOtherTask ThatUses="%(CachedTables.Identity)" />
</Target>

Разница в том, как они будут работать. Во-первых, поскольку пакетирование предназначено для всей цели (достигается с помощью атрибута Outputs), задача Exec, затем SomeOtherTask будет выполняться для каждого элемента в группе. Другими словами,

Exec with "account"
SomeOtherTask with "account"
Exec with "services"
SomeOtherTask with "services"
...

Вторые параметры, объединяющие каждую задачу в отдельности, приведут к следующей последовательности:

Exec with "account"
Exec with "services"
...
SomeOtherTask with "account"
SomeOtherTask with "services"
...

Если я понимаю вопрос, это можно сделать немного проще. В следующем примере используется для отображения каждого элемента в

  <ItemGroup>
    <MySpecialItem Include="one" />
    <MySpecialItem Include="two" />
    <MySpecialItem Include="three" />
  </ItemGroup>    

  <Target Name="MyTarget">
    <Exec Command="echo %(MySpecialItem.Identity)"/>
  </Target>
Другие вопросы по тегам