当前位置:   article > 正文

小程序一套代码上传多个小程序(店铺连锁)_一套代码如何快速发多个平台得小程序

一套代码如何快速发多个平台得小程序

内容有点多,不过,慢慢看,你总会成功的;

概述

miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。

开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。

密钥及 IP 白名单配置

使用 miniprogram-ci 前应访问"微信公众平台-开发-开发设置"后下载代码上传密钥,并配置 IP 白名单 开发者可选择打开 IP 白名单,打开后只有白名单中的 IP 才能调用相关接口。我们建议所有开发者默认开启这个选项,降低风险 代码上传密钥拥有预览、上传代码的权限,密钥不会明文存储在微信公众平台上,一旦遗失必须重置,请开发者妥善保管

入口

功能

miniprogram-ci 目前提供以下能力:

  1. 上传代码,对应小程序开发者工具的上传
  2. 预览代码,对应小程序开发者工具的预览
  3. 构建 npm,对应小程序开发者工具的: 菜单-工具-构建npm
  4. 上传云开发云函数代码,对应小程序开发者工具的上传云函数能力
  5. 上传云托管代码,对应小程序开发者工具的上传云托管能力
  6. 上传云存储/静态托管文件,对应小程序开发者工具-云开发-云存储和静态托管文件管理
  7. 代理,配置 miniprogram-ci 的网络请求代理方式
  8. 支持获取最近上传版本的 sourceMap
  9. 支持 node 脚本调用方式和 命令行 调用方式

脚本调用

npm install miniprogram-ci --save

代码部分01

安装好以后 在项目中根目录下新建一个名字叫 ci 文件夹

在ci 文件夹里面 创建 preview.js (直接复制我的代码即可)

  1. const ci = require('miniprogram-ci');
  2. const fs = require('fs');
  3. const path = require('path');
  4. let config = {
  5. xcxKey: [], //需要上传的小程序列表
  6. version: "", //版本号
  7. desc: "", //备注
  8. appindex: 0 //当前执行到第几个
  9. }
  10. exports.start = async () => {
  11. //先拿到需要上传的列表,也就是小程序的appid和名称等相关信息,还有上传的版本和备注
  12. fs.readFile(
  13. path.join(__dirname, '../xcxkey/xcxkey.json'),
  14. 'utf-8',
  15. (err, data) => {
  16. const fileJson = JSON.parse(data)
  17. config.xcxKey = fileJson.xcxKey;
  18. config.version = fileJson.version;
  19. config.desc = fileJson.desc;
  20. config.env = fileJson.env;
  21. config.appindex = 0;
  22. console.log(`本次提交--${config.xcxKey.map(item=> config.env + item.desc + config.desc)}`);
  23. console.log(`版本--${config.version}`);
  24. previewStart();
  25. }
  26. );
  27. }
  28. const previewStart = async () => {
  29. if (!config.xcxKey[config.appindex]) {
  30. console.log('上传完成')
  31. return;
  32. }
  33. //开始上传,首先修改文件信息
  34. await setProjectConfig();
  35. await setMain();
  36. console.log(`${config.xcxKey[config.appindex].desc}--${config.env}开始`);
  37. const project = new ci.Project({
  38. appid: config.xcxKey[config.appindex].appid,
  39. type: 'miniProgram',
  40. projectPath: path.resolve(__dirname, '../unpackage/dist/dev/mp-weixin'),
  41. privateKeyPath: path.resolve(__dirname,
  42. `../xcxkey/private.${config.xcxKey[config.appindex].appid}.key`),
  43. ignores: ['node_modules/**/*'],
  44. });
  45. // 预览
  46. const uploadResult = await ci.preview({
  47. project,
  48. version: config.xcxKey[config.appindex].version,
  49. desc: `${config.env}——${config.desc}`,
  50. setting: {
  51. es6: true,
  52. minifyJS: true,
  53. minifyWXML: true,
  54. minifyWXSS: true,
  55. minify: true
  56. },
  57. qrcodeFormat: 'image',
  58. qrcodeOutputDest: path.resolve(__dirname, `../ci/preview-images/${config.xcxKey[config.appindex].title}.jpg`),
  59. onProgressUpdate: getstate,
  60. pagePath: 'pages/home/index', // 预览页面
  61. searchQuery: '' // 预览参数 [注意!]这里的`&`字符在命令行中应写成转义字符`\&`
  62. });
  63. //监听上传过程,如果上传完成延迟10秒再上传下一个
  64. function getstate(e) {
  65. console.log('eeee', e);
  66. if (e._status === "done" && e._msg === "upload") {
  67. console.log(`${config.xcxKey[config.appindex].desc}--${config.env}上传完成`)
  68. setTimeout(() => {
  69. config.appindex += 1;
  70. previewStart();
  71. }, 1000)
  72. }
  73. }
  74. }
  75. //修改 project.config.json 内容
  76. const setProjectConfig = async () => {
  77. // 要读取和替换的文件路径
  78. const project_config = '../unpackage/dist/dev/mp-weixin/project.config.json';
  79. const promise = new Promise((resolve, reject) => {
  80. // 读取 project.config.json
  81. fs.readFile(
  82. path.join(__dirname, project_config),
  83. 'utf8',
  84. (err, data) => {
  85. if (err) throw err;
  86. let json = JSON.parse(data);
  87. // 替换 appid 和 projectname
  88. json.appid = config.xcxKey[config.appindex].appid;
  89. json.projectname = config.xcxKey[config.appindex].name;
  90. // 改写 project.config.json 中 appid 和 projectname
  91. fs.writeFile(
  92. path.join(__dirname, project_config),
  93. JSON.stringify(json, null, 4),
  94. (err) => {
  95. if (err) throw err;
  96. resolve();
  97. }
  98. );
  99. }
  100. );
  101. });
  102. return promise;
  103. }
  104. //修改 main.js 内容
  105. const setMain = async () => {
  106. // 要读取和替换的文件路径
  107. const app_main_file = '../unpackage/dist/dev/mp-weixin/common/main.js';
  108. const promise = new Promise((resolve, reject) => {
  109. // 读取 unpackage/dist/dev/mp-weixin/common/main.js
  110. fs.readFile(
  111. path.join(__dirname, app_main_file),
  112. 'utf8',
  113. (err, data) => {
  114. if (err) throw err;
  115. let app_main = data;
  116. const hotel_id = config.xcxKey[config.appindex].hotel_id;
  117. // 替换 source_hotel_id
  118. let re = /(?<=source_hotel_id:").*?(?=",source_hotel_id_end_ci:)/;
  119. app_main = app_main.replace(re, hotel_id);
  120. // 改写 unpackage/dist/dev/mp-weixin/common/main.js 中 source_hotel_id
  121. fs.writeFile(
  122. path.join(__dirname, app_main_file),
  123. app_main,
  124. (err) => {
  125. if (err) throw err;
  126. resolve();
  127. }
  128. );
  129. }
  130. );
  131. });
  132. return promise;
  133. }

