1. 前言
大师好,我是若川。为了能帮助到更多对源码感爱好、想学会看源码、提升自己前端技术才能的同学。我倾力延续构造了一年每周大师一路进修200行左右的源码共读活动,感爱好的可以点此扫码加我微信 ruochuan12 介入。 想学源码,死力保举关注我写的专栏(今朝3K+人关注)《进修源码整体架构系列》 包括jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、vue 3.2 公布、vue-this、create-vue、玩具vite等20余篇源码文章。
2. 前情回首
本文提到的工具已开源,可以间接克隆拿去用,也可以自行点窜利用,https://github.com/lxchuan12/mp-cli.git,求个star^_^
估量有很多开辟小法式的同学,还在利用微信开辟者工具上传小法式。假如你是,那末这篇文章很是合适你。假如不是,一样也很合适你。
早在 2021年08月,我写过一篇文章 Vue 3.2 公布了,那尤雨溪是怎样公布 Vue.js 的?
Vue 2.7 若何公布跟Vue 3.2这篇文章类似,所以就不赘述了。vuejs公布的文件很多代码我们可以间接复制粘贴点窜,优化我们自己公布的流程。比如写小法式,相对能够公布频仍,完全可以利用这套代码,配合miniprogram-ci,再加上一些自界说,加以优化。 因现在天我们来开辟这样的脚手架工具。
看完本文,你将学到:- 1. 若何操纵 release-it 提升版本号,自动打 tag,天生 changelog 等
- 2. npm init 道理
- 3. 若何写一个脚手架工具
- - 若何剖析 Nodejs 号令行参数 minimist
- - 若何挑选单选、多选 enquirer(prompt, MultiSelect)
- - 等等
复制代码 先看看终极开辟的结果。
支持的功用
显现帮助信息
上传结果
3. 关于为啥要开辟这样的工具
关于小法式 ci 上传,再分享两篇文章。
基于 CI 实现微信小法式的延续构建
小打卡小法式自动化构建及公布的工程化理论 虽然文章里不是最新的 miniprogram-ci,但这篇场景写得比力周全。 接着,我们先来看看 miniprogram-ci 官方文档。
4. miniprogram-ci 官方文档
miniprogram-ci 文档
4.1 上传
- const ci = require('miniprogram-ci')
- ;(async () => {
- const project = new ci.Project({
- appid: 'wxsomeappid',
- type: 'miniProgram',
- projectPath: 'the/project/path',
- privateKeyPath: 'the/path/to/privatekey',
- ignores: ['node_modules/**/*'],
- })
- const uploadResult = await ci.upload({
- project,
- version: '1.1.1',
- desc: 'hello',
- setting: {
- es6: true,
- },
- onProgressUpdate: console.log,
- })
- console.log(uploadResult)
- })()
复制代码 4.2 预览
- const ci = require('miniprogram-ci')
- ;(async () => {
- const project = new ci.Project({
- appid: 'wxsomeappid',
- type: 'miniProgram',
- projectPath: 'the/project/path',
- privateKeyPath: 'the/path/to/privatekey',
- ignores: ['node_modules/**/*'],
- })
- const previewResult = await ci.preview({
- project,
- desc: 'hello', // 此备注将显现在“小法式助手”开辟版列表中
- setting: {
- es6: true,
- },
- qrcodeFormat: 'image',
- qrcodeOutputDest: '/path/to/qrcode/file/destination.jpg',
- onProgressUpdate: console.log,
- // pagePath: 'pages/index/index', // 预览页面
- // searchQuery: 'a=1&b=2', // 预览参数 [留意!]这里的`&`字符在号令行中应写成转义字符`\&`
- })
- console.log(previewResult)
- })()
复制代码 5. Taro 小法式插件 @tarojs/plugin-mini-ci
假如利用 Taro 开辟的小法式,可以间接利用。
具体若何利用参考文档,我在本文中就不赘述了。
小法式延续集成 @tarojs/plugin-mini-ci
我构造的源码共读第30期读的就是这个插件,很是值得进修。@tarojs/plugin-mini-ci 源码解读可以参考 @NewName 的源码文章
我体验下来的感受有以下几点可以优化。
- 不支持指定机械人
- 不支持不打包时上传
- 不支持官方供给的更多设置
- 不支持挑选多个小法式批量上传等等
倘使偶然候我能够给 Taro 提 PR,固然纷歧定会被合并。
6. uni-app 似乎没有供给类似的插件
uni-app 似乎没有供给类似的插件。需要自己脱手,人给家足。
7. release-it 自动提升版本、打 tag、天生 changelog 等
因而我们自己脱手,人给家足,写一个工具处理上面提到的题目,支持 Taro 打包后的小法式和 uni-app 打包后的,还有原生小法式上传和预览。
开辟小工具之前,先先容一些好用的工具。
听说很多小伙伴的项目,没有打 tag、没有版本的概念,没有天生 changelog,没有设置 eslint、prettier,没有 commit 等标准。
这些实在不难,commit 标准一般简单做法是安装 npm i git-cz -D, 在package.json 中加入以下剧本。- {
- "scripts": {
- "commit": "git-cz"
- }
- }
复制代码 git 提交时利用 npm run commit 即可,其他就不赘述了。
release-it,自动提升版本号,自动打 tag,天生 changelog 等
release-it 官网仓库- npm init release-it
- # 挑选 .release-it.json 用下面的设置,复制粘贴到 .release-it.json 中。
- # 再安装 changelog 插件
- npm i @release-it/conventional-changelog -D
- {
- "github": {
- "release": false
- },
- "git": {
- "commitMessage": "release: v${version}"
- },
- "npm": {
- "publish": false
- },
- "hooks": {
- "after:bump": "echo 更新版本成功"
- },
- "plugins": {
- "@release-it/conventional-changelog": {
- "preset": "angular",
- "infile": "CHANGELOG.md"
- }
- }
- }
复制代码 这样设置后,可以 npm run release 履行 release-it 版本。 还支持 hooks 钩子,比如提升版本号后"after:bump": "echo 更新版本成功",更多功用可以检察release-it 官网仓库。
7.1 npm init release-it 道理
为啥 npm init 也可以间接初始化一个项目,带着疑问,我们翻看 npm 文档。
npm init
npm init 用法:- npm init [--force|-f|--yes|-y|--scope]
- npm init <@scope> (same as `npx <@scope>/create`)
- npm init [<@scope>/]<name> (same as `npx [<@scope>/]create-<name>`)
复制代码 npm init <initializer> 时转换成 npx 号令:- npm init foo -> npx create-foo
- npm init @usr/foo -> npx @usr/create-foo
- npm init @usr -> npx @usr/create
复制代码 看完文档,我们也就了解了:
运转 npm init release-it => 相当于 npx create-release-it
create-release-it
npm init release-it 道理实在就是 npx create-release-it 挑选一些设置,天生 .release-it.json 大概 package.json 的 release-it 设置。
再写入号令release 设置到 package.json。- {
- &#34;scripts&#34;: {
- &#34;release&#34;: &#34;release-it&#34;
- }
- }
复制代码 最初履行 npm install release-it --save-dev 也就是源码里的 await execa(&#39;npm&#39;, [&#39;install&#39;, &#39;release-it&#39;, &#39;--save-dev&#39;], { stdio: &#39;inherit&#39; });。
这行源码位置
8. 小法式上传工具实现支流程
需要支持多选,那必定得遍历数组。- // 代码只是关键代码,完整的可以检察 https://github.com/lxchuan12/mp-cli/blob/main/src/index.js
- (async () => {
- for (const mpConfigItem of mpConfigList) {
- try {
- const res = await main({});
- }
- catch(err){
- console.log(&#39;履行失利&#39;, err);
- }
- }
- })();
复制代码 main 函数- const { green, bold } = require(&#39;kolorist&#39;);
- const step = (msg) => console.log(bold(green(`[step] ${msg}`)));
- async function main(options = {}) {
- const project = new ci.Project(lastProjectOptions);
- if (upload) {
- step(&#39;起头上传小法式...&#39;);
- const uploadResult = await ci.upload(lastUploadOptions);
- console.log(&#39;uploadResult&#39;, uploadResult);
- }
- if (preview) {
- step(&#39;起头天生预览二维码...&#39;);
- const previewResult = await ci.preview(lastPreviewOptions);
- console.log(&#39;previewResult&#39;, previewResult);
- }
- }
复制代码 8.1 增加功用支持指定参数
利用 minimist 剖析号令行参数。- const getParams = () => {
- const params = process.argv.slice(2);
- const paramsDefault = {
- default: {
- robot: 1,
- preview: false,
- upload: false,
- // 空跑,不履行
- dry: false,
- // 按照设置,单选还是多选来上传小法式
- useSelect: false,
- useMultiSelect: false,
- help: false,
- version: false,
- },
- alias: {
- u: &#39;upload&#39;,
- r: &#39;robot&#39;,
- v: &#39;version&#39;,
- d: &#39;dry&#39;,
- s: &#39;useSelect&#39;,
- m: &#39;useMultiSelect&#39;,
- p: &#39;preview&#39;,
- h: &#39;help&#39;,
- }
- };
- return require(&#39;minimist&#39;)(params, paramsDefault);
- };
- module.exports = {
- getParams,
- };
复制代码 8.2 支持读取项目标 package.json 的 version,也支持读取自界说version
kolorist 色彩输出。- const { red, bold } = require(&#39;kolorist&#39;);
- const getVersion = () => {
- let version;
- try {
- version = require(`${packageJsonPath}/package.json`).version;
- } catch (e) {
- console.log(e);
- console.log(
- red(
- bold(
- &#39;未设备 version , 而且未设备 package.json 途径,没法读取 version&#39;,
- ),
- ),
- );
- }
- return version;
- };
- module.exports = {
- getVersion,
- };
复制代码 8.3 版本描写 支持指定 git commit hash 和作者
git rev-parse --short HEAD 读取 git 仓库比来一次的 commit hash。
parse-git-config 可以读取 .git/config 设置。- // const path = require(&#39;path&#39;);
- const { execSync } = require(&#39;child_process&#39;);
- const parseGitConfig = require(&#39;parse-git-config&#39;);
- const getDesc = (projectPath, version) => {
- // 获得最新 git 记录 7位的 commit hash
- let gitCommitHash = &#39;git commit hash 为空&#39;;
- try {
- gitCommitHash = execSync(&#39;git rev-parse --short HEAD&#39;, {
- cwd: projectPath,
- })
- .toString()
- .trim();
- } catch (e) {
- console.warn(&#39;获得 git commit hash 失利&#39;);
- console.warn(e);
- }
- // 获得项目标git仓库的 user.name
- let userName = &#39;默许&#39;;
- try {
- const {
- user: { name = &#39;默许&#39; },
- } = parseGitConfig.sync({
- cwd: projectPath,
- path: &#39;.git/config&#39;,
- });
- userName = name;
- } catch (e) {
- console.warn(&#39;获得 .git/config user.name 失利&#39;);
- console.warn(e);
- }
- const desc = `v${version} - ${gitCommitHash} - by@${userName}`;
- return desc;
- };
- module.exports = getDesc;
复制代码 8.4 读取设置 wx.config.js 设置(更保举)
当前也支持读取 .env 设置。读取 .env 设置,可以采用 dotenv。关于 dotenv的道理,可以看我之前写过的文章口试官:项目中常用的 .env 文件道理是什么?若何实现?
但 wx.config.js 可以设置更多工具而且更灵活。所以更保举。
感爱好的可以研讨 vue-cli 是若何读取 vue.config.js 设置的。围绕工作相关的进修,常常收益更大。- // 读取 wx.config.js 设置
- const loadWxconfig = (cwd) => {
- try {
- return require(path.join(cwd, &#39;wx.config.js&#39;));
- } catch (e) {
- return {
- error: &#39;未设置 wx.config.js 文件&#39;,
- };
- }
- };
- const parseEnv = () => {
- const cwd = process.cwd();
- let parsed = {};
- let wxconfig = loadWxconfig(cwd);
- if (wxconfig.error) {
- let dotenvResult = require(&#39;dotenv&#39;).config({
- path: path.join(cwd, &#39;./.env&#39;),
- });
- parsed = dotenvResult.parsed;
- if (dotenvResult.error) {
- throw error;
- }
- } else {
- parsed = wxconfig;
- }
- // 代码有省略
- }
复制代码 8.5 支持挑选多个小法式
我们可以用 enquirer 来实现单选大概多选的功用。以下只是关键代码。 完整代码可以检察 mp-cli/src/utils/getConfig.js 文件。- // 只是关键代码
- const { prompt, MultiSelect } = require(&#39;enquirer&#39;);
- const configPathList = fs.readdirSync(configPath);
- const configPathListJson = configPathList.map((el) => {
- return require(`${configPath}/${el}`);
- });
- const { name } = await prompt({
- type: &#39;select&#39;,
- name: &#39;name&#39;,
- message: &#39;请挑选一个小法式设置&#39;,
- choices: configPathListJson,
- });
- result = configPathListJson.filter((el) => el.name === name);
- return result;
复制代码 8.6 支持多个批量上传
- // 只是关键代码
- const { prompt, MultiSelect } = require(&#39;enquirer&#39;);
- const configPathList = fs.readdirSync(configPath);
- const configPathListJson = configPathList.map((el) => {
- return require(`${configPath}/${el}`);
- });
- const multiSelectPrompt = new MultiSelect({
- name: &#39;value&#39;,
- message: &#39;可挑选多个小法式设置&#39;,
- limit: 7,
- choices: configPathListJson,
- });
- try {
- const answer = await multiSelectPrompt.run();
- console.log(&#39;Answer:&#39;, answer);
- result = configPathListJson.filter((el) =>
- answer.includes(el.name),
- );
- return result;
- } catch (err) {
- console.log(&#39;您已经取消&#39;);
- console.log(err);
- process.exit(1);
- }
复制代码 后续能够接入 CI/CD、接入邮件提醒、接入钉钉、支持可视化操纵等等
8.7 更多若何利用可以参考文档
- # 克隆我写的 mp-cli 工具
- git clone https://github.com/lxchuan12/mp-cli.git
- # 克隆腾讯开源的电商小法式
- git clone https://github.com/lxchuan12/tdesign-miniprogram-starter-retail.git
- # 切到分支 feature/release-it
- git checkout feature/release-it
复制代码 可以克隆我的项目,到一个目录中,比如 projects 中。
再克隆我的别的一个小法式(腾讯开源的电商小法式),到同一个目录中。比如 projects 中。
依照微信小法式文档设置小法式密钥等,这样就能上传和预览了。假如没有微信小法式,可以自行免费开通小我的微信小法式。
9. 总结
经过本文的进修,我们晓得了以下常识。- 1. 若何操纵 release-it 提升版本号,自动打 tag,天生 changelog 等
- 2. npm init 道理
- 3. 若何写一个脚手架工具
- - 若何剖析 Nodejs 号令行参数 minimist
- - 若何挑选单选、多选 enquirer(prompt, MultiSelect)
- - 等等
复制代码 我相信大师也可以自己脱手实现公司类似要求的脚手架工具,削减发版时候,降本提效。
<hr/>最初可以延续关注我@若川。接待点此扫码加我微信 ruochuan12 交换,加入每周大师一路进修200行左右的源码共读活动,配合进步。 |