功能
miniprogram-ci 目前提供以下能力:
- 上传代码,对应小程序开发者工具的上传
- 预览代码,对应小程序开发者工具的预览
- 构建 npm,对应小程序开发者工具的: 菜单-工具-构建npm
- 上传云开发云函数代码,对应小程序开发者工具的上传云函数能力
- 上传云托管代码,对应小程序开发者工具的上传云托管能力
- 上传云存储/静态托管文件,对应小程序开发者工具-云开发-云存储和静态托管文件管理
- 代理,配置 miniprogram-ci 的网络请求代理方式
- 支持获取最近上传版本的 sourceMap
- 支持 node 脚本调用方式和 命令行 调用方式
1. 在微信后台下载秘钥。
“微信公众平台-开发-开发设置”下载代码上传密钥,并配置 IP 白名单。打开后只有白名单中的 IP 才能调用相关接口。
获得密钥文件一般为,private.${appid}.key。
2. 安装上传工具。
在项目中安装 miniprogram-ci。
npm install miniprogram-ci --save
3. 放置密钥
在 package.json 文件中添加上传密钥所在路径。本文新建 key 文件夹存放该密钥
项目中文件名 private.wxappid.key
// package.json......"uploadKey": "/key/private.wxappid.key",......
4. 添加上传脚本。
在项目根目录下添加 upload.wx.js 文件。
// upload.wx.jsconst ci = require('miniprogram-ci')// 从 package.json 中读取 version,description 和 uploadKeylet { version, description: desc, uploadKey } = require('./package.json')// 读取小程序 appidlet { appid } = require('./project.config.json')if (!version) version = '1.0.0'if (!desc) desc = new Date() + '上传'if (!appid) appid = 'touristid'if (!uploadKey) uploadKey = `/key/private.${appid}.key`// 创建项目对象const project = new ci.Project({appid, // 小程序appidtype: 'miniProgram', // 类型,小程序或小游戏projectPath: process.cwd(), // 项目路径privateKeyPath: process.cwd() + uploadKey, // 密钥路径ignores: ['node_modules/**/*'], // 忽略的文件})// 调用上传方法ci.upload({project,version,desc,setting: {es6: true, // 是否 "es6 转 es5"minify: true, // 是否压缩代码},}).then(res => {console.log(res)console.log('上传成功')}).catch(error => {if (error.errCode == -1) {console.log('上传成功')}console.log(error)console.log('上传失败')process.exit(-1)})
5. 执行上传
node upload.wx.js
6.simple-git
const dayjs = require('dayjs')const ci = require('miniprogram-ci')const path = require('path')const simpleGit = require('simple-git')const git = simpleGit()const ENV = process.env.NODE_ENVconst appid = require(`../config/${ENV === 'test' ? 'testbuild' : ENV}.json`).ALL_MODULE_APPIDconst projectPath = path.resolve(__dirname,`../dist/${ENV === 'development' ? 'dev' : ENV === 'test' ? 'test' : 'prod'}`,)const privateKeyPath = path.resolve(__dirname, `../config/private.${appid}.key`)const minorVersion = require('../package.json').version.split('.').slice(0, 2).join('.')const version = `${minorVersion}.${dayjs().format('MMDDHHmmss')}`;(async () => {const { userName, userEmail } = await getUserNameAndUserEmail()const commitMsg = await getLastCommit()const project = new ci.Project({appid,type: 'miniProgram',projectPath,privateKeyPath,ignores: ['node_modules/**/*'],})const uploadResult = await ci.upload({project,version,desc: `发布人: ${userName}<${userEmail}> ${dayjs().format('YYYY-MM-DD HH:mm:ss')} \n\r${commitMsg}`,setting: {minifyWXML: true,minifyWXSS: true,minifyJS: true,minify: true,},// onProgressUpdate: console.log,robot: 1,})console.log(uploadResult)console.log('ENV: ', ENV)console.log('appid: ', appid)console.log('version: ', version)})()async function getUserNameAndUserEmail() {const configList = await git.listConfig()let userName, userEmailObject.keys(configList.values).some(file => {const value = configList.values[file]if (value['user.name'] && value['user.email']) {userName = value['user.name']userEmail = value['user.email']return true}})return { userName, userEmail }}async function getLastCommit() {const { latest } = await git.log({ maxCount: 1 })return `提交信息:(${latest.hash.slice(0, 8)}) ${latest.message}`}
更多信息请参考微信小程序官方文档:
https://developers.weixin.qq.com/miniprogram/dev/devtools/ci.html