代码部分02

在继续在ci 文件夹创建一个 upload.js (同样直接复制粘贴我的代码)

  1. const ci = require('miniprogram-ci');
  2. const fs = require('fs');
  3. const path = require('path');
  4. let config = {
  5. xcxKey: [], //需要上传的小程序列表
  6. version: "", //版本号
  7. desc: "", //备注
  8. env: "",
  9. appindex: 0 //当前执行到第几个
  10. }
  11. exports.start = async () => {
  12. //先拿到需要上传的列表,也就是小程序的appid和名称等相关信息,还有上传的版本和备注
  13. fs.readFile(
  14. path.join(__dirname, '../xcxkey/xcxkey.json'),
  15. 'utf-8',
  16. (err, data) => {
  17. const fileJson = JSON.parse(data)
  18. console.log(fileJson);
  19. config.xcxKey = fileJson.xcxKey;
  20. config.version = fileJson.version;
  21. config.desc = fileJson.desc;
  22. config.env = fileJson.env;
  23. config.appindex = 0;
  24. console.log(`本次提交--${config.xcxKey.map(item=> config.env + item.desc)} --- config.desc`);
  25. console.log(`版本--${config.version}`);
  26. uploadStart();
  27. }
  28. );
  29. }
  30. const uploadStart = async () => {
  31. if (!config.xcxKey[config.appindex]) {
  32. console.log('上传完成')
  33. return;
  34. }
  35. //开始上传,首先修改文件信息
  36. await setProjectConfig();
  37. await setMain();
  38. console.log(`${config.xcxKey[config.appindex].desc}--${config.env}开始`);
  39. const project = new ci.Project({
  40. appid: config.xcxKey[config.appindex].appid,
  41. type: 'miniProgram',
  42. projectPath: path.resolve(__dirname, '../unpackage/dist/dev/mp-weixin'),
  43. privateKeyPath: path.resolve(__dirname,
  44. `../xcxkey/private.${config.xcxKey[config.appindex].appid}.key`),
  45. ignores: ['node_modules/**/*'],
  46. });
  47. // 上传
  48. const uploadResult = await ci.upload({
  49. project,
  50. version: config.xcxKey[config.appindex].version,
  51. desc: `${config.env}——${config.desc}`,
  52. setting: {
  53. es6: true,
  54. minifyJS: true,
  55. minifyWXML: true,
  56. minifyWXSS: true,
  57. minify: true
  58. },
  59. onProgressUpdate: getstate,
  60. });
  61. console.log(uploadResult)
  62. //监听上传过程,如果上传完成延迟10秒再上传下一个
  63. function getstate(e) {
  64. if (e._status == "done" && e._msg == "upload") {
  65. console.log(`${config.xcxKey[config.appindex].desc}--${config.env}上传完成`)
  66. setTimeout(() => {
  67. config.appindex += 1;
  68. uploadStart();
  69. }, 1000)
  70. }
  71. }
  72. }
  73. //修改 ext.json 内容
  74. const setExtConfig = async () => {
  75. // 要读取和替换的文件路径
  76. const project_config = '../ext.json';
  77. const promise = new Promise((resolve, reject) => {
  78. // 读取 project.config.json
  79. fs.readFile(
  80. path.join(__dirname, project_config),
  81. 'utf8',
  82. (err, data) => {
  83. if (err) throw err;
  84. let json = JSON.parse(data);
  85. // 替换 appid 和 projectname
  86. json.extAppid = config.xcxKey[config.appindex].appid;
  87. // 改写 project.config.json 中 appid 和 projectname
  88. fs.writeFile(
  89. path.join(__dirname, project_config),
  90. JSON.stringify(json, null, 4),
  91. (err) => {
  92. if (err) throw err;
  93. resolve();
  94. }
  95. );
  96. }
  97. );
  98. });
  99. return promise;
  100. }
  101. //修改 project.config.json 内容
  102. const setProjectConfig = async () => {
  103. // 要读取和替换的文件路径
  104. const project_config = '../unpackage/dist/dev/mp-weixin/project.config.json';
  105. const promise = new Promise((resolve, reject) => {
  106. // 读取 project.config.json
  107. fs.readFile(
  108. path.join(__dirname, project_config),
  109. 'utf8',
  110. (err, data) => {
  111. if (err) throw err;
  112. let json = JSON.parse(data);
  113. // 替换 appid 和 projectname
  114. json.appid = config.xcxKey[config.appindex].appid;
  115. json.projectname = config.xcxKey[config.appindex].name;
  116. // 改写 project.config.json 中 appid 和 projectname
  117. fs.writeFile(
  118. path.join(__dirname, project_config),
  119. JSON.stringify(json, null, 4),
  120. (err) => {
  121. if (err) throw err;
  122. resolve();
  123. }
  124. );
  125. }
  126. );
  127. });
  128. return promise;
  129. }
  130. //修改 main.js 内容
  131. const setMain = async () => {
  132. // 要读取和替换的文件路径
  133. const app_main_file = '../unpackage/dist/dev/mp-weixin/common/main.js';
  134. const promise = new Promise((resolve, reject) => {
  135. // 读取 unpackage/dist/dev/mp-weixin/common/main.js
  136. fs.readFile(
  137. path.join(__dirname, app_main_file),
  138. 'utf8',
  139. (err, data) => {
  140. if (err) throw err;
  141. let app_main = data;
  142. const hotel_id = config.xcxKey[config.appindex].hotel_id;
  143. // 替换 source_hotel_id
  144. let re = /(?<=source_hotel_id:").*?(?=",source_hotel_id_end_ci:)/;
  145. app_main = app_main.replace(re, hotel_id);
  146. // 改写 unpackage/dist/dev/mp-weixin/common/main.js 中 source_hotel_id
  147. fs.writeFile(
  148. path.join(__dirname, app_main_file),
  149. app_main,
  150. (err) => {
  151. if (err) throw err;
  152. resolve();
  153. }
  154. );
  155. }
  156. );
  157. });
  158. return promise;
  159. }

