随着业务发展,小程序包越来越多时,我们手动上传小程序包到官方后台越来越麻烦,且可能出现配置错误。我们该怎么办???(解放双手,一切交给脚本)
- 新建与pages同级的nimiprogramCi文件。内部维护小程序上传秘钥(nimiprogramCi.uploadProjectKey)和动态写入的小程序信息(nimiprogramCi.appInfo)
2. 将 nimiprogramCi.appInfo 中信息引入app.js, 并赋值给全局变量 this.globalData.tagOptions
- 新建与app.js同级的 ci_upload.js 文件,写我们的批量上传脚本
- 将维护小程序信息的文件内部格式改为key(小程序appid)-value(小程序信息)格式
- 文件结构注释
完整代码: nimiprogramCi.uploadProjectKey 文件下维护小程序代码上传密钥
js
// utils.config.js
const tagOptions = {
"wx0xxxxxxxxxxxxxx": {
app:'app名称',
appName:'小程序名称',
pname:'包名(与服务端一致)',
vn:'1.3.14', // 版本号
appid:'wx0xxxxxxxxxxxxxx'
}
}
module.exports = {
tagOptions: tagOptions
}
// nimiprogramCi.appInfo.js
const { tagOptions } = require("../utils/config.js");
module.exports = {appInfo: tagOptions['wx9xxxxxxxxxxxxx']} // 导出对应你的小程序信息
// app.js
const { appInfo } = require("./miniprogramCi/appInfo.js") // 引入对应的小程序信息
App({
onLaunch(){},
onShow(){
this.initFn()
},
// 初始化全局配置
initFn () {
// 设置版本号,将小程序信息赋值到全局对象【globalData.tagOptions】
this.globalData.tagOptions = appInfo // node readFileSync写入[miniprogramCi.js]文件
this.globalData.vn = this.globalData.tagOptions.vn
console.log('小程序:' + this.globalData.tagOptions.appName, '版本:' + this.globalData.tagOptions.vn)
},
})
// ci_upload.js
const ci = require('miniprogram-ci') // 小程序 CI 工具
const path = require("path")
const fs = require('fs') // fs.writeFileSync 同步动态写入小程序信息
const filePath = path.join(__dirname,'./miniprogramCi/appInfo.js')
// 【appId】维护需批量上传的小程序appid,即为config文件中【key】
let appId = [
"wx9xxxxxxxxxxxxxxxx",
"wx5xxxxxxxxxxxxxxxx1",
"wx0xxxxxxxxxxxxxxxx",
"wx6xxxxxxxxxxxxxxxx",
]
let ci_production = process.argv.lastIndexOf('ci_upload') !== -1
function miniprogramCiUpload (i){
if(!appId[i]) return // 上传完毕,终止运行
fs.writeFileSync(filePath, `
const { tagOptions } = require("../utils/config.js");
module.exports = {appInfo: tagOptions['${appId[i]}']}`)
// 创建项目实例
let project = new ci.Project({
appid: appId[i], // 小程序appid
type: 'miniProgram',
projectPath: process.cwd(), // 项目路径
privateKeyPath: process.cwd() + `/miniprogramCi/uploadProjectKey/private.${appId[i]}.key`, // 上传秘钥路径
robot: 1, // robot 仅支持1--30, 不支持其他描述
ignores: ['node_modules/**/*'],
})
if(ci_production){
// 项目上传
ci_upload(project)
} else {
// 项目预览二维码
ci_perview(project)
}
}
function ci_upload(project){
ci.upload({
project,
version: '1.1.1',
desc: '测试批量上传',
setting: {
minify: true,
},
}).then(res => {
console.log('上传成功')
miniprogramCiUpload(i+1)
}).catch(error => {
if (error.errCode == -1) {
console.log('上传成功')
miniprogramCiUpload(i+1)
} else {
console.error(error, appId[i], '上传失败')
miniprogramCiUpload(i+1)
process.exit(-1) // 将强制进程尽快退出,即使仍有未完全完成的异步操作挂起
}
})
}
function ci_perview(project){
ci.preview({
project,
desc: '测试批量上传', // 此备注将显示在"小程序助手"开发版列表中
setting: {
es6: true,
},
qrcodeFormat: 'image',
qrcodeOutputDest: `${process.cwd()}/qrImage/${appId[i]}.jpg`, // 存放生成的二维码
pagePath: 'pages/reader/reader', // 预览页面
searchQuery: 'a=1&b=2', // 预览参数 [注意!]这里的`&`字符在命令行中应写成转义字符`\&`
}).then((res)=>{
miniprogramCiUpload(i+1)
}).catch((err)=>{
if (err.errCode == -1) {
miniprogramCiUpload(i+1)
}
})
}
miniprogramCiUpload(0) // 开始执行编译和上传,默认传0,
// package.json
{
"name": "miniprogram_ci",
"version": "1.0.0",
"description": "miniprogram_ci",
"author": "author",
"scripts": {
"up": "node ci_upload.js ci_upload",
"qr": "node ci_upload.js ci_preview"
},
"dependencies": {
"miniprogram-ci": "^1.9.15"
}
}