Подтвердить что ты не робот

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

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

Вместо повторения этой команды снова и снова, так:

    <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 выше в качестве ввода.

4b9b3361

Ответ 1

Есть два способа сделать это: обе формы "пакетного"

Вы можете выполнить задание и выполнить 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"
...

Ответ 2

Если я понимаю вопрос, это можно сделать немного проще. В следующем примере < Exec/ " > используется для выделения каждого элемента в < ItemGroup/" >

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

  <Target Name="MyTarget">
    <Exec Command="echo %(MySpecialItem.Identity)"/>
  </Target>