概述
miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。
开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。
miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览,调用方式与普通开发模式无异。查看详情
密钥及 IP 白名单配置
使用 miniprogram-ci 前应访问'微信公众平台-开发-开发设置'后下载代码上传密钥,并配置 IP 白名单 开发者可选择打开 IP 白名单,打开后只有白名单中的 IP 才能调用相关接口。我们建议所有开发者默认开启这个选项,降低风险 代码上传密钥拥有预览、上传代码的权限,密钥不会明文存储在微信公众平台上,一旦遗失必须重置,请开发者妥善保管

功能
miniprogram-ci 目前提供以下能力:
- 上传代码,对应小程序开发者工具的上传
- 预览代码,对应小程序开发者工具的预览
- 构建 npm,对应小程序开发者工具的: 菜单-工具-构建npm
- 上传云开发云函数代码,对应小程序开发者工具的上传云函数能力
- 上传云托管代码,对应小程序开发者工具的上传云托管能力
- 上传云存储/静态托管文件,对应小程序开发者工具-云开发-云存储和静态托管文件管理
- 代理,配置 miniprogram-ci 的网络请求代理方式
- 支持获取***近上传版本的 sourceMap
- 支持 node 脚本调用方式和 命令行 调用方式
脚本调用
项目对象
项目对象是本模块主要的入参,可以依据下边的定义自行实现
项目对象的定义:
| 键 | 类型 | 说明 |
|---|
| appid | 属性 | 小程序/小游戏项目的 appid |
| type | 属性 | 项目的类型,有效值 miniProgram/miniProgramPlugin/miniGame/miniGamePlugin |
| projectPath | 属性 | 项目的路径,即 project.config.json 所在的目录 |
| privateKey | 属性 | 私钥,在获取项目属性和上传时用于鉴权使用,在 微信公众平台 上登录后下载 |
| attr | 异步方法 | 项目的属性,如指定了 privateKey 则会使用真实的项目属性 |
| stat | 同步方法 | 特定目录下前缀下(prefix)文件路径 (filePath) 的 stat, 如果不存在则返回 undefined |
| getFile | 异步方法 | 特定目录下前缀下(prefix)文件路径 (filePath) 的 Buffer |
| getFileList | 同步方法 | 特定目录下前缀下(prefix)文件路径 (filePath) 下的文件列表 |
| updateFile | 同步方法 | 更新项目文件 |
也可以通过指定项目路径来创建该对象
| 键 | 类型 | 必填 | 说明 |
|---|
| appid | string | 是 | 合法的小程序/小游戏 appid |
| projectPath | string | 是 | 项目路径 |
| privateKeyPath | string | 是 | 私钥的路径 |
| type | string | 否 | 显示指明当前的项目类型, 默认为 miniProgram,有效值 miniProgram/miniProgramPlugin/miniGame/miniGamePlugin |
| ignores | string[] | 否 | 指定需要排除的规则 |
上传
参数
| 键 | 类型 | 必填 | 说明 |
|---|
| project | IProject | 是 | #项目对象 |
| version | string | 是 | 自定义版本号 |
| desc | string | 否 | 自定义备注 |
| setting | object | 否 | #编译设置 |
| onProgressUpdate | function | 否 | 进度更新监听函数 |
| robot | number | 否 | 指定使用哪一个 ci 机器人,可选值:1 ~ 30 |
| threads | number | 否 | 指定本地编译过程中开启的线程数 |
返回
| 键 | 类型 | 必填 | 说明 |
|---|
| subPackageInfo | Array<{name:string, size:number}> | 否 | 小程序包信息, name 为 __FULL__ 时表示整个小程序包, name 为 __APP__ 时表示小程序主包,其他情况都表示分包 |
| pluginInfo | Array<{pluginProviderAppid:string, version: string, size:number}> | 否 | 小程序插件信息 |
| devPluginId | string | 否 | 插件开发模式下,上传版本的插件 id |
预览
参数
| 键 | 类型 | 必填 | 说明 |
|---|
| project | IProject | 是 | #项目对象 |
| desc | string | 否 | 自定义备注,将显示在“小程序助手”开发版列表中 |
| setting | object | 否 | #编译设置 |
| onProgressUpdate | function | 否 | 进度更新监听函数 |
| robot | number | 否 | 指定使用哪一个 ci 机器人,可选值:1 ~ 30 |
| qrcodeFormat | string | 否 | 返回二维码文件的格式 'image' 或 'base64', 默认值 'terminal' 供调试用 |
| qrcodeOutputDest | string | 是 | 二维码文件保存路径 |
| pagePath: | string | 否 | 预览页面路径 |
| searchQuery: | string | 否 | 预览页面路径启动参数 |
| scene | number | 否 | 默认值 1011,具体含义见场景值列表 |
返回
| 键 | 类型 | 必填 | 说明 |
|---|
| subPackageInfo | Array<{name:string, size:number}> | 否 | 小程序包信息, name 为 __FULL__ 时表示整个小程序包, name 为 __APP__ 时表示小程序主包,其他情况都表示分包 |
| pluginInfo | Array<{pluginProviderAppid:string, version: string, size:number}> | 否 | 小程序插件信息 |
构建npm
对应开发者工具构建npm功能。
| 参数 | 类型 | 必填 | 说明 |
|---|
| project | IProject | 是 | 项目对象 |
| options.ignores | string[] | 否 | 指定构建npm需要排除的规则 |
| options.reporter | function | 否 | 构建回调信息 |
拉取***近上传版本的sourceMap
参数
| 键 | 类型 | 必填 | 说明 |
|---|
| project | IProject | 是 | #项目对象 |
| robot | number | 是 | 指定使用哪一个 ci 机器人,可选值:1 ~ 30 |
| sourceMapSavePath | string | 是 | 保存的路径 |
自定义 node_modules 位置的构建 npm
有的时候,需要被构建模块对应的 node_modules 可能并不在小程序项目内,所以提供了一个新的接口来支持这个需求。 例如有如下项目结构
于是可以这样调用
得到的***终项目
| 参数 | 类型 | 必填 | 说明 |
|---|
| options.packageJsonPath | string | 是 | 希望被构建的node_modules 对应的 package.json 的路径 |
| options.miniprogramNpmDistDir | string | 是 | 被构建 miniprogram_npm 的目标位置目标位置 |
| options.ignores | string[] | 否 | 指定需要排除的规则 |
上传云开发云函数
对应开发者工具云开发的云函数上传能力。
| 参数 | 类型 | 必填 | 说明 |
|---|
| project | IProject | 是 | 项目对象 |
| env | string | 是 | 云环境 ID |
| name | string | 是 | 云函数名称 |
| path | string | 是 | 云函数代码目录 |
| remoteNpmInstall | boolean | 否 | 是否云端安装依赖,默认 false |
remoteNpmInstall 额外说明:true 时云端安装依赖,不会上传本地 node_modules,false 时全量上传,包括上传 node_modules。
上传云开发静态网站/云存储
对应开发者工具云开发的静态网站托管和云存储的上传能力。
需要安装 alpha 版本:npm install --save miniprogram-ci@alpha
| 参数 | 类型 | 必填 | 说明 |
|---|
| project | IProject | 是 | 项目对象 |
| env | string | 是 | 云环境 ID |
| path | string | 是 | 本地文件目录 |
| remotePath | boolean | 否 | 要上传到的远端文件目录 |
新建云开发云托管版本
对应开发者工具云开发的云托管新建版本能力。
需要安装 alpha 版本:npm install --save miniprogram-ci@alpha
| 参数 | 类型 | 必填 | 说明 |
|---|
| project | IProject | 是 | 项目对象 |
| env | string | 是 | 云环境 ID |
| containerRoot | string | 是 | 本地容器文件目录 |
| version.uploadType | string | 是 | 上传类型(package/repository/image) |
| version.flowRatio | number | 是 | 新建版本后的默认流量比例 |
| version.cpu | number | 是 | CPU 核心数量(需参考 容器规格) |
| version.mem | number | 是 | 内存大小(需参考 容器规格) |
| version.minNum | number | 是 | ***小副本数 |
| version.maxNum | number | 是 | ***副本数 |
| version.policyType | string | 是 | 扩缩容条件,目前只支持:cpu |
| version.policyThreshold | number | 是 | 扩缩容阈值 |
| version.containerPort | number | 是 | 容器监听端口 |
| version.serverName | string | 是 | 服务名称 |
| version.versionRemark | string | 否 | 版本备注 |
| version.dockerfilePath | string | 否 | Dockerfile 路径 |
| version.buildDir | string | 否 | 构建目录 |
| version.envParams | string | 否 | 环境变量 |
代理
miniprogram-ci 使用了 get-proxy 模块来自动获取代理地址。 如果不适用ci.proxy()方法或者--proxy参数来指定代理,那么 miniprogram-ci 将会按照以下顺序去获取 https 代理地址
- 获取环境变量中的
HTTPS_PROXY - 获取环境变量中的
https_proxy - 获取环境变量中的
HTTP_PROXY - 获取环境变量中的
http_proxy - 获取npm配置的
https-proxy - 获取npm配置的
http-proxy - 获取npm配置的
proxy - 把
servicewechat.com 加入到环境变量中的 no_proxy,miniprogram-ci 将不通过代理发送网络请求
命令行调用
编译设置
| 键 | 类型 | 说明 |
|---|
| es6 | boolean | 对应小程序开发者工具的 'es6 转 es5' |
| es7 | boolean | 对应小程序开发者工具的 '增强编译' |
| minifyJS | boolean | 压缩 JS 代码 |
| minifyWXML | boolean | 压缩 WXML 代码 |
| minifyWXSS | boolean | 压缩 WXSS 代码 |
| minify | boolean | 压缩所有代码,对应小程序开发者工具的 '压缩代码' |
| codeProtect | boolean | 对应小程序开发者工具的 '代码保护' |
| autoPrefixWXSS | boolean | 对应小程序开发者工具的 '样式自动补全' |
关于小程序开发者工具代码编译选项
第三方平台开发
miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览,调用方式与普通开发模式无异。 使用第三方平台开发模式时,应注意:
- 请确保项目中存在正确的
ext.json - 密钥文件是第三方平台绑定的开发小程序
appid 的密钥文件 - ip白名单是第三方平台绑定的开发小程序
appid 的 ip 白名单 - 调用传入的
appid 是第三方平台绑定的开发小程序 appid 关于第三方平台开发模式,请参考这里