11

我们在多个软件项目中使用single master solution strategy,最近有人在通用代码中添加了一个依赖项,这会破坏另一个项目的解决方案,直到新的依赖项添加到他们的解决方案中。什么是消除或最小化这类问题的好策略?如何在添加依赖关系时自动更新主解决方案?

我们认为以下几点:多分区解决方案

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

迄今为止,我们最大的单一主解决方案是115个项目文件,所以在此基础上,似乎并不需要划分解决方案,除非这是解决我们问题的最佳方法。

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

+0

什么语言? C++?您可以使用项目引用,它们是项目文件的一部分,而不是解决方案文件,因此每个使用该方案的解决方案都会自动获取参考。 – stijn

+0

是的,C++。我们使用引用,但是如果引用的项目不在解决方案中,是否有办法告诉Visual Studio继续构建它? – traal

+1

我很确定没有内置的方式。你可以用一个msbuild目标创建一个文件,它只是建立它所看到的所有项目引用,然后将这个文件包含在你拥有的所有项目中。几乎完美的是,它并不是说它仍然不会构建,例如,解决方案A中没有任何更改,但是解决方案A之外的项目中的源文件发生更改,因为A不会检测到它自己的项目的任何更改。这可能也可能是固定的,但这已经很难了。无论如何:我选择的解决方案是使用CI设置,因此任何构建破损都会被发现:] – stijn

回答

2

可能没有内置的方法来执行此操作(任何版本的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> 

现在,如果你运行构建,实际编译开始之前会发生引用的项目的生成(反过来他们引用的项目等),不管他们是:在底部一路该解决方案与否。一些缺点:

  • 如果添加一个项目refernce却忘了导入此文件没有任何反应
  • 构建无条件地发生,所以如果参考项目已经建成了构建再次启动;虽然它也会立即完成,因为构建系统发现所有输出都是最新的
  • VS中的构建系统将无法检测到解决方案之外的引用项目的更改,因此如果解决方案中的所有项目都是最新的,并且在不会构建的解决方案之外更改引用项目中的源文件。尽管命令行构建不是这样,但是会有一个项目的构建开始,因此也会构建引用的项目。

总而言之,我不知道它是否值得。由于您选择了“单主解决方案”方法,可以说解决方案应该是项目的单一解决方案,因此必须包含从源构建的所有依赖关系。开发者的任务就是确保这一点。为了赶上失败这么快,最好的解决方案是建立一个构建服务器,它将每个提交构建到代码库,并且因此可以快速发现错误。然后开发人员会通知他们的错误,并且很快就会应用这个修补程序(特别是因为它很简单)。

相关问题