30多个小程序一键发布——miniprogram-ci

这篇具有很好参考价值的文章主要介绍了30多个小程序一键发布——miniprogram-ci。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

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

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

miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览,调用方式与普通开发模式无异。查看详情

密钥及 IP 白名单配置

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

30多个小程序一键发布——miniprogram-ci,# 小程序,小程序,miniprogram-ci,ci机器人,ci

功能

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

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

脚本调用

npm install miniprogram-ci --save

代码

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;
}




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

{
	"scripts": {
		"upload": "node upload-ci.js",
		"preview": "node preview-ci.js"
	},
	"dependencies": {
		"gulp": "^4.0.2",
		"miniprogram-ci": "^1.8.12"
	}
}

30多个小程序一键发布——miniprogram-ci,# 小程序,小程序,miniprogram-ci,ci机器人,ci

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();

})()

30多个小程序一键发布——miniprogram-ci,# 小程序,小程序,miniprogram-ci,ci机器人,ci文章来源地址https://www.toymoban.com/news/detail-518098.html

{
	"xcxKey": [
		{
			"name": "名称",
			"title": "title",
			"appid": "appid",
			"version": "1.0.0",
			"desc": "备注"
		},
		...
	],
	"env": "正式环境",
	"desc": "备注",
	"version": "1.0.0"
}

// npm run preview(会把xcxkey中的所有小程序打包预览)
// npm run upload(会把xcxkey中的所有小程序打包提交体验版)

到了这里,关于30多个小程序一键发布——miniprogram-ci的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CI/CD持续集成持续发布(jenkins)

            在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试; 或者前后端分离后,经常会修改接口,然后重新部署; 这些情况都会涉及到频繁的打包部署; 手动打包常规步

    2024年02月14日
    浏览(68)
  • GitLab Runner 实现项目 CI/CD 发布

    Gitlab实现CICD的方式有很多,比如通过Jenkins,通过Gitlab Runner等,今天主要介绍后者。Gitlab在安装的时候,就默认包含了Gitlab CI的能力,但是该能力只是用于协调作业,并不能真的去执行作业,因此需要搭配Gitlab Runner来作为执行器实现具体的CICD工作。Gitlab Runner可以被安装在任

    2024年01月17日
    浏览(64)
  • Flink编程——最小程序MiniProgram

    前面我们已经搭建起了Flink 的基础环境,这一节我们就在上一节的基础上,进行编写我们的第一个Flink 程序,开始之前我们先看一下一个完整的Flink 程序是什么样的 Flink 程序结构 为了演示Flink 程序结构,我们下面写了一个程序,这个程序我称之为 MiniProgram ,也就是流程序的最

    2024年01月25日
    浏览(34)
  • GitLab CI/CD 新书发布,助企业降本增效

    大家好,我是CSDN的 拿我格子衫来 , 昨天我的第一本书《GitLab CI/CD 从入门到实战》上架啦,这是业内第一本详细讲解GitLab CI/CD的书籍。 历经无数个日夜,最终开花结果。感触良多,今天就借这篇文章来谈一谈这本书的创作。 在正式写书前,我已经写了很多有关GitLab CI/CD的文

    2023年04月12日
    浏览(41)
  • MySQL 一键安装 (支持8.0.16-8.0.30)

    基于最小安装版本的安装包、 设计一键安装脚本实现mysql一键安装; 由于不通版本安装包安装方式存在差异、 所以直接选择将下载地址封装进安装脚本中、用户根据需要指定版本后一键安装、 避免自己寻找安装包困难或与脚本命令不兼容; mysql安装包下载地址:https://down

    2024年02月04日
    浏览(30)
  • 极狐GitLab 15.7 版本发布,更多代码托管、CI/CD、安全合规更新【一】

    GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 更多关于极狐GitLab 或者 DevOps 的最佳实践,可以关注文末的极狐GitLab 公众号。 极狐GitLab 在

    2024年03月20日
    浏览(49)
  • 小程序配置网络请求@escook/request-miniprogram

    由于平台限制,小程序项目不支持axios, 原生wx.request() API功能较为简单, 不支持拦截器 等功能。所以使用@escook/request-miniprogram第三方包发起网络数据请求 配置步骤: 官方文档:https://www.npmjs.com/package/@escook/request-miniprogram 1.找到项目路径,输入cmd进入命令行 2. 安装,输入

    2024年02月13日
    浏览(337)
  • 微信小程序使用lottie动画(lottie-miniprogram)

    注意,想要在小程序中使用lottie动画,需要引入lottie-miniprogram组件,注意主包大小(咱就是主包过大了,c)!!! 话不多比,直接开始! 第一步:使用npm引入lottie-miniprogram。               去项目根目录cmd进命令行,输入神秘口令: 第二步:引入完成以后,执行构建代码

    2024年03月23日
    浏览(49)
  • 微信小程序的全局状态管理 — mobx-miniprogram

    在小程序中,常常有些数据需要在几个页面或组件中共享。使用 MobX 来管理小程序的跨页面数据,  其实类似于vuex的store。 小程序的 MobX 绑定辅助库。 此 behavior 依赖开发者工具的 npm 构建。具体详情可查阅 官方 npm 文档 。 可配合 MobX 的小程序构建版 npm 模块 mobx-miniprogram 使

    2024年02月09日
    浏览(61)
  • windows快速一键启动多个软件脚本bat

    每次打开电脑都想启动多个软件,而开启开机自启又会拖慢开机速度,万一某天不需要开启这么多软件又会影响开机速度,还需要一个一个关闭,就很麻烦 使用bat文件即可自定义开启多个软件  首先新建一个文本文档, 按照以下格式编写: start + 空格 + /d + \\\"软件的所在绝对路径\\\" + 空

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包