Visual Studio 2015 - 确定编译哪些项目的预构建事件

Visual Studio 2015 - Pre build event to determine which projects to compile

动机

PreBuild 禁用冗余项目的编译以加快编译周期。

背景

我有一个包含许多项目的 VS15 ALL 解决方案。

我有一个项目 PreBuild,所有其他项目都依赖于它,也就是说,这个 PreBuild 首先编译。
此外,我们还有一个 PostBuild 项目,可以在二进制文件准备好后做更多工作。

所有项目都配置为在 Release 模式下构建(这是需要的)。
当团队成员想要发布一些二进制文件时,他按 F7,Build Solution
现在,PreBuild 激活一个单独的专用进程来计算应该发布哪些项目。计算的性质与本次讨论无关。

问题

在很多项目中,通常只需要发布几个项目。但是,一旦 PreBuild 过程完成,所有项目都将编译,这非常耗时。

问题

是否可以在解决方案构建开始后更改已发布的项目?

建议的不需要的方法

  1. 开发人员仅精选相关项目并仅构建这些项目。
  2. PreBuild 杀戮和复活。一旦计算出所需的项目,PreBuild 就会终止 VS15 进程并激活仅编译相关项目的 cmd。

建议的方法

更改文件 ALL.sln 并删除不需要的项目。 如果我在流程开始之前更改了该文件,这会起作用,但我不确定如果在此过程中发生此更改,它是否会起作用。

我能想到的最简单的方法,同时仍然保留大部分当前基础架构:有一个调用发布构建的专用项目(通过计算依赖关系并调用 msbuild)并配置 VS,因此它可以 select 只是用于构建的项目。全部来自您的 ALL.sln,因此其余功能得以保留。步骤:

删除 PreBuild/PostBuild 个项目。我假设您提到的 PostBuild 也适用于实际的发布版本;如果不只是把它留在那里。请注意,通过不要求所有项目都依赖于 PreBuild 项目,您已经摆脱了一个维护负担。

添加一个将进行发布构建的项目,比如 ReleaseBuild。这样的名称也比 PreBuild/PostBuild 个项目更好,因为它清楚地表明了项目的意图。 Makefile 项目是合适的,尽管从技术上讲它可以像只有一个构建目标的 msbuild 文件一样简单。配置构建命令行以执行所需的任何操作,即确定要构建的内容然后再构建。举个例子:假设您使用 Powershell 来执行此操作,您会将构建命令行配置为

Powershell -NoProfile -File BuildRelease.ps1 $(Platform)

和 BuildRelease.ps1 包含类似

的内容
$projectsToRelease = CalculateMyProjectsForRelease()
$platform = $Args[0]
$projectsToRelease | %{& msbuild $_ "/p:Configuration=Release;Platform=$platform"}

在配置管理器中添加一个名为 Deploy 左右的额外配置。这将用于 select 要构建的内容:您现在可能已经有了调试和发布配置。那些留在原地,只是用来建造一切。这个想法是这个额外的配置将负责构建实际的版本。这与在 VS 中的标准工作方式相当一致,并且对于新手来说很容易发现和理解。使用复选框,这样当 Deploy 配置被 selected 时,只有 ReleaseBuild 被构建而其他的 none 而当 Debug 或 Release 被 selected 时,ReleaseBuild 项目不会被构建建成。看起来像这样:

要构建一个版本,select 从 VS 工具栏中的配置下拉菜单进行部署,然后按 F7(或您用来调用构建解决方案的任何方式)。任何构建 errors/warnings 都将被解析并照常显示在错误列表中。

这也很容易扩展:假设您只有几个发布构建版本,只需添加更多配置,如 DeployA DeployB DeployC 并为它们调整构建命令行。