MSBuild构建顺序

标签 msbuild msbuild-task

从MS来看这个article,我对SolutionToBuild部分有疑问。

<ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\path\MySolution.sln />
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\scribble.sln" />
    <SolutionToBuild Include="$(SolutionRoot)\HelloWorld\HelloWorld.sln" />
    <SolutionToBuild Include="$(SolutionRoot)\TestProject1\TestProject1.sln" />
</ItemGroup>

它说构建的顺序是由上述顺序决定的。因此,例如,将在涂抹之前构建MySolution。

但是,如果涂抹依赖于MySolution,这是否安全?例如,MySolution输出一个或多个scribble使用的dll。如果同时更改MySolution和scribble,则在进入下一个项目之前,该版本会等待MySolution完全编译吗?

最佳答案

您可以尝试将其他元数据用于SolutionToBuild项目。一些与递归和贴膜有关的工作!

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\levelone.sln">
        <DependsOnSolutions>$(SolutionRoot)\Scribble\leveltwo.sln</DependsOnSolutions>
    </SolutionToBuild>        
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\leveltwo.sln">
        <DependsOnSolutions>$(SolutionRoot)\Scribble\levelthree.sln;$(SolutionRoot)\TestProject1\TestProject1.sln</DependsOnSolutions>
    </SolutionToBuild>
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\levelthree.sln" />
    <SolutionToBuild Include="$(SolutionRoot)\TestProject1\TestProject1.sln" />
</ItemGroup>

<Target Name="Build">
    <MSBuild Projects="$(MSBuildProjectFile)"
             Targets="BuildSolution"                 
             Properties="SolutionFullPath=%(SolutionToBuild.Identity)"/>
</Target>

<Target Name="BuildSolution">   
    <CreateItem Condition="'%(SolutionToBuild.Identity)'=='$(SolutionFullPath)'"
        Include="%(SolutionToBuild.DependsOnSolutions)">
        <Output TaskParameter="Include"
                ItemName="DependentSolutions" />
    </CreateItem>

    <Message Text="Building solution $(SolutionFullPath)..." />        
    <Message Text="Solution $(SolutionFullPath) depends on %(DependentSolutions.Identity)..." 
             Condition="'@(DependentSolutions)'!=''"/>
    <Message Text="Building dependent solutions..."
             Condition="'@(DependentSolutions)'!=''"/>

    <MSBuild Projects="$(MSBuildProjectFile)"
             Targets="BuildSolution"
             Properties="SolutionFullPath=%(DependentSolutions.Identity)"
             Condition="'@(DependentSolutions)'!=''"/>

    <!-- <MSBuild Projects="$(SolutionFullPath)" /> -->
    <Message Text="Building solution $(SolutionFullPath)... OK" />
</Target>
</Project>

关于MSBuild构建顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2991904/

相关文章:

c++ - echo ItemGroup 的所有元素

visual-studio-2015 - TFS 2015在一个目录中发布构建工件

msbuild - 如何使用自定义 msbuild 任务读取注册表值?

msbuild - 你如何编写一个 MSBuild 任务来支持取消?

.net - .NET Core 版本的 MSBuild 不支持任务工厂 "CodeTaskFactory"

.net - 使用 MSBuild 脚本运行 MSTest 单元测试

vb.net - 在 TeamCity 中构建 Web 部署项目时出现 "Incorrect Format"引用错误

html - 如何将控制台应用程序(如 MSBuild 或 PowerShell)的彩色输出转换为保留颜色的 HTML 格式?

msbuild - 使本地 TFS 构建代理使用 v14 msbuild 工具

c++ - 宏 $(VCTargetsPath) 到底在哪里定义的?