1.0.4 • Published 3 years ago

sd-release-plus v1.0.4

Weekly downloads
-
License
MIT
Repository
-
Last release
3 years ago

sd-release-plus

使用

安装

pnpm add -D  sd-release-plus

根路径新增发布脚本 scripts/release.ts

import defaultMain from sd-release-plus;
defaultMain();

package.json 增加 scripts 钩子

For example:

{
  "scripts": {
    "release": "ts-node ./scripts/release.ts"
  },
  "devDependencies": {
    "sd-release-plus": "^1.0.0"
  }
}

执行脚本

pnpm run release

默认发布流程

  • 选择升级版本 ->
  • 修改 package.json 的版本号 ->
  • 填写 commit 信息(校验格式,不通过终止) ->
  • 推送到代码仓库(推送失败会帮你把 package.json 里的版本回退) ->
  • 生成 changeLog ->
  • build 打包(这里执行的是 pnpm run build 所以你的 scripts 里必须有 build 命令,要不执行失败) ->
  • 发布包(执行的 npm publish --access=public 命令) ->
  • 打 tag 并且推送到 git 仓库

自定义流程

上面几个流程是这个包自带流程顺序,你可以配自己的顺序,

import { getNextVersion, gitPush, setChangelog, build, publishNpm, addTag, compose } from '@mx-design/release';

// getNextVersion 获取下个版本号函数
// updateVersion 修改版本号 返回值是回退版本号的函数
// gitPush push代码函数
// setChangelog 设置changeLog函数
// build 执行npm run build函数
// publish 执行npm publish函数
// addTag 打tag函数
// compose函数组合器

// 使用方法,这些函数顺序可以自己换位置,或者增删减
const middle = [getNextVersion, updateVersion, gitPush, setChangelog, build, publishNpm, addTag];

function execRelease() {
  compose(middle);
}

中间件原理

// compose 函数
export function compose(middleware) {
  // 共享数据仓库,每个函数都可以往里面加数据,所有函数都可以访问到里面的数据
  const otherOptions = {};
  // 函数发射器,一个函数执行完毕调用next(),就执行下一个函数
  function dispatch(index, otherOptions) {
    // 每次从middleware中间件里面选取一个函数执行,直到执行了全部函数
    if (index == middleware.length) return;
    const currMiddleware = middleware[index];
    // 执行函数,传入了一下一个函数的dispatch,已经更新共享数据
    currMiddleware((addOptions) => {
      dispatch(++index, { ...otherOptions, ...addOptions });
    }, otherOptions).catch((error) => {
      console.log('💣 发布失败,失败原因:', error);
    });
  }
  dispatch(0, otherOptions);
}
// middleware 写法

// 获取版本号函数,固定参数第一个是next,表示调用middleware里下一个函数
const getNextVersion = async (next) => {
  // _selectNextVersion会查看你package.json里的version参数是啥版本
  const nextVersion = await _selectNextVersion();
  // 缓存老的package.json数据,为了后面可以回退版本有老版本数据做准备
  const originPackageJson = getOriginPackageJson();
  // next传入的数据都会放到共享数据仓库,下面的函数都可以拿到这些数据
  next({
    nextVersion,
    originVersion: originPackageJson.version,
    originPackageJson,
  });
};

// 更新版本号方法
const updateVersion = async (next, otherOptions) => {
  if (!otherOptions?.nextVersion) {
    throw new Error('请传入package.json新版本号');
  }
  // 返回一个回退版本号的方法,上面的函数共享的originPackageJson数据就是给他用的
  // basicCatchError如果命令执行失败,就打印失败原因,并且返回false
  const backVersionFn = await _updateVersion(otherOptions.nextVersion, otherOptions.originPackageJson).catch(
    basicCatchError,
  );
  // 把回退版本的函数共享出来,给下面需要用的地方自己调用
  next({ backVersionFn });
};
// 调用
compose([getNextVersion, updateVersion]);