我目前正在将旧的csproj
文件格式的大型解决方案迁移到新的csproj
格式。我一次只做几个项目,所以我有一个混合环境,一些项目使用旧项目文件格式,一些项目使用新项目文件格式。
我已经开始注意到一些构建失败,因为文件正在使用中。我的理论(基于this answer)是MSBuild正在构建一些项目两次因为属性不同(即新项目文件格式指定TargetFramework
属性而旧项目没有)。
似乎有并发问题的项目是其他项目引用的项目,其中引用项目在项目文件格式之间分配。
我用来构建项目的命令是:
msbuild.exe /maxcpucount:6 /property:Configuration=Debug;Platform=x64 /t:Rebuild my.sln
有没有办法指示MSBuild只构建一次给定的项目(无论属性如何),直到我能够将解决方案中的所有项目转换为新的项目文件格式?
请注意,构建单线程会纠正并发问题,但这会显着降低构建速度,并且项目仍会多次构建。
答案 0 :(得分:0)
当从多目标项目引用C ++ CLI项目时,这是MSBuild中的bug。看起来他们正在解决这个问题。
要解决此问题,可以使用GlobalPropertiesToRemove
属性从参考中删除该属性:
<ProjectReference Include="..\B.CppCLILibrary\B.CppCLILibrary.vcxproj" GlobalPropertiesToRemove="TargetFramework" />
答案 1 :(得分:0)
由于我们无权访问您的代码,因此您才能正确解决此问题。但通常MSBuild和所有构建系统都在一个规则下运行,即构建“目标”只处理一次。无论有多少项目参考它。
构建系统应该为用户提供语言,以指定不同“目标”之间的依赖关系。然后由构建系统决定构建这些东西的顺序。(即称为拓扑排序)。开始或开始将最独立的目标一直制作到最不独立的目标。
如果有两次构建的东西可能是: 1.构建系统中的错误。 2.用户强制项目构建两次。
无论如何,很高兴你把它整理好了。