MSBUILD构建顺序问题 - 先预构建步骤的第一或相关项目(MSbuild build order

2019-07-31 05:09发布

我有一个项目根据项目B.项目A具有一定的预构建任务,依赖的一些当我建立在Visual Studio中,没有任何问题产生的从项目B.文件。 但是,使用MSBuild.exe时,那么就有问题,因为建造顺序是:

  • A的预构建步骤< - 失败,因为B没有被编译
  • B被编译< - 预期将首先执行
  • A被编译

它是使用的MSBuild预期的行为? 有没有办法告诉的MSBuild先前的预生成步骤做B超?

我使用VS2010 C#和C ++ / CLI。 我不认为如果offeres额外的信息,但这里是它是如何调用:

Running process (C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBUILD.exe "..\..\..\dev\build\MyProj.sln" /t:Clean /p:Configuration=Release;Platform=Win32)

Answer 1:

简答

删除您的构建活动,并添加类似以下到您的项目(.csproj的):

<Target Name="AfterResolveReferences">
  <Exec Command="echo helloworld" />
</Target>

更多信息

你可以阅读这里定制生成过程: http://msdn.microsoft.com/en-us/library/ms366724%28v=vs.110%29.aspx

在之前建立事件ResolveReferences之前发射,因此,如果您引用该项目尚未通过的时间建造它涉及到你的项目的BeforeBuild事件,那么你的BeforeBuild事件将失败。

为了克服这个问题,你应该使用不同的切入点来定制生成过程。 在上面的例子中,我使用AfterResolveReferences,因为这将确保你引用的所有项目都已经建成。



Answer 2:

杰克的答案似乎是工作,但我不喜欢它是编辑的.csproj的支持本身并不在VS UI支持,比尴尬的“卸载项目等,编辑项目(在此期间,你不能按在你的文件,你通常想),刷新项目”的模式。 我想要的是在预生成事件内置相关项目后触发,并有这项工作中VS一样的MSBuild。 这个问题挣扎后,我发现,在4.0的MSBuild对我工作的解决方案。

不管是什么我想,我不能改变PreBuildEvents目标触发后因项目完成建设。 因此,我所做的却是禁用PreBuildEvents目标,并创建一个将在适当的时间运行bastardized定制PreBuildEvents目标:

<ItemGroup>
  <ProjectReference Include="..\YourProjectPath\YourProject.csproj">
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  </ProjectReference>
</ItemGroup>
<Target Name="PreBuildEvent" AfterTargets="" BeforeTargets="" />
<Target Name="BastardPreBuildEvent" AfterTargets="ResolveReferences" BeforeTargets="CoreResGen">
  <Exec Command="$(PreBuildEvent)" />
</Target>


Answer 3:

这是相当古老的问题,但我发现这个简单的解决方案(可能为你申请过)只需添加

<PreBuildEventDependsOn>ResolveReferences</PreBuildEventDependsOn>

之前

<PreBuildEvent>

不幸的是这必须做编辑,VS编辑器不支持它(在15.6.2版本)。



Answer 4:

这可能是老了,但我最近遇到了同样的问题。 杰克的答案是什么,我尝试使用,但在Visual Studio中加载的项目,这是对我不好 ,因为我是我的目标,我只是想在构建之前做的过程中做了相当长的过程,当ResolveReferences目标被调用。

我结束了使用的解决方案是类似于VeeTheSecond但有点较少涉及:

<Target Name="BeforeBuild" DependsOnTargets="ResolveReferences">
    ... exec something using a dependant project's output exe ...
</Target>

这会迫使BeforeBuild目标要等到所有相关的项目实际上完成了构建所以exec命令可以使用相关的项目的输出。



文章来源: MSbuild build order issue - pre-build steps first or dependent projects first
标签: c# msbuild