Events 能否阻止MSBuild.exe运行生成事件?
我正在通过脚本构建许多项目,偶尔使用自定义构建事件会给构建系统带来很大的困难。如果可能,我希望在was中调用MSBuild.exe以阻止任何生成事件的执行。从长远来看,这不是构建自动化的问题——具有构建事件的项目的提交者会被预先警告,这样的混乱是违反规则的 简而言之,是否有一种调用MSBuild的方法可以阻止执行任何自定义生成步骤(如果存在) 更新:Events 能否阻止MSBuild.exe运行生成事件?,events,build,msbuild,Events,Build,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)' != ''">