Skip to content
导航栏

scopes

scopes,通常来定义本次 commit 涉及范围,一般有两种:根据项目代码层面区分比如 monorepo ,另外一种就是项目业务区分

针对 项目代码 的 scopes

如果你需要管理多软件包在commit时获得更好的体验,比如使用: pnpm | lerna.js 管理 monorepo 可以利用 pathfs 模块动态定义 commit message 中的scopes(范围)显示

js
// .commitlintrc.js
const fs = require('node:fs')
const path = require('node:path')

const packages = fs.readdirSync(path.resolve(__dirname, 'packages'))
module.exports = {
  prompt: {
    scopes: [...packages]
  }
}
// .commitlintrc.js
const fs = require('node:fs')
const path = require('node:path')

const packages = fs.readdirSync(path.resolve(__dirname, 'packages'))
module.exports = {
  prompt: {
    scopes: [...packages]
  }
}

当然如果你使用 commitlint 规则定义了 scope-enum,会自动引入

js
// .commitlintrc.js
const fs = require('node:fs')
const path = require('node:path')

const packages = fs.readdirSync(path.resolve(__dirname, 'packages'))
module.exports = {
  rules: {
    'scope-enum': [2, 'always', [...packages]]
  }
}
// .commitlintrc.js
const fs = require('node:fs')
const path = require('node:path')

const packages = fs.readdirSync(path.resolve(__dirname, 'packages'))
module.exports = {
  rules: {
    'scope-enum': [2, 'always', [...packages]]
  }
}

demo-gif

针对 项目业务 的 scopes

js
// .commitlintrc.js
module.exports = {
  prompt: {
    scopes: ['app', 'home', 'account', 'comment']
  }
}
// .commitlintrc.js
module.exports = {
  prompt: {
    scopes: ['app', 'home', 'account', 'comment']
  }
}

当然如果你想给自定义范围项添加 简短描述 显示在命令行中可以使用 namevalue属性来定义

js
// .commitlintrc.js
module.exports = {
  prompt: {
    scopes: [
      { value: 'app', name: 'app:       系统业务' },
      { value: 'home', name: 'home:      首页相关' },
      { value: 'account', name: 'account:   账户相关' },
      { value: 'comment', name: 'comment:   评论相关' },
    ]
  }
}
// .commitlintrc.js
module.exports = {
  prompt: {
    scopes: [
      { value: 'app', name: 'app:       系统业务' },
      { value: 'home', name: 'home:      首页相关' },
      { value: 'account', name: 'account:   账户相关' },
      { value: 'comment', name: 'comment:   评论相关' },
    ]
  }
}

demo-gif

多选模式

  • 使用 空格 选中
  • 使用 回车 确定
js
// .commitlintrc.js 
const fs = require('fs')
const path = require('path')
const packages = fs.readdirSync(path.resolve(__dirname, 'packages'))
module.exports = {
  prompt: { 
    scopes: [...packages],
    enableMultipleScopes: true,
    scopeEnumSeparator: "," 
  }
}
// .commitlintrc.js 
const fs = require('fs')
const path = require('path')
const packages = fs.readdirSync(path.resolve(__dirname, 'packages'))
module.exports = {
  prompt: { 
    scopes: [...packages],
    enableMultipleScopes: true,
    scopeEnumSeparator: "," 
  }
}

demo-gif

TIP

在多选模式中,如果 defaultScope 传入的的 string[], 会将 scopes 范围列表项中的 value 相匹配的选项进行默认选中和置顶操作

输入模式

如果不想使用选择模式,想要使用输入模式 Input。可以使用自定义范围的输入框进行代替使用

js
module.exports = {
  messages: { customScope: 'What is the scope of this change:' },
  skipQuestions: ['scope'],
  defaultScope: '___CUSTOM___:'
}
module.exports = {
  messages: { customScope: 'What is the scope of this change:' },
  skipQuestions: ['scope'],
  defaultScope: '___CUSTOM___:'
}

TIP

如果想要在输入模式获得补全的效果,可以在补全的内容的前缀加上 ___CUSTOM___:

js
module.exports = {
  messages: { customScope: 'What is the scope of this change:' },
  skipQuestions: ['scope'],
  defaultScope: '___CUSTOM___:Hello World'
}
module.exports = {
  messages: { customScope: 'What is the scope of this change:' },
  skipQuestions: ['scope'],
  defaultScope: '___CUSTOM___:Hello World'
}

[进阶] 缓存你的自定义范围 custom scope




TIP

如果 cz-git 检测到如果 allowEmptyScopesallowCustomScopes 具有非常严格规则(都设置为false)并且 scopes 选择列表仅有一项时,会自动跳过问题并输出

TIP

下面代码可以运行时获取到 HOME 目录,
你可以使用它配合 fspath 进行默认的全局自定义配置

js
const USER_HOME = process.env.HOME || process.env.USERPROFILE
// console.log(USER_HOME) === echo "$HOME"
const USER_HOME = process.env.HOME || process.env.USERPROFILE
// console.log(USER_HOME) === echo "$HOME"



利用可高度可定制的 cz-git 让 commit 更方便,更契合习惯,欢迎分享。

我只是尽力将工具做得更好,如果可以的话欢迎给一个 star ⭐