代码部分03

在咱们项目的根目录找到 : package.json 文件  如果没有请 npm init 一下

  1. {
  2. "scripts": {
  3. "upload": "node upload-ci.js",
  4. "preview": "node preview-ci.js"
  5. },
  6. "dependencies": {
  7. "gulp": "^4.0.2",
  8. "miniprogram-ci": "^1.8.12"
  9. }
  10. }

代码部分04

之后咱们继续在项目根目录创建两个js文件

preview-ci.js  (同样直接复制我的代码)

  1. const path = require('path');
  2. const preview = require(path.join(__dirname, './ci/preview'));
  3. ;
  4. (async () => {
  5. preview.start();
  6. })()

代码部分05

upload-ci.js(同样直接复制我的代码)

  1. const path = require('path');
  2. const upload = require(path.join(__dirname, './ci/upload'));
  3. ;
  4. (async () => {
  5. upload.start();
  6. })()

结尾

最后 咱们在根目录创建一个  xcxKey  文件夹,里面存放咱们公众平台配置的代码上传秘钥

放好以后再创建一个xcxKey.json 文件

  1. {
  2. "xcxKey": [
  3. {
  4. "name": "名称",
  5. "title": "title",
  6. "appid": "appid",
  7. "version": "1.0.0",
  8. "desc": "备注"
  9. },
  10. {
  11. "name": "名称",
  12. "title": "title",
  13. "appid": "appid",
  14. "version": "1.0.0",
  15. "desc": "备注"
  16. },
  17. {
  18. "name": "名称",
  19. "title": "title",
  20. "appid": "appid",
  21. "version": "1.0.0",
  22. "desc": "备注"
  23. }
  24. ],
  25. "env": "正式环境",
  26. "desc": "备注",
  27. "version": "1.0.0"
  28. }
  1. // npm run preview(会把xcxkey中的所有小程序打包预览)
  2. // npm run upload(会把xcxkey中的所有小程序打包提交体验版)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/412995
推荐阅读
相关标签
  

闽ICP备14008679号