【问题标题】:Is it possible to force MSBuild to Only Build A Project Once, Regardless of Properties?是否可以强制 MSBuild 只构建一个项目,而不考虑属性?
【发布时间】:2018-05-02 22:52:49
【问题描述】:

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

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

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

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

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

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

请注意,构建单线程确实可以解决并发问题,但这会显着减慢构建速度,并且项目仍会构建多次。

【问题讨论】:

    标签: c# .net msbuild


    【解决方案1】:

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

    要解决该错误,可以使用 GlobalPropertiesToRemove 属性从引用中删除该属性:

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

    【讨论】:

      【解决方案2】:

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

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

      如果某样东西要建造两次,它可能是: 1.构建系统中的一个错误。 2. 用户强制项目构建两次。

      总之很高兴你把它解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 2019-08-02
        • 1970-01-01
        • 2012-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多