【问题标题】:How do I perform the EXEC task in a "loop" with MSBuild ItemGroups?如何使用 MSBuild ItemGroups 在“循环”中执行 EXEC 任务?
【发布时间】:2011-08-27 13:30:23
【问题描述】:

如何使用 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 的语法非常不直观,我不知道如何以上面的 ItemGroup 作为输入循环执行 Exec 任务。

【问题讨论】:

  • 我对此的回答已被删除,但我想郑重声明,自从写下这个问题以来,我的经历让我非常强烈地认为这是一个坏主意:你应该使用像 Psake 或 gulp 这样的工具来做这样的事情。

标签: msbuild


【解决方案1】:

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

您可以批处理一个目标并执行 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"
...

【讨论】:

【解决方案2】:

如果我理解了这个问题,可以更简单地完成。以下示例使用 来回显

中的每个项目
  <ItemGroup>
    <MySpecialItem Include="one" />
    <MySpecialItem Include="two" />
    <MySpecialItem Include="three" />
  </ItemGroup>    

  <Target Name="MyTarget">
    <Exec Command="echo %(MySpecialItem.Identity)"/>
  </Target>

【讨论】:

  • 当您不知道 MySpecialItem 是什么时,您会怎么做,例如,MySPecialItem 将是多行变量的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多