Как мне выполнить задачу 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>