2013-11-15 107 views
1

我有一个包含大约15个.csproj项目的Visual Studio 2012 C#解决方案。Visual Studio 2012 C#解决方案,并行构建竞态条件

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

我尝试过各种方法:

  • 预生成事件
  • 定制的MSBuild的BeforeBuild目标

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

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

也许我忽略了一些东西?有没有一种方法,将实现“建设前的所有产生foo/bar.cs

+0

也许把文件放在一个共同的库项目中,并让15个项目引用该库?这样你只需要在你的库项目中包含生成命令。 –

+1

我会做一个项目,其输出是foo/bar.cs,然后让其他项目依赖于该项目......或者将其制作成一个库(因为它看起来很喜欢你正在尝试做的语义)。 – IdeaHat

+0

不幸的是这比“把它放在图书馆里”要复杂一些。另一个只做自定义“构建”目标的项目是诱人的。我将跟进 –

回答

0

由于@MadScienceDreams建议,我创建了一个独立的项目,其他项目依赖。

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

然后我改写了Build目标在Exec任务方面。

1

这是解决它的苏茨基方式。

msbuild myproject.proj /maxcpucount:1 
+0

你不能在IDE中做任何事情,每次你想使用特定的'sln'都不改变全局设置。 –

+2

我说“sucky ” .......... – granadaCoder

0
before.<SolutionName>.sln.targets 

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

相关问题