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

如何在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" /> 

我宁愿定义一个ItemGroup,只是执行一个“循环”。 我已经得到了ItemGroup:

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

但是,由于MSBuild的令人惊讶的不直观的语法,我不知道如何执行Exec任务在一个循环与上面的ItemGroup作为input。

有两种方法可以做到这一点,都是“配料”

您可以批量执行目标并执行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" ... 

如果我明白这个问题,可以简单一点。 以下示例使用<Exec /> 来回显<ItemGroup />中的每个项目

  <ItemGroup> <MySpecialItem Include="one" /> <MySpecialItem Include="two" /> <MySpecialItem Include="three" /> </ItemGroup> <Target Name="MyTarget"> <Exec Command="echo %(MySpecialItem.Identity)"/> </Target>