2016-05-12 77 views
2

需要一些MSBuild代码的帮助。MSBuild合并项目组

我想用不同的设置生成4个app.config文件,并为QA和生产创建2个设置文件。

每个设置文件将有2个物理安装(生产线)。

因此,QA设置应该包括2个应用程序配置,其中生产线1和2的qa设置与生产设置相同。

这是我迄今为止的msbuild的摘录。

<ItemGroup> 
    <BuildEnvironment Include="QA"> 
    <Server>qa-server</Server> 
    <BuildEnvironment/> 
    <BuildEnvironment Include="Prod"> 
    <Server>prod-server</Server> 
    <BuildEnvironment/> 

    <Line Include="1"> 
    <Setting>A</Setting> 
    </Line> 
    <Line Include="2"> 
    <Setting>B</Setting> 
    </Line> 
<ItemGroup> 

<Target Name="PublishSetup" Inputs="@(BuildEnvironment)" Outputs="%(BuildEnvironment.Identity)"> 
    <!-- Doesn't work at all --> 
    <ItemGroup> 
    <AppConfig Include="@(BuildEnvironment);@(Line)"> 
     <Path>$(MyOutDir)\App.Config-%(Identity)</Path> 
    </AppConfig> 
    </ItemGroup> 

    <!-- Copy app.config to the four new files --> 
    <Copy SourceFiles="$(AppConfigFile)" DestinationFiles="%(AppConfig.Path)" />  

    <!-- Update each new app.config with XmlUpdate (community task), something like the following --> 
    <XmlUpdate XmlFileName="%(AppConfig.Path)" XPath=".." Value="%(AppConfig.Server)" /> 
    <XmlUpdate XmlFileName="%(AppConfig.Path)" XPath=".." Value="%(AppConfig.Setting)" /> 

    <!-- Build 2 setup.exe, one for qa and one prod using a Exec-task passing in qa and prod as command line argument --> 
    <Exec Command="setupcompiler.exe /d%(BuildEnvironment.Identity)" /> 
</Target> 

4个所得app.configs应该是这样的

app.config-QA-1 
<connectionstring datasource="qa-server" ../> 
<applicationSetting name="aName" value="A" /> 

app.config-QA-2 
<connectionstring datasource="qa-server" ../> 
<applicationSetting name="aName" value="B" /> 

app.config-Prod-1 
<connectionstring datasource="prod-server" ../> 
<applicationSetting name="aName" value="A" /> 

app.config-Prod-2 
<connectionstring datasource="prod-server" ../> 
<applicationSetting name="aName" value="B" /> 
+0

你的XML有语法错误,你可以先确定它是有效的msbu ild,并且更清楚地说明生成的AppConfig究竟应该是什么样子(例如,如果您手动将它声明为ItemGroup)? – stijn

+1

感谢您的评论,我已更新问题。希望它现在更有意义。 – Karsten

回答

2

的想法是先建立一个“跨产品”中,含有4种组合的的ItemGroup。可以通过组合两个组的@和%来完成,如here所示。然后在第二步中使用基于现有元数据的额外元数据填充ItemGroup(添加元数据只是再次声明组并添加元数据)。这是有点棘手,因为从Line你们都想要IdentitySetting - 我不知道一个很好的msbuild方式做到这一点,所以我诉诸建立一个字符串与身份|设置,然后分裂|稍后的。

<Target Name="PublishSetup"> 
    <ItemGroup> 
    <AppConfig Include="@(BuildEnvironment)"> 
     <Mod>%(Line.Identity)|%(Line.Setting)</Mod> 
    </AppConfig> 
    <AppConfig> 
     <Line>$([System.String]::Copy('%(Mod)').Split('|')[0])</Line> 
     <Setting>$([System.String]::Copy('%(Mod)').Split('|')[1])</Setting> 
    </AppConfig> 
    <AppConfig> 
     <Path>app.config-%(Identity)-%(Line)</Path> 
    </AppConfig> 
    </ItemGroup> 

    <Message Text="Path=%(AppConfig.Path) Server=%(AppConfig.Server) Setting=%(AppConfig.Setting)" /> 
</Target> 

输出:

路径=的app.config-QA-1服务器= QA-服务器设定= A
路径=的app.config-PROD-1服务器= PROD - 服务器环境=一个
路径=的app.config-QA-2服务器= QA-服务器设置= B
路径=的app.config-PROD-2服务器= PROD-服务器设置= B