你可以防止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项目