Visual Studio 2012 C#解决方案,并行构建竞态条件
我有一个包含大约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
?
由于@MadScienceDreams建议,我创建了一个独立的项目,其他项目依赖。
我编辑的.csproj
文件导入$(MSBuildBinPath)\Microsoft.Common.targets
而不是$(MSBuildBinPath)\Microsoft.CSharp.targets
。
然后我改写了Build
目标在Exec
任务方面。
这是解决它的苏茨基方式。
msbuild myproject.proj /maxcpucount:1
你不能在IDE中做任何事情,每次你想使用特定的'sln'都不改变全局设置。 –
我说“sucky ” .......... – granadaCoder
before.<SolutionName>.sln.targets
放置在sln文件旁边,将在所有csproj之前执行,这在msbuild中工作,但不在Visual Studio中。
也许把文件放在一个共同的库项目中,并让15个项目引用该库?这样你只需要在你的库项目中包含生成命令。 –
我会做一个项目,其输出是foo/bar.cs,然后让其他项目依赖于该项目......或者将其制作成一个库(因为它看起来很喜欢你正在尝试做的语义)。 – IdeaHat
不幸的是这比“把它放在图书馆里”要复杂一些。另一个只做自定义“构建”目标的项目是诱人的。我将跟进 –