Skip to content

版本管理

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:当你做了不兼容的 API 修改,
  • 次版本号:当你做了向下兼容的功能性新增,
  • 修订号:当你做了向下兼容的问题修正。

先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

  • alpha 表示内部测试版,主要给开发和测试找 bug 用,不建议用户下载
  • beta 表示公开测试版,你可以提前尝试一些功能
  • rc 是 Release Candidate(候选版本)的缩写,表示该版本功能不再增加,和最终发布版功能一样,有点像预览版,然后可能再改改一些小 bug,就会到正式的版本了。

npm 指定版本范围

我们经常在 package.json 文件中看到版本号前出现 ~ ^ 等字符,比如:

json
{
  "dependencies": {
    "vue": "~1.2.3",
    "react": "^1.2.3"
  }
}

^ 表示次版本号的更新,只会执行不更改最左边非零数字的更新,比如 ^1.2.3 就表示以后安装的版本 >=1.2.3 <2.0.0

~ 表示修订版本号的更新,比如 ~1.2.3 就表示以后安装的版本 >=1.2.3 <1.3.0

semver

版本号效验

ts
// 是否为有效的版本号
function isValid(version: string) {
  return Boolean(semver.valid(version))
}

// 是否为现行版本
function isPreRelease(version: string) {
  return Boolean(semver.prerelease(version))
}

获取可选择的版本号

ts
import type { ReleaseType } from 'semver'
import semver from 'semver'

/**
 * 获取可选择的版本号
 * @param latestVersion 当前版本号
 */
function getIncrementChoices(latestVersion: string) {
  const types = ['patch', 'minor', 'major'] as ReleaseType[]

  const choices = types.map((increment) => {
    // semver.inc('1.2.3', 'prerelease', 'beta')
    const nextVersion = semver.inc(latestVersion, increment)
    return { name: `${increment} (${nextVersion})`, value: increment }
  })

  return choices
}

自定义版本号

ts
async function promptVersion(latestVersion: string) {
  const { version } = await inquirer.prompt({
    name: 'version',
    type: 'input',
    message: () => `Please enter a valid version:`,
    transformer: (input: string) =>
      semver.valid(input)
        ? semver.gt(input, latestVersion)
          ? green(input)
          : red(input)
        : redBright(input),
    validate: input =>
      !!semver.valid(input) || 'The version must follow the semver standard.',
  })

  return version
}