在MSBuild中PreBuildEvent,BeforeBuild目标和BeforeCompile目标之间有什么区别?

我最近不得不将一些代码从Visual Studio中的PreBuildEvent移动到BeforeBuild目标中,以使其在AppHarbor上工作 。 在这样做的时候,我也注意到了一个BeforeCompile目标。

这三个看起来相似的事件有什么区别:PreBuildEvent,BeforeBuild Target,BeforeCompileTarget?

每个人都可以/不可以做什么,为什么你会select一个呢?

这个问题的答案可以在Microsoft.Common.targets文件中find(取决于你使用的是64位还是32位的框架): C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.target用于64位)和C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets用于32位运行时)。 该文件定义了项目构build过程中的所有步骤。 引用来源:

 <!-- ============================================================ Build The main build entry point. ============================================================ --> <PropertyGroup> <BuildDependsOn> BeforeBuild; CoreBuild; AfterBuild </BuildDependsOn> </PropertyGroup> 

该代码足以解释在两个目标的注释中使用BeforeBuildAfterBuild目标。

 <!-- ============================================================ BeforeBuild Redefine this target in your project in order to run tasks just before Build ============================================================ --> <Target Name="BeforeBuild"/> <!-- ============================================================ AfterBuild Redefine this target in your project in order to run tasks just after Build ============================================================ --> <Target Name="AfterBuild"/> 

接下来是CoreBuild目标的定义:

 <PropertyGroup> <CoreBuildDependsOn> BuildOnlySettings; PrepareForBuild; PreBuildEvent; ResolveReferences; PrepareResources; ResolveKeySource; Compile; UnmanagedUnregistration; GenerateSerializationAssemblies; CreateSatelliteAssemblies; GenerateManifests; GetTargetPath; PrepareForRun; UnmanagedRegistration; IncrementalClean; PostBuildEvent </CoreBuildDependsOn> </PropertyGroup> 

因此, Build目标只是CoreBuild目标的一个包装,使您能够在CoreBuild目标之前或之后执行自定义步骤。 从上面可以看出, PreBuildEventPostBuildEvent被列为CoreBuild目标的依赖项。 Compile目标的依赖关系定义如下:

 <PropertyGroup> <CompileDependsOn> ResolveReferences; ResolveKeySource; SetWin32ManifestProperties; _GenerateCompileInputs; BeforeCompile; _TimeStampBeforeCompile; CoreCompile; _TimeStampAfterCompile; AfterCompile </CompileDependsOn> </PropertyGroup> 

再次在BeforeCompileAfterCompile在代码中注释:

 <!-- ============================================================ BeforeCompile Redefine this target in your project in order to run tasks just before Compile. ============================================================ --> <Target Name="BeforeCompile"/> <!-- ============================================================ AfterCompile Redefine this target in your project in order to run tasks just after Compile. ============================================================ --> <Target Name="AfterCompile"/> 

鉴于这些信息,我不知道为什么AppHarbor不支持Pre-, PostBuildEventBuild可以使用Before-, AfterBuild进行修改。

select哪个Target来覆盖哪个场景取决于在你想要执行你的任务的构build期间。 目标没有特定的限制和/或好处,他们可以完成什么。 除了他们可以调整ItemGroup的属性或由前面的步骤定义/填充的属性之外。

在编译尝试解决项目依赖性之前,使用nuget引入包可能是最好的。 所以BeforeCompile不适合这种行为。

我希望这件事能够说明问题。 在MSDN上find另一个很好的解释