Как мне выполнить задачу EXEC в «цикле» с MSBuild ItemGroups? - PullRequest
43 голосов
/ 18 мая 2011

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

49 голосов
/ 18 мая 2011

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

Вы можете группировать цель и выполнять 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"
...
32 голосов
/ 14 февраля 2013

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

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

  <Target Name="MyTarget">
    <Exec Command="echo %(MySpecialItem.Identity)"/>
  </Target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...