Events 能否阻止MSBuild.exe运行生成事件?

Events 能否阻止MSBuild.exe运行生成事件?,events,build,msbuild,Events,Build,Msbuild,我正在通过脚本构建许多项目,偶尔使用自定义构建事件会给构建系统带来很大的困难。如果可能,我希望在was中调用MSBuild.exe以阻止任何生成事件的执行。从长远来看,这不是构建自动化的问题——具有构建事件的项目的提交者会被预先警告,这样的混乱是违反规则的 简而言之,是否有一种调用MSBuild的方法可以阻止执行任何自定义生成步骤(如果存在) 更新: 我曾考虑对项目文件进行就地(自动)编辑,但对于这三个事件中的每一个,我更喜欢命令行设置“排除在生成之外”(请参阅生成事件选项),而不是“是”。默认

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

简而言之,是否有一种调用MSBuild的方法可以阻止执行任何自定义生成步骤(如果存在)

更新:


我曾考虑对项目文件进行就地(自动)编辑,但对于这三个事件中的每一个,我更喜欢命令行设置“排除在生成之外”(请参阅生成事件选项),而不是“是”。

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

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

建造前;
核心构建;
后建
我想你可以把它换成

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

核心构建

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

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

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

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

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

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

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

<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任务执行的生成。

也可以将该属性设置为条件属性

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

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


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


然而,我发现有效的方法是:PostBuildEventUseInBuild=false

根据项目类型,答案似乎有所不同

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

(设置<代码> /p:PuxBuffeldEng/<代码>空字符串对C++项目无效,我找不到任何其他方法来取代POST生成命令)。< /P> 对于C#projects(.csproj),可以使用

/p:PostBuildEvent=
在命令行上抑制PostBuildEvent,正如大多数其他响应者所建议的那样

在某些C#项目中,我需要在Visual studio build中使用PostBuildEvent,但在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目标中发生。它简单、永久,无需设置参数,工作正常。


<Target Name="PreBuild" BeforeTargets="PreBuildEvent" 
Condition="'$(VisualStudioDir)' != ''">
将此条件添加到项目csproj文件中预构建的目标中是唯一适合我的解决方案。我在尝试在VSTS中自动生成时遇到了这个问题,我想跳过项目csproj文件中定义的预生成事件。使用Visual Studio 2017,一个.NET核心2.0项目


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

这不是你想做的。BeforeBuild和AfterBuild与生成前和生成后事件无关。这似乎对我不起作用,我正在使用MSBuild v4.0.30319.17929使用MSBuild foo.sln/p:PreBuildEvent=“”/p:PostBuildEvent=“”)对我起作用(MSBuild v4.0.30319)。它对我也不起作用(C++项目),但解决方案(/p:PostBuildEventUseInBuild=false)下面由AndreiM和dtopham75发布的帖子效果很好。使用
/p:PostBuildEvent=“
不起作用。它导致MSBuild尝试运行命令
(MS Build Tools 2019)。请注意,对于C#项目,如果.csproj文件具有Exec标记,且命令属性设置为$(PostBuildEvent),则将PostBuildEvent设置为空字符串也将清除命令属性,这将导致生成错误。为了解决这个问题,我只是将其设置为“echo skipping post build event”之类的良性设置,这样就行了。
<Target Name="PreBuild" BeforeTargets="PreBuildEvent" 
Condition="'$(VisualStudioDir)' != ''">