在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另一个很好的解释