代码之家  ›  专栏  ›  技术社区  ›  obautista

MSBuild使用ItemGroup和EXEC命令

  •  2
  • obautista  · 技术社区  · 16 年前

    我创建了代码片段中显示的ItemGroup。我需要遍历这个ItemGroup并运行EXEC命令—代码片段中也显示了这一点。我似乎不能让它工作。代码返回如下所示的错误(注意消息被写入了2次,这是正确的),但是EXEC命令没有正确运行。未设置值;因此EXEC根本没有执行。我需要EXEC执行两次或按ItemGroup中定义的部分执行。

    错误: 加密Web服务器连接字符串部分 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet\u 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>
    
    1 回复  |  直到 9 年前
        1
  •  5
  •   Sayed Ibrahim Hashimi    16 年前

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

    %(SectionsToEncrypt.Section)
    %(ConfigurationToBuild.FlavorToBuild)
    

    在同一个任务调用中。当您在同一个任务调用中一次批处理多个项时,它们将独立批处理。这就是为什么您在声明配置部分时出错的原因 '' ...

    如果您的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;"/>
    

    如果FlavorToBuild有多个值,那么就更复杂了。您有两种选择:

    1. 多次硬代码执行
    2. 使用目标批处理和任务批处理来执行foreach/foreach

    批处理是MSBuild中最令人困惑的元素之一。我在网上搜集了一些资源 http://sedotech.com/Resources#batching . 如果你想知道更多,那么你可以拿一份我的 book

    推荐文章