2010-05-03 104 views
2

我创建了代码片段中显示的ItemGroup。我需要遍历这个ItemGroup并运行EXEC命令 - 也显示在代码片段中。我似乎无法得到它的工作。该代码返回下面显示的错误(注 - 消息被写入2次,这是正确的),但是EXEC命令没有正确运行。价值没有被设置;因此EXEC根本没有执行。我需要EXEC执行两次或通过我在ItemGroup中定义的部分执行。MSBuild使用ItemGroup和EXEC命令

ERROR: 加密Web服务器appSettings部分 加密Web服务器connectionStrings节 C:\ Windows \ Microsoft.NET \框架\ 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> 

回答

5

的问题是,你是在2项同时配料。我的意思是你有这样的说法

%(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. 硬代码Exec的一次
  2. 使用觇配料多与任务批处理执行的foreach /的foreach

配料是的MSBuild的最混乱的因素之一。我在http://sedotech.com/Resources#batching上汇集了一些在线资源。如果你想知道更多,那么你可以拿起我的book的副本。

+1

+1可以强烈推荐这本书 - 用适当的上下游来替代“aha的星期,这样我没有得到”。 – 2010-05-04 22:05:02

+1

书籍推荐+1。这真的很棒。 – chhenni 2012-03-30 08:49:25

+0

对书推荐是+1 +1 – 2012-06-06 20:43:04