你可以防止MSBuild.exe运行生成事件?

我正在通过脚本构build一些项目,偶尔使用自定义构build事件会给构build系统带来很大的困难。 如果可能的话,我想调用MSBuild.exe,以阻止任何生成事件的执行。 从长远来看,这不是构build自动化的问题 – 有构build事件的项目提交者被预先警告,这样的行为是违反规则的。

总之,是否有一种方法可以调用MSBuild来防止执行任何自定义构build步骤(如果存在)?

更新:

我曾考虑过对项目文件进行就地(自动)编辑,但是对于这三个事件中的每一个,都希望命令行将“从构build中排除”(请参阅​​“构build事件”选项)设置为“是”。

Pre / PostBuildEvents是属性,所以要覆盖它们只需将它们从命令行设置为空string即可。

msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent= 

您也可以使该属性有条件

 <PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent> 

我要做的是定义一个新的.proj文件,可以说C:\ Data \ SupressBuildEvents.proj,它将包含:

 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="PostBuildEvent"/> <Target Name="PreBuildEvent" /> </Project> 

然后,您需要指定这些文件在Microsoft.Common.targets之后被导入,并且您将通过将已知属性CustomAfterMicrosoftCommonTargets定义为该文件的path来完成此操作。 所以让你的构build脚本在一个名为MyBuild.proj的文件中,你可以这样调用它:

 msbuild MyBuild.proj /p:CustomAfterMicrosoftCommonTargets="C:\Data\SupressBuildEvents.proj " 

这将导致MSBuild在Microsoft.Common.targets文件被导入之后导入文件,它将覆盖PostBuildEvent和PreBuildEvent目标,并使其不执行任何操作。

现在,如果您的MyBuild.proj文件使用MSBuild任务来构build其他目标,那么您还应该将这个属性传递给它们,如下所示:

 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <ProjectsToBuild Include=" FILL THIS IN "/> </ItemGroup> <Target Name="YourTarget"> <MSBuild Projects="@(ProjectsToBuild)" Properties="CustomAfterMicrosoftCommonTargets=$(CustomAfterMicrosoftCommonTargets)"/> </Target> </Project> 

这是必要的,因为父脚本的devise属性不会传递给由MSBuild任务执行的构build。

看来,答案是不同的,取决于项目types。

对于C / C ++项目 (.vcxproj),您可以使用/p:PostBuildEventUseInBuild=false来抑制命令行中的/p:PostBuildEventUseInBuild=false ,如AndreiM所示。

(设置/p:PostBuildEvent为空string不适用于C ++项目,我找不到任何其他方式来覆盖后构build命令)。

对于C#项目 (.csproj),您可以使用/p:PostBuildEvent= 禁止命令行上的/p:PostBuildEvent= ,正如大多数其他响应者所build议的那样。

你也可以在你的MSBuild任务中设置属性:

 <MSBuild Projects="$(MSBuildProjectDirectory)\YourProject.csproj" Properties="Configuration=$(BuildConfiguration);BuildingFromBuildProjXml=true;PreBuildEvent=;PostBuildEvent=" ContinueOnError="false" /> 

我也玩过一点msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent= ,但对我来说,它不工作,可能是因为我使用自定义的道具文件。

我发现工作是/p:PostBuildEventUseInBuild=false

默认情况下,当你导入Microsoft.Common.targets时,你会得到

 <PropertyGroup> <BuildDependsOn> BeforeBuild; CoreBuild; AfterBuild </BuildDependsOn> </PropertyGroup> 

我想你可以用它来代替它

 <PropertyGroup> <BuildDependsOn> CoreBuild </BuildDependsOn> </PropertyGroup> 

closures这些前/后构build事件。 (不知道是否需要在导入之前或之后将它放在.proj文件中,或者如果需要修改Microsoft.Common.targets以获得这样的效果,则没有时间进行实验…)

在一些C#项目中,我需要PostBuildEvent在Visual Studio构build中工作,但不适用于MSBuild和TFS构build。 为此,我在VS中添加PostBuildEvent。 它在.csproj中设置下面的代码:

  <PropertyGroup> <PostBuildEvent>*... my custom post build event ....*</PostBuildEvent> </PropertyGroup> 

之后,我将下面的代码添加到.csproj:

  <Target Name="BeforeBuild"> <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'false' Or '$(BuildingInsideVisualStudio)' != 'true'"> <PostBuildEvent></PostBuildEvent> </PropertyGroup> </Target> 

此代码将PostBuildEvent设置为空,并且仅在MSBuild和TFSBuild BeforeBuild目标中出现。 这是简单的,永久的,不需要设置参数,工作正常。

右键单击该项目,select“卸载项目”

再次右键单击项目,然后select“编辑”

find你感兴趣的事件,例如对于我来说,我需要删除PostBuild:

  <PropertyGroup> <PostBuildEvent>"$(TargetDir)filename.exe" "$(ProjectDir)"</PostBuildEvent> </PropertyGroup> 

注释掉:

  <!--<PostBuildEvent>"$(TargetDir)filename.exe" "$(ProjectDir)"</PostBuildEvent>--> 

右键单击该项目,然后select“重新加载项目”

重build项目