Azure DevOps:在多项目解决方案中生成一个项目

4

我不确定我是否在正确搜索,但我希望我能在这里得到一些指导。

当前设置

我有一个包含两个项目的解决方案:

  1. Web API项目
  2. Node.js项目

我正在使用Azure DevOps,其中包含2个构建,每个构建都有自己的部署,分别用于两个项目。每个构建定义仅在各自的项目更新/更改时触发。

这很好!

我注意到每次构建实际上会构建整个解决方案。为了不浪费处理能力,我更喜欢每个项目只构建它们自己的项目,但有一些限制条件。

Web Api项目不依赖于Node.js项目的更改,然而, Node.js 可以 依赖于Web Api的更改。因此,如果Web Api失败,则不希望Node.js进行构建/发布。

目标

我试图设置我的构建定义,以便Web Api构建仅构建Web Api项目。无论它完成还是出现错误,让构建按照正常方式继续。

但是,我希望Node.js项目构建同时构建Web Api和Node.js项目,以便如果Web Api构建失败,则整个构建失败,即使Node.js不会失败也是如此。

我尝试添加一个新的Visual Studio Build task并仅选择该项目,但我遇到了以下错误:

[warning]C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(781,5): Warning : The OutputPath property is not set for project 'MyProject.csproj'. Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration='release' Platform='any cpu'. You may be seeing this message because you are trying to build a project without a solution file, and have specified a non-default Configuration or Platform that doesn't exist for this project.

我目前正在寻找如何修复这个问题,但我想提出以下问题,以防我走错方向。

问题

  1. 如何设置构建定义仅构建1个项目?
  2. 是否应该创建不同的配置而不是我提到的那个配置?

构建定义

Build definition

1个回答

4
"What I'm trying to do is setup my build definitions so that the Web Api build, only builds the Web Api project. Whether it completes or errors out, let the build proceed as it normally does."
这种情况需要一个针对项目文件而不是 .sln 的构建定义。您的错误在于构建 .csproj 需要 OutputPath 属性具有值,因此只需将其添加到 MSBuild参数框中:/p:OutputPath="$(build.binariesDirectory)\MyProject"。 {{link1:Build.BinariesDirectory}}是一个预定义变量,但不是必需的目录值。您可以使用适合自己的内容。
"I want the Node.js project build both the Web Api and the Node.js project, so that if the Web Api build fails, then the whole build fails even if the Node.js would not have failed."
最简单和最不成熟的方法
根据我对您情况的理解,这种情况不需要进行任何额外的更改。如果您构建解决方案,那么当两个项目中的任意一个出现问题时,管道将失败。这样做的缺点是:
  1. 在 Node.js 项目更改并且 CI 触发构建之前,它无法“获取”Web API“依赖项”的最新更改
  2. 如果使用构建完成触发器来减轻上述第1个缺点,则 Web API 项目会被构建两次,即使我们知道两次都应该成功

更复杂和精致(但优雅?)的方式

在 Node.js 管道上设置“构建完成”触发器,以在 Web API 管道成功时触发构建。这与您目前的情况类似,但有所不同。使用构建完成和 CI 触发器在您的 Node.js 管道上,即使下游 Node.js 的结果不佳,Web API 构建也可以成功,但即使没有明确对该项目进行更改,您也将构建 Node.js 项目。(如果您试图节省代理活动,这可能不是您想要的)

您的Node.js流水线可以有两个单独的构建步骤,每个步骤都针对其中一个项目文件。但是,Web API项目构建的步骤可以有条件,如果Build.ReasonBuildCompletion,则不执行。这允许Node.js成为Web API的下游项目,但如果我们已经知道Web API成功,则不会构建Web API。
注意:取决于解决方案中这些项目之间引用的工作方式,您可能需要添加其他任务来下载构建工件等内容,以确保一切都在应该构建的位置。

那个(最不复杂的)方法可行!我是那种喜欢使用复杂版本的人,无论多么复杂,但这次我不会尝试。关于你提到的一点:虽然我将使用MS托管代理,但我仍然希望在任何可以节省处理的地方进行节省,既有助于MS,也有助于以后决定拥有自己的代理。也许有一天我会尝试你的复杂版本。非常感谢! - RoLYroLLs
你知道吗...我刚刚构建了所有的测试内容。我注意到通过使用托管代理,每次只有1个代理启动。这是我刚刚看到的顺序:构建Node.js,构建WebApi,发布Node.js,发布WebApi。我想现在可能需要开始变得复杂了。虽然我有一个批准流程来发布构建到生产环境,但我希望一切都尽可能自动化。这意味着在Node.js有更改的情况下,我可能希望确保WebApi被发布,但仅在 Node.js有更改的情况下。唉! - RoLYroLLs
你只有在Node.js更改时才发布WebApi项目吗? - Josh Gust
不,WebApi 在不久的将来在此解决方案中为其他项目提供服务(或者是不在该解决方案中的其他项目)。因此,WebApi 可能会发生变化,而 Node.js 则可能不会。我知道这将在未来增加很多复杂性。 - RoLYroLLs
那么WebApi可以独立部署,但是在部署任何给定版本的Node应用程序时,必须部署一个“新”的WebApi服务版本? - Josh Gust
不一定如此。可能会有更新的Node.js版本不需要更改WebApi。换句话说,任何更改都可以是独立或相互独立的。我假设如果在同一次merge中同时更改了两个项目,那么Node.js依赖于WebApi(但反之不成立)。 - RoLYroLLs

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