MSBuild构建序列

5

看着微软的这篇文章,我对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将在scribble之前构建。

但是,如果scribble依赖于MySolution,这样安全吗?例如,MySolution输出一个或多个dll,这些dll被scribble使用。如果同时更改MySolution和scribble,那么构建会等待MySolution完全编译后再移动到下一个项目吗?

2个回答

6
您可以尝试为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>

1

你是如何管理解决方案的依赖关系的?难道不是引用项目吗?我也对某些解决方案的“同时”更改感到困惑。请澄清这些更改的性质。

到目前为止,对你的问题的答案是:

  1. 不是。它们可以一个接一个地编译,但这是否有资格作为依赖关系呢?
  2. 是的。如果顺序是强制性的,则构建器将“等待”,直到每个解决方案构建完成(无论成功还是错误)才会移动到下一个。

我已经更新了我的问题。您能否澄清一下您所说的“如果序列是强制性的”是什么意思? - Paul Michaels
我的意思是,如果构建没有并行化且解决方案按队列顺序构建......那么构建程序确实会等待。但是,我不明白如何在两个解决方案中同时进行更新,或者在构建过程中会出现哪些副作用--可能没有任何副作用,因为真正重要的是更新时间相对于构建开始时间。顺便问一下,你能测试这个条件吗? - Humberto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接