如何让预生成事件命令仅在本地构建执行,而非VSTS CI服务器?
如何让预生成事件仅在本地构建时运行
当然有办法实现!除了用配置名称区分,还有几种更精准的方式来识别CI环境和本地环境,让你的预生成命令只在本地执行:
利用VSTS/Azure DevOps内置环境变量
CI构建服务器会自动设置一系列专属的环境变量,比如BUILD_BUILDNUMBER、AGENT_ID或者SYSTEM_TEAMPROJECT,这些变量在本地构建时是不存在的。你可以在预生成事件里通过判断这些变量是否存在来控制命令执行:if not defined BUILD_BUILDNUMBER ( # 这里写你的预生成命令,比如复制文件、生成资源等 echo 执行本地预生成事件... )原理很简单:CI环境下这些变量会被自动注入,本地没有,所以当变量未定义时就执行本地逻辑。
使用
BuildingInsideVisualStudio内置属性
MSBuild有一个内置属性BuildingInsideVisualStudio,当你在Visual Studio里本地构建时,它的值是true;而通过CI服务器的MSBuild命令行构建时,这个值是false。直接用这个属性做判断:if $(BuildingInsideVisualStudio) == true ( 你的预生成命令 )注意:如果本地偶尔会用MSBuild命令行构建,这个方法就不适用了,因为此时
BuildingInsideVisualStudio也会是false。自定义项目属性+CI构建参数
你可以在项目文件(.csproj/.vbproj)里添加一个自定义属性,默认标记为本地构建,然后在CI构建定义里覆盖这个属性:- 编辑项目文件,添加如下属性组:
<PropertyGroup> <IsLocalBuild Condition="'$(IsLocalBuild)' == ''">true</IsLocalBuild> </PropertyGroup> - 预生成事件里用这个属性判断:
if $(IsLocalBuild) == true ( 你的预生成命令 ) - 在VSTS/Azure DevOps的CI构建定义中,找到MSBuild参数设置,添加
/p:IsLocalBuild=false,这样CI构建时就会跳过预生成事件。
- 编辑项目文件,添加如下属性组:
这几种方法里,第一种和第二种最常用,你可以根据自己的构建习惯选择——如果本地都是用VS构建,第二种最省心;如果本地也会用命令行构建,第一种或者第三种更稳妥。
内容的提问来源于stack exchange,提问作者Dan Cundy
相关产品推荐
相关产品推荐

