【问题标题】:Sequencing project/solution build and cmd file executing in custom MSBuild file对自定义 MSBuild 文件中执行的项目/解决方案构建和 cmd 文件进行排序
【发布时间】:2013-05-14 00:42:56
【问题描述】:

我需要将一系列步骤联系在一起,包括构建解决方案、项目和使用自定义 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>

这导致错误,因为 Exec 元素位于错误的位置。

基本上,我需要构建 solution1.sln、solution2.sln、helper1.csproj 和 helper2.sln(按顺序),然​​后运行文件 GetFiles.cmd,然后构建 prod.wixproj,然后运行 ​​final.cmd文件。

我看过 MSDN(hereherehere)、a blog,并浏览过各种 stackoverflow 问题(包括thisthisthisthis) ,但他们都没有完全解决我想要做的事情。这是我第一次使用 MSBuild,所以我可能错过了一些东西。将不胜感激任何指针...

【问题讨论】:

  • 您可以使用目标来控制构建解决方案的顺序。 msdn.microsoft.com/en-us/library/vstudio/ee216359.aspx
  • @NickCarlson 谢谢。但是如何将 ItemGroup 链接到 Target?
  • ItemGroup 也可以是 Target 的子节点。每个目标都可以有它自己负责的项目组。您可以在 级别指定构建顺序,或通过 级别的各种 *Targets 属性。 (下)

标签: visual-studio-2012 msbuild msbuild-task msbuild-propertygroup msbuild-target


【解决方案1】:

由于 ItemGroup 节点可以是 Target 节点的子节点,因此将这些 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>

【讨论】:

    【解决方案2】:

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

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

    在开始时会显示项目组的顺序:

    节点 1 上的项目“C:\Test\Testcode\build\testcode.msbuild”(默认目标)。

    构建:

    构建顺序:..\Hosts\solution1.sln

    构建顺序:....\solution2.sln

    构建顺序:helper1.csproj

    构建顺序:....\Sandboxes\helper2.sln

    构建顺序:wix\proc\prod.wixproj

    全部完成。

    【讨论】:

    • 我需要在 build helper2.sln 和 prod.wixproj 之间运行 GetFiles.cmd。如果我错了,请纠正我,但在你的答案中看起来并不是这样。
    • 如果是这种情况,那么您需要拆分项目组并使用每个项目组调用 msbuild 目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多