你能否防止MSBuild.exe运行构建事件?

70

我正在通过脚本构建多个项目,偶尔使用自定义构建事件会给构建系统带来很大的困难。如果可能的话,我想调用MSBuild.exe以阻止执行任何构建事件。从长远来看,这并不是构建自动化的问题-提交带有构建事件的项目的人被提醒这样的错误行为是不被允许的。

简而言之,有没有一种方法可以调用MSBuild,以防止执行任何自定义构建步骤(如果存在)?

更新:

我考虑过对项目文件进行原地(自动化)编辑,但更喜欢命令行等效于将“Excluded From Build”(请参见构建事件选项)设置为Yes的三个事件之一。

9个回答

104

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

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

1
这对我似乎不起作用,我正在使用MSBuild v4.0.30319.17929。 - whatsisname
18
使用 "msbuild foo.sln /p:PreBuildEvent="" /p:PostBuildEvent=""" 命令行可以成功执行(适用于 MSBuild v4.0.30319)。 - Neil
3
对我也没用(C++项目),但下面AndreiM和dtopham75发布的解决方案(/p:PostBuildEventUseInBuild=false)却有效。 - Michaël
使用 /p:PostBuildEvent="" 并没有起作用。它导致 MSBuild 尝试运行命令 "" (MS Build Tools 2019)。 - Florian Winter

19

看起来答案取决于项目类型。

对于C/C++项目(.vcxproj),您可以使用/p:PostBuildEventUseInBuild=false命令在命令行上抑制PostBuildEvent,正如AndreiM所建议的那样。

(将 /p:PostBuildEvent 设置为空字符串对于C++项目无效,我找不到其他覆盖后构建命令的方法)。

对于C#项目(.csproj),您可以使用/p:PostBuildEvent=命令在命令行上抑制PostBuildEvent,就像大多数其他回复者建议的那样。


请注意,对于 C# 项目,如果您的 .csproj 文件具有一个 Exec 标记,并且 Command 属性设置为 $(PostBuildEvent),则将 PostBuildEvent 设置为空字符串也会清除 Command 属性,从而导致构建错误。为了解决这个问题,我只需将其设置为一些无害的内容,比如“echo skipping post-build event”,就可以解决问题。 - inejwstine

17

您还可以将该属性设置为有条件的

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

11

我会定义一个新的 .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定义为该文件的路径来实现。因此,假设你的构建脚本位于名为MyBuild.proj的文件中,则可以这样调用它:

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

这将导致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>

这是必要的,因为按设计,父级脚本上的属性不会传递到由MSBuild任务执行的构建中。


5

我也尝试了一下msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=,但是对我来说没有起作用,可能是因为我正在使用自定义的属性文件。

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


4
您也可以在MSBuild任务内设置属性:
<MSBuild 
  Projects="$(MSBuildProjectDirectory)\YourProject.csproj" 
  Properties="Configuration=$(BuildConfiguration);BuildingFromBuildProjXml=true;PreBuildEvent=;PostBuildEvent=" 
  ContinueOnError="false" />

3

在一些C#项目中,我需要在Visual Studio构建时使用PostBuildEvent,但在MSBuild和TFS构建中无法使用。为此,我在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目标中发生。它简单、永久,不需要设置参数,并且运行良好。


1
<Target Name="PreBuild" BeforeTargets="PreBuildEvent" 
Condition="'$(VisualStudioDir)' != ''">

在csproj文件中为PreBuild的目标添加此条件是我找到的唯一解决方案。我遇到了这个问题,试图在VSTS中自动化构建,我想跳过项目csproj文件中定义的PreBuild事件。使用Visual Studio 2017,一个.NET Core 2.0项目。
我尝试了这里列出的msbuild命令行建议,但它们都没有对我起作用。

0

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

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

我认为你可以只是用...替换它

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

关闭这些预/后生成事件。(不确定是否需要在导入之前或之后将其放入.proj文件中,或者是否需要修改Microsoft.Common.targets以产生此效果。现在没有时间进行实验...)


这不是你想要做的事情。BeforeBuild和AfterBuild与预构建事件和后构建事件无关。 - Sayed Ibrahim Hashimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接