MSBuild合并项目组

MSBuild合并项目组,msbuild,Msbuild,需要有关此MSBuild代码的帮助 我想生成4个具有不同设置的app.config文件,并为QA和生产创建2个设置文件 每个安装文件将有2个物理安装(生产线) 因此,QA设置应包括2个app.Config,其中包含生产线1和2的QA设置,生产设置也是如此 这里是我到目前为止所拥有的msbuild的摘录 <ItemGroup> <BuildEnvironment Include="QA"> <Server>qa-server</Server&g

需要有关此MSBuild代码的帮助

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

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

因此,QA设置应包括2个app.Config,其中包含生产线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>

qa服务器
prod服务器
A.
B
$(MyOutDir)\App.Config-%(标识)
生成的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" />
app.config-QA-1
app.config-QA-2
app.config-Prod-1
app.config-Prod-2

想法是首先构建一个“交叉产品”,一个包含4种组合的项目组。如图所示,可以将两组的@和%组合起来。然后在第二步中,根据现有元数据使用额外元数据填充ItemGroup(添加元数据只是再次声明组并添加元数据)。这里有点棘手,因为从
Line
开始,你们都想要
Identity
Setting
——我不知道一种很好的msbuild方法,所以我使用Identity |设置构建一个字符串,然后在|上拆分

<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>

%(行标识)|%(行设置)
$([System.String]::复制('%(Mod)')。拆分('|')[0])
$([System.String]::复制('%(Mod)')。拆分('|')[1])
app.config-%(标识)-(行)
输出:

Path=app.config-QA-1服务器=QA服务器设置=A
Path=app.config-Prod-1 Server=Prod Server Setting=A
Path=app.config-QA-2服务器=QA服务器设置=B
Path=app.config-Prod-2服务器=Prod服务器设置=B


您的xml有语法错误,能否先确保它是有效的msbuild,并更清楚地说明生成的AppConfig应该是什么样子(例如,如果手动将其声明为ItemGroup)?谢谢您的评论,我已经更新了问题。希望它现在更有意义。