【问题标题】:Visual Studio 2012 C# solution, parallel build race conditionVisual Studio 2012 C# 解决方案,并行构建竞争条件
【发布时间】:2017-04-20 23:22:32
【问题描述】:

我有一个 Visual Studio 2012 C# 解决方案,其中包含大约 15 个.csproj 项目。

每个项目都使用在启动构建之前生成的通用 foo/bar.cs 文件。

我尝试了各种方法:

  • 预构建事件
  • 自定义 MSBuild 的 BeforeBuild 目标

单独构建每个项目都可以正常工作。但是,一旦我使用“构建解决方案”,我就面临一个竞争条件:一个目标试图编译 foo/bar.cs,而它正在被另一个目标重新创建。

那时,我意识到使用“构建解决方案”会在解决方案中为每个项目生成一个 MSBuild.exe 进程。我认为这会使我在开始构建项目之前一劳永逸地生成foo/bar.cs 的尝试无效。

也许我忽略了什么?有没有一种方法可以实现“在全部构建之前生成foo/bar.cs

【问题讨论】:

  • 也许将文件放在一个公共库项目中,并让 15 个项目引用该库?这样你只需要在你的库项目中包含那个生成命令。
  • 我会创建一个输出为 foo/bar.cs 的项目,然后让其他项目依赖于该项目...或将其放入库中(因为从语义上看,你是无论如何都想这样做)。
  • 不幸的是,这比“将其放入库”要复杂一些。拥有另一个只做自定义Build 目标的项目很诱人。我会跟进的
  • VS 中的这种限制真的很糟糕......

标签: c# visual-studio-2012 msbuild


【解决方案1】:

这是修复它的糟糕方法。

msbuild myproject.proj /maxcpucount:1

【讨论】:

  • 每次您想使用特定的sln
【解决方案2】:

正如@MadScienceDreams 所建议的那样,我创建了一个其他项目所依赖的单独项目。

我编辑了.csproj 文件以导入$(MSBuildBinPath)\Microsoft.Common.targets 而不是$(MSBuildBinPath)\Microsoft.CSharp.targets

然后我根据Exec 任务重写了Build 目标。

【讨论】:

    【解决方案3】:
    before.<SolutionName>.sln.targets 
    

    放置在 sln 文件旁边,将在所有 csproj 之前执行,这在 msbuild 中有效,但在 Visual Studio 中无效。

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多