Sni*_*gus 53 msbuild events build
我正在通过脚本构建许多项目,偶尔使用自定义构建事件会给构建系统带来很大的困难.如果可能的话,我想调用MSBuild.exe,以阻止任何构建事件的执行.从长远来看,这不是构建自动化的问题 - 具有构建事件的项目的提交者被预先警告,这样的破坏是违反规则的.
简而言之,有没有办法调用MSBuild来阻止执行任何自定义构建步骤(如果存在)?
更新:
我考虑过对项目文件进行就地(自动)编辑,但是对于三个事件中的每一个,我更喜欢命令行等效于将"Excluded From Build"(参见Build Events选项)设置为Yes.
rad*_*cal 90
Pre/PostBuildEvents是属性,因此要覆盖它们,只需将它们从命令行设置为空字符串即可.
msbuild foo.sln /p:PreBuildEvent= /p:PostBuildEvent=
Run Code Online (Sandbox Code Playgroud)
Sar*_*rin 13
您也可以使该属性有条件
<PreBuildEvent Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true"> ... </PreBuildEvent>
Run Code Online (Sandbox Code Playgroud)
dto*_*m75 11
似乎答案因项目类型而异.
对于C/C++项目(.vcxproj),您可以使用/p:PostBuildEventUseInBuild=false
AndreiM建议的命令行来抑制PostBuildEvent .
(设置/p:PostBuildEvent
为空字符串不适用于C++项目,我找不到任何其他方法来覆盖后构建命令).
对于C#项目(.csproj),您可以使用/p:PostBuildEvent=
大多数其他响应者建议的命令行来抑制PostBuildEvent .
Say*_*imi 10
我要做的是定义一个新的.proj文件,比如C:\ Data\SupressBuildEvents.proj,它将包含:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="PostBuildEvent"/>
<Target Name="PreBuildEvent" />
</Project>
Run Code Online (Sandbox Code Playgroud)
然后,您需要指定在Microsoft.Common.targets之后导入这些文件,并且您可以通过将已知属性CustomAfterMicrosoftCommonTargets定义到该文件的路径来实现.因此,让您的构建脚本位于名为MyBuild.proj的文件中,您可以将其调用为:
msbuild MyBuild.proj /p:CustomAfterMicrosoftCommonTargets="C:\Data\SupressBuildEvents.proj
"
Run Code Online (Sandbox Code Playgroud)
这将导致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>
Run Code Online (Sandbox Code Playgroud)
这是必要的,因为父脚本上的设计属性不会传递给MSBuild任务执行的构建.
我也玩了一点msbuild foo.vcxproj /p:PreBuildEvent= /p:PostBuildEvent=
,但对我来说它不起作用,可能是因为我使用了自定义道具文件。
然而,我发现有效的是 /p:PostBuildEventUseInBuild=false
默认情况下,当您导入 Microsoft.Common.targets 时,您会得到
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
我想你也许可以将其替换为
<PropertyGroup>
<BuildDependsOn>
CoreBuild
</BuildDependsOn>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
关闭这些构建前/构建后事件。(不确定您是否需要在导入之前或之后将其放入 .proj 文件中,或者是否需要修改 Microsoft.Common.targets 才能达到这样的效果。现在没有时间进行实验...)
归档时间: |
|
查看次数: |
19563 次 |
最近记录: |