添加依赖项时如何自动更新主解决方案?

Posted

技术标签:

【中文标题】添加依赖项时如何自动更新主解决方案?【英文标题】:How to update master solution automatically when dependencies are added? 【发布时间】:2017-08-10 18:00:47 【问题描述】:

我们在多个软件项目中使用single master solution strategy,最近有人在公共代码中添加了一个依赖项,这破坏了另一个项目的解决方案,直到新的依赖项被添加到他们的解决方案中。消除或尽量减少此类问题的好策略是什么?

我们想到了以下几点:

在签入日志消息中添加一个关键字,告诉其他项目添加依赖项(但这是一个手动过程) 使用多个分区解决方案而不是单个主解决方案(导致构建时间更长、跨解决方案失去智能感知等) 使用工具从多个分区解决方案创建主解决方案(有任何适用于 VS2015 的建议,这可以自动化吗?)

到目前为止,我们最大的单一主解决方案是 115 个项目文件,因此仅在此基础上似乎没有必要对解决方案进行分区,除非这是解决我们问题的最佳方法。

如果你遇到过这个问题,你是怎么解决的?

【问题讨论】:

什么语言? C++?您可以使用项目引用,它们是项目文件而不是解决方案文件的一部分,因此使用该项目的每个解决方案都会自动获取引用。 是的,C++。我们使用引用,但如果引用的项目不在解决方案中,有没有办法告诉 Visual Studio 无论如何都要构建它? 我很确定没有内置方法。您可以使用 msbuild 目标创建一个文件,该目标仅构建它看到的所有项目引用,然后将该文件包含在您拥有的所有项目中。几乎完美,如果不是它仍然无法构建,例如解决方案 A 没有变化,但是解决方案 A 之外的项目的源文件发生了变化,因为 A 不会检测到它自己的项目的任何变化。这可能也可以修复,但这已经更难了。无论如何:我选择的解决方案是进行 CI 设置,以便尽早发现任何构建损坏:] @stijn 请给出你的答案,以便我接受。 【参考方案1】:

可能没有内置的方法来做到这一点(任何版本的 VS 安装的 MSBuild 文件都不会执行项目的构建,并且有针对它的功能请求like this one)。一个非常快速的解决方案是创建一个 msbuild 文件,该文件将引用的项目构建为预构建事件,并将该文件包含在每个引用另一个项目的项目中。比如在有常用构建工具左右的目录下创建一个名为buildprojectreferenecs.targets的文件,内容有

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="BuildProjectReferences" BeforeTargets="BuildGenerateSources">
    <MsBuild Projects="@(ProjectReference)"
             Properties="Configuration=$(Configuration);Platform=$(Platform)"/>
  </Target>
</Project>

这只是使用与包含它的项目相同的配置和平台构建每个 ProjectReference。在每个使用项目引用的项目中导入它。导入必须在定义 ProjectReference 项之后进行,因此将其放在例如一直在底部:

  ...
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <!-- this is near the bottom already -->
  <Import Project="..\BuildProjectReferences.targets" /> !<-- add this -->
  ...
</Project>

现在,如果您运行构建,则在实际编译开始之前,无论它们是否在解决方案中,都会对引用的项目(以及它们的引用项目等)进行构建。一些缺点:

如果您添加项目引用但忘记导入此文件,则不会发生任何事情 构建无条件发生,因此如果参考项目已经构建,则重新开始构建;虽然它也会立即完成,因为构建系统会看到所有输出都是最新的 VS 中的构建系统不会检测到解决方案之外的引用项目的更改,因此如果解决方案中的所有项目都是最新的,并且您更改了解决方案之外的引用项目中的源文件,它会赢得不被建造。但是,命令行构建并非如此,将开始构建项目,因此也将构建引用的项目。

总而言之,我不确定这是否值得。由于您选择了“单一主解决方案”方法,可以说该解决方案实际上应该是项目的单一解决方案,因此必须包含从源代码构建的所有依赖项。确保这种情况发生是开发人员的任务。为了快速捕获失败,最好的解决方案是拥有一个构建服务器,它构建对代码库的每个提交,从而快速发现错误。然后,开发人员也会收到错误通知,并将很快应用修复程序(尤其是因为它很简单)。

【讨论】:

以上是关于添加依赖项时如何自动更新主解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

安装依赖项时如何解决“'websocket-driver'的完整性检查失败”错误?

Composer 在更新依赖项时挂起

当安装包而不是单个学说依赖项时,如何更新 orm-pack 的单个包?

如何解决之Android Studio不能自动更新安装apk文件的问题

使用 mikepenz/MaterialDrawer 库时解决依赖项时出错

如何将 QTreeWidget 的子项设置为在单击其父项时自动选择并突出显示