是否可以强制MSBuild只生成一次项目,无论属性如何?

时间:2018-05-02 22:52:50

标签: c# .net msbuild

我目前正在将旧的csproj文件格式的大型解决方案迁移到新的csproj格式。我一次只做几个项目,所以我有一个混合环境,一些项目使用旧项目文件格式,一些项目使用新项目文件格式。

我已经开始注意到一些构建失败,因为文件正在使用中。我的理论(基于this answer)是MSBuild正在构建一些项目两次因为属性不同(即新项目文件格式指定TargetFramework属性而旧项目没有)。

似乎有并发问题的项目是其他项目引用的项目,其中引用项目在项目文件格式之间分配。

我用来构建项目的命令是:

msbuild.exe /maxcpucount:6 /property:Configuration=Debug;Platform=x64 /t:Rebuild my.sln

有没有办法指示MSBuild只构建一次给定的项目(无论属性如何),直到我能够将解决方案中的所有项目转换为新的项目文件格式?

请注意,构建单线程会纠正并发问题,但这会显着降低构建速度,并且项目仍会多次构建。

2 个答案:

答案 0 :(得分:0)

当从多目标项目引用C ++ CLI项目时,这是MSBuild中的bug。看起来他们正在解决这个问题。

要解决此问题,可以使用GlobalPropertiesToRemove属性从参考中删除该属性:

<ProjectReference Include="..\B.CppCLILibrary\B.CppCLILibrary.vcxproj" GlobalPropertiesToRemove="TargetFramework" />

答案 1 :(得分:0)

由于我们无权访问您的代码,因此您才能正确解决此问题。但通常MSBuild和所有构建系统都在一个规则下运行,即构建“目标”只处理一次。无论有多少项目参考它。

构建系统应该为用户提供语言,以指定不同“目标”之间的依赖关系。然后由构建系统决定构建这些东西的顺序。(即称为拓扑排序)。开始或开始将最独立的目标一直制作到最不独立的目标。

如果有两次构建的东西可能是: 1.构建系统中的错误。 2.用户强制项目构建两次。

无论如何,很高兴你把它整理好了。