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

时间:2009-11-13 21:02:08

标签: events build msbuild

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

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

更新:

我考虑过对项目文件进行就地(自动)编辑,但更喜欢命令行等效于将“Excluded From Build”(参见“构建事件”选项)设置为“是”事件

9 个答案:

答案 0 :(得分:85)

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

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

答案 1 :(得分:12)

您还可以使属性成为条件

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

答案 2 :(得分:10)

我要做的是定义一个新的.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 task构建其他目标,那么您还应该按如下方式传递它们:

<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任务执行的构建。

答案 3 :(得分:10)

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

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

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

对于C#项目(。csproj),可以在命令行上使用/p:PostBuildEvent=来抑制PostBuildEvent,正如大多数其他响应者所建议的那样。

答案 4 :(得分:4)

您还可以在MSBuild任务中设置属性:

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:1)

在一些C#项目中,我需要PostBuildEvent在Visual Studio构建中工作,但在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目标中发生。它简单,永久,不需要设置参数并且工作正常。

答案 7 :(得分:0)

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

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

我想你可以用

替换它
<PropertyGroup>
    <BuildDependsOn>
        CoreBuild
    </BuildDependsOn>
</PropertyGroup>

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

答案 8 :(得分:0)

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

在项目csproj文件中将此条件添加到PreBuild的Target是唯一对我有用的解决方案。我遇到了这个问题,尝试在VSTS中自动化构建,我想跳过项目csproj文件中定义的PreBuild事件。使用Visual Studio 2017,一个.NET Core 2.0项目。

我尝试了这里列出的msbuild命令行建议,但没有一个对我有效。