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