MSBuild使用ItemGroup和EXEC命令

oba*_*sta 2 msbuild command exec

我创建了代码片段中显示的ItemGroup.我需要迭代这个ItemGroup并运行EXEC命令 - 也显示在代码片段中.我似乎无法让它发挥作用.代码返回下面显示的错误(注意 - 消息写入2次,这是正确的),但EXEC命令未正确运行.该值未设置; 因此EXEC根本没有执行.我需要EXEC执行两次,或者我在ItemGroup中定义的部分.

错误:加密WebServer appSettings部分加密WebServer connectionStrings部分C:\ WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef"""\ gaw\UI"-prov"RSACustomProvider"加密配置部分...找不到配置部分''.

代码链:

<ItemGroup>
    <SectionsToEncrypt Include="Item">
      <Section>appSettings</Section>     
    </SectionsToEncrypt>
    <SectionsToEncrypt Include="Item">     
      <Section>connectionStrings</Section>
    </SectionsToEncrypt>  
  </ItemGroup>

  <Target Name="EncryptWebServerWebConfigSections">   
    <Message Text="Encrypting WebServer %(SectionsToEncrypt.Section) section" />

    <Exec Command="$(AspNetRegIis) -pef &quot;%(SectionsToEncrypt.Section)&quot; &quot;$(DropLocation)\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\$(AnythingPastFlavorToBuild)&quot; -prov &quot;$(WebSiteRSACustomProviderName)&quot;"/>
  </Target>
Run Code Online (Sandbox Code Playgroud)

Say*_*imi 5

问题是您一次批量处理2个项目.我的意思是你有陈述

%(SectionsToEncrypt.Section)
%(ConfigurationToBuild.FlavorToBuild)
Run Code Online (Sandbox Code Playgroud)

在同一个任务调用中.在同一任务调用中一次批处理多个项目时,它们将独立批处理.这就是为什么你的错误说明配置部分'' ......

如果您的FlavorToBuild只有一个值,那么您应该在调用Exec之前将其填充到属性中,然后使用该属性.所以你的一个班轮将转换为:

<PropertyGroup>
    <_FlavToBuild>%(ConfigurationToBuild.FlavorToBuild)<_FlavToBuild>
</PropertyGroup>
<Exec Command="$(AspNetRegIis) -pef &quot;%(SectionsToEncrypt.Section)&quot; &quot;$(DropLocation)\$(BuildNumber)\$(_FlavToBuild)\$(AnythingPastFlavorToBuild)&quot; -prov &quot;$(WebSiteRSACustomProviderName)&quot;"/>
Run Code Online (Sandbox Code Playgroud)

如果FlavorToBuild有多个值,那么它就更复杂了.你有2个选择:

  1. 硬编码Exec不止一次
  2. 使用带有任务批处理的目标批处理来执行foreach/foreach

批处理是MSBuild最令人困惑的元素之一.我在http://sedotech.com/Resources#batching上整理了一些在线资源.如果你想了解更多,那么你可以拿一本我的.