使用GitHub Actions(YML)创建MSI文件时vdproj项目无法构建
vdproj安装项目在GitHub Actions工作流中构建失败排查方案
vdproj(Visual Studio Installer 安装项目)不属于MSBuild原生支持的项目类型,直接调用msbuild命令构建整个解决方案时,会默认跳过或报错无法编译该类项目,叠加现有配置的语法问题、环境适配问题就会导致构建失败,具体修复步骤如下:
1 修正现有YAML的基础语法错误
当前工作流的steps块存在格式问题,会导致步骤执行异常:
- checkout、setup-node、setup-msbuild三个步骤缺少
-前缀,全局缩进不统一 - node-version、vswhere-path等参数值使用了中文全角单引号
‘’,需要替换为英文半角单引号
修正后的基础步骤结构参考:
name: xxx-github-actions on: [push] jobs: build-release-configuration: runs-on: self-hosted steps: - name: checkout uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '14' - name: Add msbuild to Path uses: microsoft/setup-msbuild@v1 with: vswhere-path: 'C:\Program Files (x86)\Microsoft Visual Studio\Installer' vs-version: '[15.9,16.0)' - uses: nuget/setup-nuget@v1 with: nuget-version: 4.7.1 - run: nuget restore xxx.project.sln
2 解决vdproj无法被MSBuild直接构建的核心问题
MSBuild从Visual Studio 2012版本开始默认移除了vdproj项目的构建支持,需要做以下适配:
- 确认自托管Runner上安装的Visual Studio 2017已经勾选安装了
Microsoft Visual Studio Installer Projects扩展,缺少该扩展时IDE本身也无法正常构建vdproj项目 - 不要直接用msbuild命令构建整个解决方案,先单独编译所有C++、C#、C++/CLI业务项目,再调用Visual Studio自带的devenv命令行工具构建vdproj安装项目,devenv原生支持vdproj类型的编译逻辑
替换原有整行msbuild构建命令为以下两步:
# 先构建所有非安装类业务项目,注意把命令里的Install替换为你自己的vdproj项目名称 - run: msbuild xxx.project.sln /p:Configuration=Release /p:Platform=x64 /t:!"Install" # 调用devenv构建vdproj安装项目,根据自托管机器上的VS2017版本替换路径里的Enterprise为Community/Professional - run: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe" xxx.project.sln /Build "Release|x64" /Project "你的安装项目名.vdproj"'
如果不确定排除安装项目的过滤规则写法,也可以逐个调用msbuild构建所有C++、C#、C++/CLI业务项目,再执行devenv构建安装包步骤,避免规则写错漏编译业务代码。
3 自托管Runner环境检查项
- 不要用SYSTEM系统账号启动Runner服务,建议用本地管理员账号启动,保证有足够权限访问VS安装目录、项目输出目录
- 确认vdproj项目里配置的主程序、依赖文件路径,和业务项目实际输出路径完全一致,避免打包时找不到文件
- 如果构建时提示COM组件相关错误,先在自托管机器上手动打开一次Visual Studio,完成首次启动的初始化配置,devenv命令行才能正常工作
内容的提问来源于stack exchange,提问作者JerryK
相关产品推荐
相关产品推荐

