Visual studio 2012 在自定义MSBuild文件中对项目/解决方案生成和cmd文件执行排序

Visual studio 2012 在自定义MSBuild文件中对项目/解决方案生成和cmd文件执行排序,visual-studio-2012,msbuild,msbuild-task,msbuild-propertygroup,msbuild-target,Visual Studio 2012,Msbuild,Msbuild Task,Msbuild Propertygroup,Msbuild Target,我需要结合一系列步骤,包括构建解决方案、项目和使用自定义MSBuild文件运行.cmd文件 我的第一关如下: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration>Release</Configuration> <Platform>AnyCPU</Plat

我需要结合一系列步骤,包括构建解决方案、项目和使用自定义MSBuild文件运行.cmd文件

我的第一关如下:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
      <Configuration>Release</Configuration>
      <Platform>AnyCPU</Platform>
   </PropertyGroup>
   <ItemGroup>
      <ProjectsToBuild Include="..\Hosts\solution1.sln"></ProjectsToBuild>
      <ProjectsToBuild Include="..\..\solution2.sln"></ProjectsToBuild>
      <ProjectsToBuild Include="helper1.csproj"></ProjectsToBuild>
      <ProjectsToBuild Include="..\..\Sandboxes\helper2.sln"></ProjectsToBuild>
      <Exec Include="" Command="CALL GetFiles.cmd"/>
      <ProjectsToBuild Include="wix\proc\prod.wixproj"></ProjectsToBuild>
      <Exec Command="CALL final.cmd"/>
   </ItemGroup>
   <Target Name="Build">
      <MSBuild Projects="@(ProjectsToBuild)" Targets="Build">
        <Output ItemName="ProjectOutputs" TaskParameter="TargetOutputs"/>
    </MSBuild>
    <Message Text="@ProjectOutputs"/>
   </Target>       
</Project>

释放
任意CPU
这导致了一个错误,因为Exec元素位于错误的位置

基本上,我需要依次构建solution1.sln、solution2.sln、helper1.csproj和helper2.sln,然后运行文件GetFiles.cmd,然后构建prod.wixproj,然后运行最终的.cmd文件


我查看了MSDN(,),浏览了各种stackoverflow问题(包括,,),但没有一个能完全解决我要做的事情。这是我第一次使用MSBuild,因此可能遗漏了一些内容。将欣赏任何指针…

由于ItemGroup节点可以是目标节点的子节点,请将这些ItemGroup成员分解为单独的目标,然后使用DefaultTargets属性控制构建这些节点的顺序

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Target1;Target2;Target3" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5" >
    <Target Name="Target1">
        <Message Text="Target 1" />
    </Target>
    <Target Name="Target2">
        <Message Text="Target 2" />
    </Target>
    <Target Name="Target3">
        <Message Text="Target 3" />
    </Target>
</Project>

由于项目组节点可以是目标节点的子节点,请将这些项目组成员分解为单独的目标,然后使用DefaultTargets属性来控制构建这些节点的顺序

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Target1;Target2;Target3" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5" >
    <Target Name="Target1">
        <Message Text="Target 1" />
    </Target>
    <Target Name="Target2">
        <Message Text="Target 2" />
    </Target>
    <Target Name="Target3">
        <Message Text="Target 3" />
    </Target>
</Project>

构建项目的顺序已经正确,请参见:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>AnyCPU</Platform>
  </PropertyGroup>
  <ItemGroup>
    <ProjectsToBuild Include="..\Hosts\solution1.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="..\..\solution2.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="helper1.csproj"></ProjectsToBuild>
    <ProjectsToBuild Include="..\..\Sandboxes\helper2.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="wix\proc\prod.wixproj"></ProjectsToBuild>

  </ItemGroup>
  <Target Name="Build">
    <Exec Command="CALL GetFiles.cmd"/>
    <Message Text="Build order: %(ProjectsToBuild.Identity)"/>

    <MSBuild Projects="@(ProjectsToBuild)" Targets="Build">
      <Output ItemName="ProjectOutputs" TaskParameter="TargetOutputs"/>
    </MSBuild>
     <Message Text="@(ProjectOutputs)"/>

    <<Exec Command="CALL final.cmd"/>
  </Target>
</Project>

释放
任意CPU

生成项目的顺序已经正确,请参见:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>AnyCPU</Platform>
  </PropertyGroup>
  <ItemGroup>
    <ProjectsToBuild Include="..\Hosts\solution1.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="..\..\solution2.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="helper1.csproj"></ProjectsToBuild>
    <ProjectsToBuild Include="..\..\Sandboxes\helper2.sln"></ProjectsToBuild>
    <ProjectsToBuild Include="wix\proc\prod.wixproj"></ProjectsToBuild>

  </ItemGroup>
  <Target Name="Build">
    <Exec Command="CALL GetFiles.cmd"/>
    <Message Text="Build order: %(ProjectsToBuild.Identity)"/>

    <MSBuild Projects="@(ProjectsToBuild)" Targets="Build">
      <Output ItemName="ProjectOutputs" TaskParameter="TargetOutputs"/>
    </MSBuild>
     <Message Text="@(ProjectOutputs)"/>

    <<Exec Command="CALL final.cmd"/>
  </Target>
</Project>

释放
任意CPU

您可以使用目标来控制构建解决方案的顺序@尼克卡森,谢谢。但如何将ItemGroup链接到目标?ItemGroup也可以是目标的子节点。每个目标可以有自己负责的项目组。您可以在该级别上指定构建顺序,也可以通过该级别上的各种*Targets属性来指定。(下面)您可以使用目标来控制构建解决方案的顺序@尼克卡森,谢谢。但如何将ItemGroup链接到目标?ItemGroup也可以是目标的子节点。每个目标可以有自己负责的项目组。您可以在该级别上指定构建顺序,也可以通过该级别上的各种*Targets属性来指定。(下面)我需要在building helper2.sln和prod.wixproj之间运行GetFiles.cmd。如果我错了,请纠正我的错误,但您的答案似乎不是这样。如果是这样,则需要拆分项目组并使用每个项目组调用msbuild目标。我需要在building helper2.sln和prod.wixproj之间运行GetFiles.cmd。如果我错了,请纠正我,但您的答案似乎不是这样。如果是这样,则需要拆分itemgroup并使用每个itemgroup调用msbuild目标。