我正在通过脚本构建许多项目,偶尔使用自定义构建事件会给构建系统带来很大的困难。如果可能的话,我想调用MSBuild.exe,以阻止任何构建事件的执行。从长远来看,这不是构建自动化的问题 - 具有构建事件的项目的提交者被预先警告,这样的破坏是违反规则的。
简而言之,有没有办法调用MSBuild来阻止执行任何自定义构建步骤(如果存在)?
更新:
我考虑过对项目文件进行就地(自动)编辑,但更喜欢命令行等效于将“Excluded From Build”(参见“构建事件”选项)设置为“是”事件
答案 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命令行建议,但没有一个对我有效。