在 CoreBuild 之前运行目标?

Jez*_*Jez 4 msbuild visual-studio

我正在向.tt我的项目中添加一个自定义模板生成目标以运行 before CoreBuild,并且似乎有两种方法可以做到:

<Project...>
    <Target Name="TransformOnBuild" AfterTargets="BeforeBuild">
</Project>
Run Code Online (Sandbox Code Playgroud)

<Project...>
    <Target Name="TransformOnBuild" BeforeTargets="CoreBuild">
</Project>
Run Code Online (Sandbox Code Playgroud)

如果我的目标应该在我的项目构建之前运行,因为项目依赖于它,我使用后者会更好吗?我见过前者用来做诸如生成文本模板之类的事情,但这似乎是一种不可靠的方法,因为它可能会在 之后运行CoreBuild,这为时已晚。或者有什么理由为什么AfterTargets="BeforeBuild"仍然保证在核心构建之前运行?

我还看到BeforeTargets="BeforeBuild"哪个会更早构建。这是放置`.tt 文本生成目标的更好地方吗?

Mar*_*ich 6

基于@stjin 的回答,似乎正在使用一个很好的解决方案

BeforeTargets="CoreCompile" DependsOnTargets="PrepareForBuild"
Run Code Online (Sandbox Code Playgroud)

这就是 .net sdk(用于 .net 核心/标准项目的新型 csproj)为自动生成 AssemblyInfo.cs 所做的

它使用以下注释来解释原因:

请注意,这必须在每次调用 CoreCompile 之前运行,以确保所有编译器运行都能看到生成的程序集信息。至少有一种涉及 Xaml 的场景,其中调用 CoreCompile 时没有其他潜在的钩子,例如 Compile 或 CoreBuild 等,因此我们直接钩子到 CoreCompile。此外,我们必须 PrepareForBuild之后运行以确保已创建中间目录。

请注意,“中间目录”(obj/[TargetFramework]在这种情况下)是.cs在这种情况下放置输出文件的位置,这也可能是您可能想要做的。


sti*_*ijn 3

从 Microsoft.Common.CurrentVersion.targets 来看,构建目标基本上是:

<BuildDependsOn>
  BeforeBuild;
  CoreBuild;
  AfterBuild
</BuildDependsOn>
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/>

<PropertyGroup>
  <CoreBuildDependsOn>
    PrepareForBuild;
    PreBuildEvent;
    ...
    Compile;
    ...
    PostBuildEvent
  </CoreBuildDependsOn>
</PropertyGroup>
<Target Name="CoreBuild" DependsOnTargets="$(CoreBuildDependsOn)">
Run Code Online (Sandbox Code Playgroud)

因此 usingBeforeTargets="CoreBuild"确实会在 CoreBuild 之前运行,但毕竟的依赖目标运行了,所以在所有实际的构建步骤之后。这通常不是您想要的,相反,如果您想在编译等之前运行某些内容,请使用BeforeTargets="PrepareForBuild"orAfterTargets="BeforeBuild"甚至BeforeTargets="BeforeBuild"