功能
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.js
const ci = require('miniprogram-ci')
// 从 package.json 中读取 version,description 和 uploadKey
let { version, description: desc, uploadKey } = require('./package.json')
// 读取小程序 appid
let { 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, // 小程序appid
type: '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_ENV
const appid = require(`../config/${ENV === 'test' ? 'testbuild' : ENV}.json`).ALL_MODULE_APPID
const 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, userEmail
Object.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