Snippets
Mini
代码上传/预览 CI/CD
点击展开代码
import fs from 'node:fs'
import path from 'node:path'
import { parseArgs } from 'node:util'
import ci from 'miniprogram-ci'
import { exec } from './exec.mjs'
/**
* @typedef {'string'} Projectname
*/
/**
* @typedef {object} Config
* @property {string} appid appid
* @property {string} version version
* @property {string} projectPath projectPath
* @property {string} privateKeyPath privateKeyPath
*/
/**
*
* @param {Projectname} projectname
* @returns {Config} Config
*/
function getConfig(projectname) {
const projectRoot = path.resolve('apps', projectname)
const projectConfigJson = JSON.parse(
fs.readFileSync(
path.join(projectRoot, 'project.config.json'),
).toString(),
)
const packageJson = JSON.parse(
fs.readFileSync(
path.join(projectRoot, 'package.json'),
).toString(),
)
const /** @type {string} */ appid = projectConfigJson.appid
const /** @type {string} */ version = packageJson.version
const projectPath = path.join(projectRoot, 'dist')
const privateKeyPath = path.resolve('scripts', 'keys', `private.${appid}.key`)
return {
appid,
version,
projectPath,
privateKeyPath,
}
}
/**
*
* @param {Config} config config
* @returns {ci.Project} Project
*/
function createProject(config) {
const project = new ci.Project({
appid: config.appid,
type: 'miniProgram',
projectPath: config.projectPath,
privateKeyPath: config.privateKeyPath,
})
return project
}
/**
* @param {Projectname} projectname
*/
async function upload(projectname = 'doctor') {
const config = getConfig(projectname)
const project = createProject(config)
try {
await ci.upload({
project,
version: config.version,
desc: '机器人',
setting: {
es6: true,
minify: true,
minifyJS: true,
minifyWXML: true,
minifyWXSS: true,
},
onProgressUpdate: console.log,
})
process.exit(0)
}
catch (error) {
console.error('[mini-ci]', error)
process.exit(1)
}
}
async function preview(projectname = 'doctor') {
const config = getConfig(projectname)
const project = createProject(config)
const qrcodeOutputDest = path.resolve(
'scripts',
'preview.jpg',
)
try {
const previewResult = await ci.preview({
project,
desc: 'hello',
setting: {
useProjectConfig: true,
},
qrcodeFormat: 'image',
qrcodeOutputDest,
onProgressUpdate: console.log,
// pagePath: 'pages/index/index', // 预览页面
// scene: 1011, // 场景值
})
await exec('cmd', ['/c', 'code', '', qrcodeOutputDest])
console.log(previewResult)
process.exit(0)
}
catch (error) {
console.error(error)
process.exit(1)
}
}
const { values } = parseArgs({
allowPositionals: true,
options: {
project: {
type: 'string',
},
preview: {
type: 'boolean',
},
upload: {
type: 'boolean',
},
},
})
function init() {
// console.log(values)
if (values.preview) {
preview(values.project)
}
if (values.upload) {
upload(values.project)
}
}
init()更新检测
参考https://developers.weixin.qq.com/miniprogram/dev/api/base/update/wx.getUpdateManager.html
点击展开代码
import Taro from '@tarojs/taro'
import logger from './logger'
import { showModal } from './ui'
/**
* 检查更新
*/
export async function updateApp() {
const updateManager = Taro.getUpdateManager()
updateManager.onCheckForUpdate((res) => {
if (res.hasUpdate) {
logger.info(`检测到新的更新`)
}
})
updateManager.onUpdateReady(async () => {
try {
await showModal('新版本已经准备好,是否重启应用?', '更新提示')
updateManager.applyUpdate()
}
catch {
logger.warn('用户取消更新')
}
})
updateManager.onUpdateFailed(() => {
logger.error('新版本下载失败')
})
}import Taro from "@tarojs/taro";
import logger from "./logger";
import { showModal } from "./ui";
/**
* 检查更新
*/
export async function updateApp() {
const updateManager = Taro.getUpdateManager();
updateManager.onCheckForUpdate((res) => {
if (res.hasUpdate) {
logger.info(`检测到新的更新`);
}
});
updateManager.onUpdateReady(async () => {
try {
await showModal("新版本已经准备好,是否重启应用?", "更新提示");
updateManager.applyUpdate();
} catch {
logger.warn("用户取消更新");
}
});
updateManager.onUpdateFailed(() => {
logger.error("新版本下载失败");
});
}