如何在MSBuild ItemGroups的"循环"中执行EXEC任务?

Jos*_*off 44 msbuild

如何在MSBuild ItemGroups的"循环"中执行EXEC任务?

而不是一遍又一遍地重复这个命令,如下:

    <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" />
Run Code Online (Sandbox Code Playgroud)

我宁愿定义一个ItemGroup而只是执行一个"循环".我把ItemGroup放下了:

<ItemGroup>
    <CachedTables Include="account" />
    <CachedTables Include="services" />
    <CachedTables Include="servicesGroup" />
    <CachedTables Include="servicesCategory" />
Run Code Online (Sandbox Code Playgroud)

但是由于MSBuild的语法非常不直观,我不知道如何在上面的ItemGroup作为输入的循环中执行Exec任务.

Bri*_*ler 49

有两种方法可以做到这一点,都是"批处理"的形式

您可以批量处理目标并执行Exec和其他操作,

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

另一种是在Exec任务上使用任务批处理.它很相似,

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

不同之处在于它们的运作方式.对于第一个,因为批处理是针对整个目标(使用Outputs属性实现),Exec任务,然后SomeOtherTask将对组中的每个项执行.换一种说法,

Exec with "account"
SomeOtherTask with "account"
Exec with "services"
SomeOtherTask with "services"
...
Run Code Online (Sandbox Code Playgroud)

第二个选项,分别批处理每个任务,将产生以下顺序,

Exec with "account"
Exec with "services"
...
SomeOtherTask with "account"
SomeOtherTask with "services"
...
Run Code Online (Sandbox Code Playgroud)

  • 以下是相关的MSDN链接,只有在阅读了Brian的回答后才能找到它:[MSBuild batching](http://msdn.microsoft.com/en-us/library/ms171473.aspx),[转换](http ://msdn.microsoft.com/en-us/library/ms171476.aspx)和[item metadata](http://msdn.microsoft.com/en-us/library/ms171474.aspx). (4认同)

Ada*_*dam 32

如果我理解这个问题,可以更简单地完成.以下示例使用<Exec />回显<ItemGroup />中的每个项目

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

  <Target Name="MyTarget">
    <Exec Command="echo %(MySpecialItem.Identity)"/>
  </Target>
Run Code Online (Sandbox Code Playgroud)