你能阻止MSBuild.exe运行Build Events吗?

Sni*_*gus 53 msbuild events build

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

简而言之,有没有办法调用MSBuild来阻止执行任何自定义构建步骤(如果存在)?

更新:

我考虑过对项目文件进行就地(自动)编辑,但是对于三个事件中的每一个,我更喜欢命令行等效于将"Excluded From Build"(参见Build Events选项)设置为Yes.

rad*_*cal 90

Pre/PostBuildEvents是属性,因此要覆盖它们,只需将它们从命令行设置为空字符串即可.

msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=
Run Code Online (Sandbox Code Playgroud)

  • 使用msbuild foo.sln/p:PreBuildEvent =""/ p:PostBuildEvent =""为我工作(MSBuild v4.0.30319). (17认同)
  • 它也不适用于我(C++ 项目),但是 AndreiM 和 dtopham75 在下面发布的解决方案 (/p:PostBuildEventUseInBuild=false) 工作得很好。 (3认同)

Sar*_*rin 13

您也可以使该属性有条件

<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>
Run Code Online (Sandbox Code Playgroud)


dto*_*m75 11

似乎答案因项目类型而异.

对于C/C++项目(.vcxproj),您可以使用/p:PostBuildEventUseInBuild=falseAndreiM建议的命令行来抑制PostBuildEvent .

(设置/p:PostBuildEvent为空字符串不适用于C++项目,我找不到任何其他方法来覆盖后构建命令).

对于C#项目(.csproj),您可以使用/p:PostBuildEvent=大多数其他响应者建议的命令行抑制PostBuildEvent .


Say*_*imi 10

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

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

    <Target Name="PreBuildEvent" />
</Project>
Run Code Online (Sandbox Code Playgroud)

然后,您需要指定在Microsoft.Common.targets之后导入这些文件,并且您可以通过将已知属性CustomAfterMicrosoftCommonTargets定义到该文件的路径来实现.因此,让您的构建脚本位于名为MyBuild.proj的文件中,您可以将其调用为:

msbuild MyBuild.proj /p:CustomAfterMicrosoftCommonTargets="C:\Data\SupressBuildEvents.proj
"
Run Code Online (Sandbox Code Playgroud)

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

现在,如果您的MyBuild.proj文件使用MSBuild任务来构建其他目标,那么您还应该按如下方式传递它们:

<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>
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为父脚本上的设计属性不会传递给MSBuild任务执行的构建.


And*_*eiM 5

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

然而,我发现有效的是 /p:PostBuildEventUseInBuild=false


Bri*_*ian 0

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

<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我想你也许可以将其替换为

<PropertyGroup>
    <BuildDependsOn>
        CoreBuild
    </BuildDependsOn>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

关闭这些构建前/构建后事件。(不确定您是否需要在导入之前或之后将其放入 .proj 文件中,或者是否需要修改 Microsoft.Common.targets 才能达到这样的效果。现在没有时间进行实验...)