大家好,我是若川。持续组织了8个月源码共读活动,感兴趣的可以 点此加我微信ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北
籍前端群,可加我微信进群。
本文是 @NewName 小伙伴参加源码共读活动第30期(@tarojs/plugin-mini-ci 小程序上传代码 ci)的投稿。
原文链接:https://juejin.cn/post/7089819849257385997
此人非同寻常,我发布了多少期源码共读、他就基本写了多少期文章。
Part1学习准备工作
阅读相关学习资料:
微信小程序CI :https://developers.weixin.qq.com/miniprogram/dev/devtools/ci.html
taro CI: https://link.juejin.cn/?target=https%3A%2F%2Ftaro-docs.jd.com%2Ftaro%2Fdocs%2Fnext%2Fplugin-mini-ci%2F
coding自动构建微信小程序:https://help.coding.net/docs/ci/practice/quick/wechat-mini-program.html
小打卡小程序自动化构建:https://www.yuque.com/jinxuanzheng/gvhmm5/uy4qu9#mmmx7
clone源码:源码路径如下:
https://github.com/NervJS/taro/tree/next/packages/taro-plugin-mini-ci
我是把taro整个clone下来的。
Part2源码学习
1小程序CI的整体流程
首先看index.js:
module.exports = require('./dist/index.js').default
module.exports.default = module.exports
含义是引入dist文件夹下的index.js文件, 但是刚克隆下来的代码中并没有dist文件夹。很容易想到dist文件夹是打包后产生的,所以执行命令:
npm i
npm run build
注意是在taro/packages/taro-plugin-mini-ci目录下执行 install和build命令:build之后可以看到有了dist文件夹:
对应目录下也生成了index.js文件,生成的js文件和原来的ts文件也没差太多,再加上最近再自学ts,就看index.ts吧(代码有删减):
import { IPluginContext } from '@tarojs/service'
import * as minimist from 'minimist'
import { CIOptions } from './BaseCi'
import WeappCI from './WeappCI'
import TTCI from './TTCI'
import AlipayCI from './AlipayCI'
import SwanCI from './SwanCI'
export { CIOptions } from './BaseCi'
export default (ctx: IPluginContext, pluginOpts: CIOptions) => {
const onBuildDone = ctx.onBuildComplete || ctx.onBuildFinish
ctx.addPluginOptsSchema((joi) => {
return joi
.object()
.keys({
/** 微信小程序上传配置 */
weapp: joi.object({
appid: joi.string().required(),
projectPath: joi.string(),
privateKeyPath: joi.string().required(),
type: joi.string().valid('miniProgram', 'miniProgramPlugin', 'miniGame', 'miniGamePlugin'),
ignores: joi.array().items(joi.string().required())
}),
/** 字节跳动小程序上传配置 */
/** 阿里小程序上传配置 */
/** 百度小程序上传配置 */
swan: joi.object({
token: joi.string().required(),
minSwanVersion: joi.string()
}),
version: joi.string(),
desc: joi.string()
})
.required()
})
onBuildDone(async () => {
const args = minimist(process.argv.slice(2), {
boolean: ['open', 'upload', 'preview']
})
const { printLog, processTypeEnum } = ctx.helper
const platform = ctx.runOpts.options.platform
let ci
switch (platform) {
case 'weapp':
ci &