15

我有一个依赖于项目 B 的项目 A。项目 A 有一些预构建任务,这些任务依赖于项目 B 中生成的一些文件。当我在 Visual Studio 中构建时,没问题。但是在使用 MSBuild.exe 时,就会出现问题,因为构建顺序是:

  • A 的预构建步骤 <- 失败,因为 B 尚未编译
  • B 已编译 <- 预计首先执行
  • A被编译

这是使用 MSBuild 的预期行为吗?有没有办法告诉 MSBuild 在 A 的预构建步骤之前先做 B?

我正在使用 VS2010 C# 和 C++/CLI。我不认为是否提供其他信息,但它是这样称呼的:

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

4 回答 4

12

简短的回答

删除您的构建事件,并将以下内容添加到您的项目 (.csproj) 中:

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

更多信息

您可以在此处阅读有关自定义构建过程的信息:http: //msdn.microsoft.com/en-us/library/ms366724%28v=vs.110%29.aspx

Before Build 事件在 ResolveReferences 之前触发,因此如果您引用的项目在您的项目的 BeforeBuild 事件发生时尚未构建,那么您的 BeforeBuild 事件将失败。

为了克服这个问题,您应该使用不同的入口点来自定义构建过程。在上面的示例中,我使用 AfterResolveReferences,因为这将确保您引用的所有项目都已构建。

于 2013-05-01T16:59:56.557 回答
9

这是一个相当老的问题,但我找到了这个简单的解决方案(它也可能适用于你)只需添加

<PreBuildEventDependsOn>ResolveReferences</PreBuildEventDependsOn>

<PreBuildEvent>

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

于 2018-03-19T16:08:16.673 回答
6

杰克的回答似乎有效,但我不喜欢的是,VS UI 本身不支持编辑 .csproj,除了尴尬的“卸载项目,编辑项目(在此期间你不能点击像您通常想要的那样在您的文件上),重新加载项目”模型。我想要的是在构建依赖项目之后触发预构建事件,并且在 VS 中与在 MSBuild 中的工作相同。在解决了这个问题之后,我在 MSBuild 4.0 中找到了适合我的解决方案。

无论我尝试什么,我都无法更改 PreBuildEvents 目标以在相关项目完成构建后触发。所以我所做的是禁用 PreBuildEvents 目标,并创建一个将在适当时间运行的混蛋自定义 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>
于 2013-08-16T22:37:38.767 回答
0

这可能很旧,但我最近遇到了同样的问题。Jack 的回答是我试图使用的,但是在 Visual Studio 中加载项目时会调用 ResolveReferences 目标,这对我来说很糟糕,因为我在目标期间做了一个相当长的过程,而我只想在构建之前做。

我最终使用的解决方案与 VeeTheSecond 类似,但涉及的更少:

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

这将强制 BeforeBuild 目标等到所有依赖项目实际完成构建,以便 exec 命令可以使用依赖项目的输出。

于 2018-04-06T22:52:52.453 回答