Monorepo项目管理:lerna + workspaces

这里主要介绍lernayarn workspaces的使用方法与职能界限。

  • lerna:项目管理与发版
  • workspaces:依赖管理

以上能力结合交互式命令行,打造自动化项目开发流程。

出发点

  • 规范化项目管理
  • 自动提交 + 版本号
  • 交互式commit msg
  • 自动生成日志
  • 一目了然的项目依赖
  • 交互式的项目调试流程

准备工作

  • npm i -g lerna
  • lerna -v // 确认安装成功。
  • yarn -v // 确认安装yarn。应该随node默认安装的

创建Monorepo环境

定义工作区,可独立管理应用依赖

  1. vue create monorepo
  2. cd monorepo
  3. lerna init
  4. 修改package.json
    // 追加——定义工作区,可独立管理应用依赖
    workspaces: [
    "packages/*"
    ]
    
  5. yarn workspaces info

配置版本服务器

  • 配置commit msg校验
    • yarn add -W -D commitizen // root目录下安装依赖-W

    • npx commitizen init cz-lerna-changelog --yarn --dev --exact

      • // 以上两步创建Commitizen-friendly交互式commit msg —— 让您不必再深挖文档查找commit格式. Node10+支持

      • // commitizen init自动安装依赖cz-lerna-changelog

      • // commitizen init自动添加config.commitizenpackage.json

      • // 不同的适配器(E.g.cz-lerna-changelog)提供不同的交互界面

      • // 缺点:不符合常规命令习惯npm run cm

      • 手动添加scripts"cm": "cz" // 不使用commit做scripts的key是避免冲突

        if you are using precommit hooks thanks to something like husky, you will need to name your script some thing other than "commit" (e.g. "cm": "cz"). The reason is because npm-scripts has a "feature" where it automatically runs scripts with the name prexxx where xxx is the name of another script. In essence, npm and husky will run "precommit" scripts twice if you name the script "commit", and the work around is to prevent the npm-triggered precommit script.

    • 适配git commit命令

      • yarn add -W -D husky
      • 手动追加husky.hookspackage.json
          ...
            "husky": {
              "hooks": {
                "commit-msg": "exec < /dev/tty && git cz --hook || true",
                "commit": "echo '-----pre-commit====",
                "push": "echo '-----pre-push===="
              }
            },
          ...
          ```
          > Why exec < /dev/tty? By default, git hooks are not interactive. This command allows the user to use their terminal to interact with Commitizen during the hook.
      
  • 初始化Git服务器
    • git remote add origin ...
    • git add .
    • git commit -m "..." // 该命令后,进入commit msg交互:husky配置提供;
    • git push ... // 初始化远程库,使用git push进行第一次提交lerna.json的默认0.0.0版本,不使用lerna version做第一次提交
      commit-msg.png

自动生成变更日志

```
// 修改lerna.json
...
  "command": {
    "version": {
      "conventionalCommits": true
    }
  },
  "ignoreChanges": [
    ""
  ]
...
```

lerna version 会检测从上一个版本发布以来的变动,但有一些文件的提交,我们不希望触发版本的变动,譬如 .md 文件的修改,并没有实际引起 package 逻辑的变化,不应该触发版本的变更,可以通过 ignoreChanges 配置排除

changeLog.png

创建测试项目

  • 创建一个子项目packages/v1act/

    1. 创建目录packages/v1act/
    2. 创建文件packages/v1act/package.json
        {
          "name": "v1act",
          "version": "0.0.0", // 与lerna.json'version'保持一致
          "private": true  // 注意:追加该属性lerna ls -l会忽略该子项目, yarn workspaces info 可以查看该工作区
        }
      
    3. lerna ls -llerna ls --json // 查看仓库项目组织结构
  • 更新代码

    • git add
    • git commit -m ''
    • lerna version // 交互式版本更新 + 自动提交,没有packages/内容变更的话,不能通过lerna version提交,只能通过git push
      version.png
    publish.png

工具书

  • lerna官网

  • commitizenNPM适配器列表

  • commitizen官方适配器列表:cz-conventional-changelog@digitalroute/cz-conventional-changelog-for-jiracz-lerna-changelog

  • yarn官方文档

你可能感兴趣的:(Monorepo项目管理:lerna + workspaces)