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

sni*_*ils 10 maintenance projects-and-solutions visual-studio visual-studio-2015

我们在多个软件项目中使用单主解决方案策略,最近有人在公共代码中添加了依赖项,这打破了其他项目的解决方案,直到将新的依赖项添加到其解决方案中.消除或减少此类问题的好策略是什么?

我们想到了以下几点:

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

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

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

sti*_*ijn 2

可能没有内置的方法可以做到这一点(任何版本的 VS 安装的 MSBuild 文件都不会执行项目的构建,并且有像这样的功能请求)。一个非常快速的解决方案是创建一个 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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