赞
踩
miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。
开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。
使用 miniprogram-ci 前应访问"微信公众平台-开发-开发设置"后下载代码上传密钥,并配置 IP 白名单 开发者可选择打开 IP 白名单,打开后只有白名单中的 IP 才能调用相关接口。我们建议所有开发者默认开启这个选项,降低风险 代码上传密钥拥有预览、上传代码的权限,密钥不会明文存储在微信公众平台上,一旦遗失必须重置,请开发者妥善保管
miniprogram-ci 目前提供以下能力:
npm install miniprogram-ci --save
安装好以后 在项目中根目录下新建一个名字叫 ci 文件夹
在ci 文件夹里面 创建 preview.js (直接复制我的代码即可)
const ci = require('miniprogram-ci'); const fs = require('fs'); const path = require('path'); let config = { xcxKey: [], //需要上传的小程序列表 version: "", //版本号 desc: "", //备注 appindex: 0 //当前执行到第几个 } exports.start = async () => { //先拿到需要上传的列表,也就是小程序的appid和名称等相关信息,还有上传的版本和备注 fs.readFile( path.join(__dirname, '../xcxkey/xcxkey.json'), 'utf-8', (err, data) => { const fileJson = JSON.parse(data) config.xcxKey = fileJson.xcxKey; config.version = fileJson.version; config.desc = fileJson.desc; config.env = fileJson.env; config.appindex = 0; console.log(`本次提交--${config.xcxKey.map(item=> config.env + item.desc + config.desc)}`); console.log(`版本--${config.version}`); previewStart(); } ); } const previewStart = async () => { if (!config.xcxKey[config.appindex]) { console.log('上传完成') return; } //开始上传,首先修改文件信息 await setProjectConfig(); await setMain(); console.log(`${config.xcxKey[config.appindex].desc}--${config.env}开始`); const project = new ci.Project({ appid: config.xcxKey[config.appindex].appid, type: 'miniProgram', projectPath: path.resolve(__dirname, '../unpackage/dist/dev/mp-weixin'), privateKeyPath: path.resolve(__dirname, `../xcxkey/private.${config.xcxKey[config.appindex].appid}.key`), ignores: ['node_modules/**/*'], }); // 预览 const uploadResult = await ci.preview({ project, version: config.xcxKey[config.appindex].version, desc: `${config.env}——${config.desc}`, setting: { es6: true, minifyJS: true, minifyWXML: true, minifyWXSS: true, minify: true }, qrcodeFormat: 'image', qrcodeOutputDest: path.resolve(__dirname, `../ci/preview-images/${config.xcxKey[config.appindex].title}.jpg`), onProgressUpdate: getstate, pagePath: 'pages/home/index', // 预览页面 searchQuery: '' // 预览参数 [注意!]这里的`&`字符在命令行中应写成转义字符`\&` }); //监听上传过程,如果上传完成延迟10秒再上传下一个 function getstate(e) { console.log('eeee', e); if (e._status === "done" && e._msg === "upload") { console.log(`${config.xcxKey[config.appindex].desc}--${config.env}上传完成`) setTimeout(() => { config.appindex += 1; previewStart(); }, 1000) } } } //修改 project.config.json 内容 const setProjectConfig = async () => { // 要读取和替换的文件路径 const project_config = '../unpackage/dist/dev/mp-weixin/project.config.json'; const promise = new Promise((resolve, reject) => { // 读取 project.config.json fs.readFile( path.join(__dirname, project_config), 'utf8', (err, data) => { if (err) throw err; let json = JSON.parse(data); // 替换 appid 和 projectname json.appid = config.xcxKey[config.appindex].appid; json.projectname = config.xcxKey[config.appindex].name; // 改写 project.config.json 中 appid 和 projectname fs.writeFile( path.join(__dirname, project_config), JSON.stringify(json, null, 4), (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; } //修改 main.js 内容 const setMain = async () => { // 要读取和替换的文件路径 const app_main_file = '../unpackage/dist/dev/mp-weixin/common/main.js'; const promise = new Promise((resolve, reject) => { // 读取 unpackage/dist/dev/mp-weixin/common/main.js fs.readFile( path.join(__dirname, app_main_file), 'utf8', (err, data) => { if (err) throw err; let app_main = data; const hotel_id = config.xcxKey[config.appindex].hotel_id; // 替换 source_hotel_id let re = /(?<=source_hotel_id:").*?(?=",source_hotel_id_end_ci:)/; app_main = app_main.replace(re, hotel_id); // 改写 unpackage/dist/dev/mp-weixin/common/main.js 中 source_hotel_id fs.writeFile( path.join(__dirname, app_main_file), app_main, (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; }
在继续在ci 文件夹创建一个 upload.js (同样直接复制粘贴我的代码)
const ci = require('miniprogram-ci'); const fs = require('fs'); const path = require('path'); let config = { xcxKey: [], //需要上传的小程序列表 version: "", //版本号 desc: "", //备注 env: "", appindex: 0 //当前执行到第几个 } exports.start = async () => { //先拿到需要上传的列表,也就是小程序的appid和名称等相关信息,还有上传的版本和备注 fs.readFile( path.join(__dirname, '../xcxkey/xcxkey.json'), 'utf-8', (err, data) => { const fileJson = JSON.parse(data) console.log(fileJson); config.xcxKey = fileJson.xcxKey; config.version = fileJson.version; config.desc = fileJson.desc; config.env = fileJson.env; config.appindex = 0; console.log(`本次提交--${config.xcxKey.map(item=> config.env + item.desc)} --- config.desc`); console.log(`版本--${config.version}`); uploadStart(); } ); } const uploadStart = async () => { if (!config.xcxKey[config.appindex]) { console.log('上传完成') return; } //开始上传,首先修改文件信息 await setProjectConfig(); await setMain(); console.log(`${config.xcxKey[config.appindex].desc}--${config.env}开始`); const project = new ci.Project({ appid: config.xcxKey[config.appindex].appid, type: 'miniProgram', projectPath: path.resolve(__dirname, '../unpackage/dist/dev/mp-weixin'), privateKeyPath: path.resolve(__dirname, `../xcxkey/private.${config.xcxKey[config.appindex].appid}.key`), ignores: ['node_modules/**/*'], }); // 上传 const uploadResult = await ci.upload({ project, version: config.xcxKey[config.appindex].version, desc: `${config.env}——${config.desc}`, setting: { es6: true, minifyJS: true, minifyWXML: true, minifyWXSS: true, minify: true }, onProgressUpdate: getstate, }); console.log(uploadResult) //监听上传过程,如果上传完成延迟10秒再上传下一个 function getstate(e) { if (e._status == "done" && e._msg == "upload") { console.log(`${config.xcxKey[config.appindex].desc}--${config.env}上传完成`) setTimeout(() => { config.appindex += 1; uploadStart(); }, 1000) } } } //修改 ext.json 内容 const setExtConfig = async () => { // 要读取和替换的文件路径 const project_config = '../ext.json'; const promise = new Promise((resolve, reject) => { // 读取 project.config.json fs.readFile( path.join(__dirname, project_config), 'utf8', (err, data) => { if (err) throw err; let json = JSON.parse(data); // 替换 appid 和 projectname json.extAppid = config.xcxKey[config.appindex].appid; // 改写 project.config.json 中 appid 和 projectname fs.writeFile( path.join(__dirname, project_config), JSON.stringify(json, null, 4), (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; } //修改 project.config.json 内容 const setProjectConfig = async () => { // 要读取和替换的文件路径 const project_config = '../unpackage/dist/dev/mp-weixin/project.config.json'; const promise = new Promise((resolve, reject) => { // 读取 project.config.json fs.readFile( path.join(__dirname, project_config), 'utf8', (err, data) => { if (err) throw err; let json = JSON.parse(data); // 替换 appid 和 projectname json.appid = config.xcxKey[config.appindex].appid; json.projectname = config.xcxKey[config.appindex].name; // 改写 project.config.json 中 appid 和 projectname fs.writeFile( path.join(__dirname, project_config), JSON.stringify(json, null, 4), (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; } //修改 main.js 内容 const setMain = async () => { // 要读取和替换的文件路径 const app_main_file = '../unpackage/dist/dev/mp-weixin/common/main.js'; const promise = new Promise((resolve, reject) => { // 读取 unpackage/dist/dev/mp-weixin/common/main.js fs.readFile( path.join(__dirname, app_main_file), 'utf8', (err, data) => { if (err) throw err; let app_main = data; const hotel_id = config.xcxKey[config.appindex].hotel_id; // 替换 source_hotel_id let re = /(?<=source_hotel_id:").*?(?=",source_hotel_id_end_ci:)/; app_main = app_main.replace(re, hotel_id); // 改写 unpackage/dist/dev/mp-weixin/common/main.js 中 source_hotel_id fs.writeFile( path.join(__dirname, app_main_file), app_main, (err) => { if (err) throw err; resolve(); } ); } ); }); return promise; }
在咱们项目的根目录找到 : package.json 文件 如果没有请 npm init 一下
- {
- "scripts": {
- "upload": "node upload-ci.js",
- "preview": "node preview-ci.js"
- },
- "dependencies": {
- "gulp": "^4.0.2",
- "miniprogram-ci": "^1.8.12"
- }
- }
之后咱们继续在项目根目录创建两个js文件
preview-ci.js (同样直接复制我的代码)
-
- const path = require('path');
- const preview = require(path.join(__dirname, './ci/preview'));
- ;
- (async () => {
-
- preview.start();
-
- })()
upload-ci.js(同样直接复制我的代码)
-
- const path = require('path');
- const upload = require(path.join(__dirname, './ci/upload'));
- ;
- (async () => {
-
- upload.start();
-
- })()
最后 咱们在根目录创建一个 xcxKey 文件夹,里面存放咱们公众平台配置的代码上传秘钥
放好以后再创建一个xcxKey.json 文件
{ "xcxKey": [ { "name": "名称", "title": "title", "appid": "appid", "version": "1.0.0", "desc": "备注" }, { "name": "名称", "title": "title", "appid": "appid", "version": "1.0.0", "desc": "备注" }, { "name": "名称", "title": "title", "appid": "appid", "version": "1.0.0", "desc": "备注" } ], "env": "正式环境", "desc": "备注", "version": "1.0.0" }
- // npm run preview(会把xcxkey中的所有小程序打包预览)
- // npm run upload(会把xcxkey中的所有小程序打包提交体验版)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。