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 文本生成目标的更好地方吗?
基于@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在这种情况下放置输出文件的位置,这也可能是您可能想要做的。
从 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"。
| 归档时间: |
|
| 查看次数: |
3431 次 |
| 最近记录: |