【问题标题】:TFS / msbuild, building project referencesTFS/msbuild,构建项目参考
【发布时间】:2019-08-02 05:25:36
【问题描述】:

我正在努力让 Azure Devops Server 2019(本地)构建我的复杂项目设置。

我有多个构建各种 BizTalk 应用程序的解决方案。其中一些解决方案引用了其他解决方案/存储库中的一些项目。这在 Visual Studio 中运行良好(假设每个人都将他们的存储库命名为默认值,他们这样做)。

为了自动化此构建,我创建了一个多阶段构建管道,按顺序构建每个解决方案。

虽然解决方案 1 将成功构建,但对于解决方案 2,msbuild 任务将不会引用已作为项目引用包含在解决方案中的项目的输出。

这似乎是因为这些引用的项目没有标记为要构建 - 因为如果没有它们依次引用主要解决方案中的其他项目等,它们将无法构建自己。

所有内容打包成一个大的超级解决方案文件是不可行的。

我希望 msbuild /reference 已在上一步中构建的项目,根据作为项目引用包含在内。但是 msbuild 是一个复杂的野兽,我无法找到实现这一目标的方法。

我正在努力实现的目标是否可能?谁能指出我正确的方向?

【问题讨论】:

  • 解决方案可能取决于您的源代码控制的设置方式。您使用的是 GIT 还是 TFVC?如果使用 GIT,是每个应用程序都在自己的存储库中,还是有一个包含所有内容的存储库?根据您的 cmets 关于“让每个人都将其存储库命名为默认值”,我假设您使用 GIT 和每个应用程序的单独存储库,但您能确认一下吗?
  • 只是检查提供的信息是否有用。如果您需要进一步的帮助,请告诉我们。
  • 将源代码放到构建代理上没有问题。碰巧的是,我将 git 与一个将所有项目结合在一起的超级项目一起使用。这工作正常,并且整个源代码结构可供构建代理使用。如上所述,问题是构建具有对相邻解决方案的项目引用的解决方案。文件都在那里并解析,但 msbuild 不/引用它们。
  • 您提到了项目参考,但您也谈到了多种解决方案。项目引用仅在单个解决方案中有效。您是否在解决方案 2 中使用文件路径引用来引用解决方案 1 中的 DLL?
  • 确实如此。我有多种解决方案,都需要按顺序构建。部分解决方案参考了之前解决方案中的项目。项目引用是相对的且有效的。如果项目在代理_work目录中的构建服务器上加载到VS中,您可以构建项目就好了。我坚持的地方是如何让 Azure Pipeline 使用与 VS 相同的参数。

标签: tfs msbuild azure-devops tfsbuild azure-pipelines


【解决方案1】:

TFS/msbuild,构建项目参考

这是一个关于不同 Repos 中项目引用的已知问题,但不幸的是它没有最佳答案。因为最好的解决方案始终是拥有一个存储库。

Git 将文件视为整个存储库的内容,而不是文件的集合。因此,这很难做到。作为解决方法,您可以考虑使用Git SubmodulesGit Subtree

从这里查看详细信息:

Git and Visual Studio project references

此外,我们现在使用的解决方案是将共享代码放在NuGet 包中。然后,您可以使用来自任何存储库的包,而不必执行任何不稳定的 git 设置并保持应有的访问控制。

希望这会有所帮助。

【讨论】:

  • 这不是源代码控制的问题,而是构建的问题。源码全部拉取成功。
【解决方案2】:

我终于重新审视了这个并做了更多的实验。

我可以看到,让 TFS/msbuild 到 /reference 其他项目输出的唯一方法是在解决方案构建配置中将它们标记为要构建。

现在,如果您在 Visual Studio 中执行此操作并尝试构建具有来自另一个解决方案的项目的解决方案,那么如果之前的解决方案尚未完全构建,则构建将失败(因为其他链式依赖项不会建)。这是有道理的。

但是使用 TFS/msbuild,构建会成功。据我所知,有一些魔法正在发生,可以确保以某种方式解决所有解决方案之间的依赖关系。这可能是运气,也可能是特定的行为(到目前为止它对我有用)。

问题当然是它与 Visual Studio 不兼容。所以我在每个解决方案文件中都有一个额外的“构建”定义设置,其中包含所有要构建的项目。

这似乎是管理大量相互关联的解决方案而无需一个大解决方案的最简单方法。

【讨论】:

    【解决方案3】:

    似乎 msbuild 已更改为仅引用项目引用,并且您可以通过在运行 msbuild 时将属性 OnlyReferenceAndBuildProjectsEnabledInSolutionConfiguration 设置为 true 来将其恢复为引用所有引用。

    来源:https://stackoverflow.com/a/25144169

    已确认此方法有效。

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 2014-06-21
      • 2017-08-21
      • 2020-12-20
      相关资源
      最近更新 更多