在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> 
 该代码足以解释在两个目标的注释中使用BeforeBuild和AfterBuild目标。 
 <!-- ============================================================ 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目标之前或之后执行自定义步骤。 从上面可以看出, PreBuildEvent和PostBuildEvent被列为CoreBuild目标的依赖项。  Compile目标的依赖关系定义如下: 
 <PropertyGroup> <CompileDependsOn> ResolveReferences; ResolveKeySource; SetWin32ManifestProperties; _GenerateCompileInputs; BeforeCompile; _TimeStampBeforeCompile; CoreCompile; _TimeStampAfterCompile; AfterCompile </CompileDependsOn> </PropertyGroup> 
 再次在BeforeCompile和AfterCompile在代码中注释: 
 <!-- ============================================================ 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-, PostBuildEvent而Build可以使用Before-, AfterBuild进行修改。 
 select哪个Target来覆盖哪个场景取决于在你想要执行你的任务的构build期间。 目标没有特定的限制和/或好处,他们可以完成什么。 除了他们可以调整ItemGroup的属性或由前面的步骤定义/填充的属性之外。 
 在编译尝试解决项目依赖性之前,使用nuget引入包可能是最好的。 所以BeforeCompile不适合这种行为。 
我希望这件事能够说明问题。 在MSDN上find另一个很好的解释