如何在添加依赖项时自动更新主解决方案?
How to update master solution automatically when dependencies are added?
我们在多个软件项目中使用 single master solution strategy,最近有人在公共代码中添加了一个依赖项,这破坏了另一个项目的解决方案,直到新的依赖项被添加到他们的解决方案中。什么是消除或最小化此类问题的好策略?
我们想到了以下几点:
- 在签入日志消息中添加关键字以告诉其他项目添加依赖项(但这是一个手动过程)
- 使用多个分区解决方案而不是单个主解决方案(导致构建时间更长、跨解决方案失去智能感知等)
- 使用工具从多个分区解决方案创建主解决方案(任何适用于 VS2015 的建议,这可以自动化吗?)
到目前为止,我们最大的单一主解决方案是 115 个项目文件,因此仅在此基础上,似乎没有必要对解决方案进行分区,除非这是解决我们问题的最佳方法。
如果您运行遇到过这个问题,您是如何解决的?
可能没有内置方法(none 任何版本的 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 中的构建系统不会检测对解决方案外部引用项目的更改,因此如果解决方案中的所有项目都是最新的并且您更改了解决方案外部引用项目中的源文件它不会被建造。这不是命令行构建的情况,项目构建将开始,因此引用的项目也将被构建。
总而言之,我不确定是否值得。由于您选择了 'single master solution' 方法,因此可以说该解决方案实际上应该是项目的单一解决方案,因此必须包含从源代码构建的所有依赖项。确保这种情况发生是开发人员的任务。为了快速捕获失败,最好的解决方案是拥有一个构建服务器,它构建对代码库的每个提交,因此可以快速发现错误。然后,开发人员也会收到有关他们的错误的通知,并将很快应用修复程序(尤其是因为它是微不足道的)。
我们在多个软件项目中使用 single master solution strategy,最近有人在公共代码中添加了一个依赖项,这破坏了另一个项目的解决方案,直到新的依赖项被添加到他们的解决方案中。什么是消除或最小化此类问题的好策略?
我们想到了以下几点:
- 在签入日志消息中添加关键字以告诉其他项目添加依赖项(但这是一个手动过程)
- 使用多个分区解决方案而不是单个主解决方案(导致构建时间更长、跨解决方案失去智能感知等)
- 使用工具从多个分区解决方案创建主解决方案(任何适用于 VS2015 的建议,这可以自动化吗?)
到目前为止,我们最大的单一主解决方案是 115 个项目文件,因此仅在此基础上,似乎没有必要对解决方案进行分区,除非这是解决我们问题的最佳方法。
如果您运行遇到过这个问题,您是如何解决的?
可能没有内置方法(none 任何版本的 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 中的构建系统不会检测对解决方案外部引用项目的更改,因此如果解决方案中的所有项目都是最新的并且您更改了解决方案外部引用项目中的源文件它不会被建造。这不是命令行构建的情况,项目构建将开始,因此引用的项目也将被构建。
总而言之,我不确定是否值得。由于您选择了 'single master solution' 方法,因此可以说该解决方案实际上应该是项目的单一解决方案,因此必须包含从源代码构建的所有依赖项。确保这种情况发生是开发人员的任务。为了快速捕获失败,最好的解决方案是拥有一个构建服务器,它构建对代码库的每个提交,因此可以快速发现错误。然后,开发人员也会收到有关他们的错误的通知,并将很快应用修复程序(尤其是因为它是微不足道的)。