如何对msbuild内置目标(如Build/Rebuild)设置条件?

如何对msbuild内置目标(如Build/Rebuild)设置条件?,build,msbuild,azure-devops,azure-pipelines,csproj,Build,Msbuild,Azure Devops,Azure Pipelines,Csproj,我正在差异化地构建一个巨大的整体解决方案,其中包括大约80个项目。在我现在的构建管道中,我包含了构建整个解决方案的步骤。但我想做的是构建解决方案,但提供条件作为msbuild参数,以便排除一些可能没有任何更改的项目。我已经有了脚本来完成我的提交,并意识到发生了什么变化以及需要构建哪些项目 我只需要一种方法将该信息发送到MSBuild,以便它不会每次都生成所有项目。我尝试单独构建项目,但这比一起构建解决方案要花费更多的时间 因此,我正在寻找任何解决方案,通过这些解决方案,我可以指定MSBuild跳

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

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

因此,我正在寻找任何解决方案,通过这些解决方案,我可以指定MSBuild跳过一个特定的项目,这将非常有帮助。多谢

我已经有了脚本来完成我的提交并实现什么 变更以及需要构建哪些项目

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

=如果我没有误解,你可以从中获得帮助(参见伊利亚的回答)

请参阅,您将发现构建操作是由这三个目标执行的,即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)" />

$(BuildDependsOn)
检查是否需要构建;建筑包装
错误的
以上是ilys的脚本,希望我的描述能帮助您理解。使用此脚本,当我们启动构建目标时,它将首先运行它所依赖的目标,因此它将运行CheckIfBuildIsNeeded目标和BuildWrapper目标。只有当DoBuild属性为true时,BuildWrapper才会实际执行。由于buildwrapper依赖于原始的$(BuildDependsOn),它将继续真正的构建过程

总的逻辑是:运行CheckIfBuildIsNeeded脚本和输出值以指示是否需要构建=>尝试运行BuildWrapper=>如果需要构建,则运行真正的构建成功(BeforeBuild、Corebuild、Afterbuild),如果值为false,则完成构建过程。所以我认为你可以对这个脚本做一些小的修改,然后它可以适合你的情况。(不确定您的脚本是什么样子,我无法为您完成)


由于您有许多项目,因此不需要手动将此脚本添加到每个项目中。您可以创建一个文件,将脚本复制到其中,然后将该文件放在解决方案文件夹中,然后该文件将适用于解决方案中的所有项目。

通常您会创建一个新配置,如果使用MSBuild部署任务,请将其传递到配置框中。请参阅@Michael Thank,我需要从构建中排除的项目是在我的管道中的构建步骤之前动态计算的,因此没有一个我知道我不需要一直构建的特定项目。项目将取决于该构建的更改/提交。因此,我需要一种在构建解决方案时动态构建或跳过项目的方法!在您的场景中,计算您实际需要的项目是否更容易?然后可以动态创建包含这些项目的临时解决方案
dotnet sln
还可以在解决方案中添加/删除项目文件。我不想这样做,因为我的解决方案中有大量的项目,大约80个。我认为这比跳过构建一些项目要花更多的时间。在这种情况下,您可以创建一个PowerShell任务并调用MSBuild吗?Int,您可以传入一个项目列表,这些项目可以在构建时设置。感谢@Merlin Liang,这是我想要有效地完成的任务,但这项任务需要构建解决方案文件,而不仅仅是项目。希望这也能奏效。不过,我将尝试这个解决方案,并在取得一些进展后发表评论。谢谢大家!@codester,事情进展如何?脚本是否可以帮助您成功构建解决方案文件?如果您有其他问题,请随时留下评论,这样我们可以进一步帮助您。不幸的是,退出代码策略退出了正在构建解决方案的整个msbuild过程。因此,构建失败,因为我想要构建的其他项目无法构建!这就是错误<代码>#[错误]进程“msbuild.exe”已退出,代码为“1”。@codester。退出代码“1”是一个非常常见的错误代码。您最好共享完整的调试日志~它应该有一些关键的错误消息。因此,我必须更新测试项目的所有其他csproj文件,以使用此更新,并且通过该更新,它似乎在我的本地上工作,我现在正在努力通过VSTS构建管道使其工作。