首页 > 解决方案 > 如何对诸如 Build/Rebuild 之类的 msbuild 内置目标设置条件?

问题描述

我正在以不同的方式构建一个庞大的整体解决方案,其中包括大约 80 个项目。现在,在我的构建管道中,我包含一个构建整个解决方案的步骤。但我想做的是构建解决方案,但提供条件作为 msbuild 参数,以便我可以排除一些可能没有任何相关更改的项目。我已经有了脚本来完成我的提交并了解发生了什么变化以及需要构建哪些项目。

我只需要一种方法将该信息发送到 MSBuild,这样它就不会每次都构建所有项目。我尝试单独构建项目,但这比一起构建解决方案要花费更多的时间。

因此,我正在寻找任何解决方案,通过这些解决方案我可以指定给 MSBuild,跳过特定项目会有很大帮助。非常感谢!

标签: buildmsbuildazure-devopsazure-pipelinescsproj

解决方案


我已经有了脚本来完成我的提交并了解发生了什么变化以及需要构建哪些项目。

因为我可以清楚地知道您使用哪个脚本来实现更改以及需要构建哪些项目。我假设您正在使用 MSbuildTarget 脚本xx.csproj来进行这些判断。

=如果我没有误解,您可以从这个类似的问题中获得帮助(参见ilya 的回答)。

查看此文档,您会发现构建操作是由这三个目标执行的,BeforeBuild、CoreBuild 和 AfterBuild。因此,假设您有一个目标来完成我的提交并意识到发生了什么变化,并且如果需要构建一个项目,您可以将如下脚本添加到xx.csproj

<PropertyGroup>
    <BuildWrapperDependsOn>$(BuildDependsOn)</BuildWrapperDependsOn>
    <BuildDependsOn>CheckIfBuildIsNeeded;BuildWrapper</BuildDependsOn>
  </PropertyGroup>

  <Target Name="CheckIfBuildIsNeeded">
    <!-- Execute command here that checks if proceed with the build and sets the exit code -->
    <Exec Command="exit /b 1" WorkingDirectory="$(SourcesPath)" IgnoreExitCode="true">   
      <Output TaskParameter="ExitCode" PropertyName="ExecExitCode"/>
    </Exec>
    <Message Text="Exit Code: $(ExecExitCode)" Importance="high" />
    <PropertyGroup Condition="'$(ExecExitCode)' == '1'">
      <DoBuild>false</DoBuild>
    </PropertyGroup>
  </Target>

  <Target Name="BuildWrapper" Condition=" '$(DoBuild)' != 'false' " DependsOnTargets="$(BuildWrapperDependsOn)" Returns="$(TargetPath)" />

以上是来自ilys的脚本,希望我的描述能帮助你理解。有了这个脚本,当我们启动一个构建目标时,它首先会运行它所依赖的目标,所以它会运行 CheckIfBuildIsNeeded 目标和 BuildWrapper 目标。只有当 DoBuild 属性为 true 时,BuildWrapper 才会真正执行。而且由于 buildwrapper 依赖于原始的 $(BuildDependsOn),它将继续真正的构建过程。

总逻辑是:运行CheckIfBuildIsNeeded脚本并输出值表示是否需要构建=>Try to Run BuildWrapper=>IF需要构建,然后运行真正的构建成功(BeforeBuild,Corebuild,Afterbuild),如果值为false,完成构建过程。所以我认为你可以对这个脚本做一些小改动,然后它就可以适用于你的情况。(不确定你的脚本是什么样的,我无法为你完成)

而且由于您有很多项目,因此您无需手动将此脚本添加到每个项目中。您可以创建一个Directory.Build.props文件,将脚本复制到其中,并将该文件放在解决方案文件夹中,然后它将适用于解决方案中的所有项目。


推荐阅读