Skip to content

package.json 的版本号

组成部分

(1)、第一部分为主版本号,变化了有了一个不兼容上个版本的大更改。 (2)、第二部分为次版本号,变化了表示增加了新功能,并且可以向后兼容。 (3)、第三部分为修订版本号,变化了表示有bug修复,并且可以向后兼容。 (4)、第四部分为日期版本号和希腊字母版本号,希腊字母版本号共有五种,分为 base、alpha、beta、RC、release

总结

paceage.json文件中包含版本,解析地址,依赖信息等等,因此当我们重新执行 npm install 的时候,node从package.json 中读取到了各个依赖包的名称,然后如果存在package-lock.json文件,那么会从package-lock.json文件中获取版本号,再进行下载或者更新;

相关地址

https://docs.npmjs.com/about-semantic-versioning

https://semver.org/lang/zh-CN/

如何自动更新package.json 的版本号呢?

要自动更新 package.json 文件中的版本号 安装 npm :确保你已经安装了 Node.js 和 npm,因为它们是管理 JavaScript 项目和包依赖的工具。

在你的项目根目录下打开终端,并执行以下命令安装

npm install -g npm-version-bump
  • 现在你可以使用以下命令来自动增加版本号:
npm version [<newversion> | major | minor | patch] [-m <commit message>]

例子

  • 例如,要将版本号增加到 1.0.1,你可以运行以下命令
npm version patch
  • 例如从 1.0.1 增加到 2.0.0。
npm version major
  • 例如从 1.0.1 增加到 1.1.0
npm version minor

@changesets/cli - Monorepo项目发包工具

添加变更集工具

npm install @changesets/cli && npx changeset init

yarn add @changesets/cli && yarn changeset init

添加变更集

npx changeset

yarn changeset

版本控制和发布

yarn changeset version

这将使用所有变更集,并根据这些变更集更新到最合适的 semver 版本。它还为每个使用的变更集写入变更日志条目。

yarn changeset publish 这将在每个包中运行 npm publish,该包的版本高于当前在 npm 上列出的包。

--no-git-tag 跳过打标签

当您运行changeset publish --no-git-tag --snapshot时,变更集将跳过为已发布的快照包创建 git 标记。这意味着在推送稳定版本时仍然可以创建 git 标签(使用常规changeset publish版本),并且您可以安全地在本地发布快照版本,而无需创建不必要的标签。

【@changesets/cli】变更集实战教程

https://blog.csdn.net/bobo789456123/article/details/137018577?spm=1001.2014.3001.5502

np

A betternpm publish

"prepublishOnly": "npm run build",
"release": "np --no-cleanup --no-tests --any-branch",
"deploy-component": "np --any-branch",
"np": "^7.5.0",
"publishConfig": {
  "access": "public",
  "registry": "https://registry.npmjs.org/"
},
"files": [
  "lib",
  "esm"
],

npm install np -g 这个np包的使用注意事项,请描述

npm install np -g 这条命令是用来全局安装名为 np 的 npm 包。np 是一个辅助工具,用于简化 Node.js 包(尤其是那些发布到 npm registry 的包)的发布过程。以下是使用 np 包时需要注意的几个事项:

  1. 权限要求

    • 使用 -g 选项:由于命令中包含了 -g(全局)标志,这意味着 np 将被安装到全局 npm 目录中,通常需要管理员权限。在命令行中,可能需要使用 sudo(Unix/Linux/macOS)或以管理员身份运行命令提示符(Windows)来执行安装。
  2. 版本兼容性

    • Node.js 和 npm 版本:确保你的系统中安装了与 np 兼容的 Node.js 和 npm 版本。可以在 np 的官方文档或 GitHub 页面查看其对环境版本的要求。通常,保持 Node.js 和 npm 的更新可以避免兼容性问题。
  3. 替代 npm publish

    • 发布流程npnpm publish 命令的一个封装和增强,它提供了一套标准化且可配置的发布流程,包括但不限于:自动执行 prepublishpreparetest 等生命周期脚本,检查 package.json 文件完整性,生成 changelog,提交版本更新到 Git,打标签,最后才执行 npm publish 发布到 npm registry。使用 np 发布时,通常不再需要直接运行 npm publish
  4. 配置与个性化

    • .npmrcpackage.jsonnp 会读取项目根目录下的 .npmrcpackage.json 文件来获取发布配置。确保这些文件中的 nameversionrepositoryfilesscripts 等字段正确无误,特别是 publishConfig 字段,可能包含发布到私有 registry 的配置。
  5. Git 工作流集成

    • Git 状态:在使用 np 发布前,确保你的 Git 工作区是干净的(无未提交的更改),并且处于正确的分支(通常为 mastermain)。np 通常会在发布过程中自动提交更改、打标签并推送至远程仓库。
  6. 确认发布意图

    • 确认提示np 在发布过程中会提供交互式的确认提示,确保你了解即将进行的操作。仔细阅读并确认提示信息,避免误操作导致不必要的发布。
  7. 遵循 SemVer

    • 版本号管理np 建议遵循 Semantic Versioning(SemVer)原则管理版本号。在发布时,根据更新内容选择合适的版本号增量(major、minor、patch),确保版本升级对下游使用者的影响清晰可预期。
  8. 更新依赖

    • 依赖更新:如果你的包有依赖其他库,确保在发布前已更新相关依赖至最新稳定版本,并在 package.json 中记录正确的依赖版本范围。np 可能会检查依赖项并给出建议,但最终责任在于开发者。

总结来说,使用 np 包进行 Node.js 包发布时,需要注意权限要求、环境兼容性、配置文件的正确性、Git 工作流的整合、发布意图的确认、遵循 SemVer 版本管理原则以及依赖项的更新。遵循这些注意事项,可以确保使用 np 顺利且有效地完成包的发布过程。

如果我需要发布一个2.0.0-beta.2的版本,使用np如何做到

若要使用 np 发布一个名为 2.0.0-beta.2 的预发布版本,你可以按照以下步骤操作:

  1. 更新 package.json: 首先,确保在你的项目根目录下的 package.json 文件中,将 version 字段设置为 2.0.0-beta.2。这是告诉 npm 你打算发布的版本标识。
json
{
  "name": "your-package-name",
  "version": "2.0.0-beta.2"
  // ... 其他字段
}
  1. 清理并验证项目状态: 确保你的工作区干净(没有未提交的更改),且处于正确的发布分支(通常是 mastermain)。所有待发布的代码改动已经提交,并推送到远程仓库。

  2. 运行 np 命令: 打开终端,进入项目根目录,然后运行 np 命令。np 会自动检测项目状态、执行测试、构建等预发布任务,并最终发布到 npm registry。

sh
cd your-project-directory
np

np 会引导你完成整个发布流程,包括确认版本信息、是否执行测试、是否生成 changelog 等。由于你已经在 package.json 中指定了预发布版本号,np 应该会识别并尊重这个设定,直接发布 2.0.0-beta.2 版本。

注意

  • 如果你的项目有特殊的发布流程需求,比如特定的生命周期脚本、额外的发布验证等,确保这些已经在 package.jsonscripts 字段中定义,并且与 np 的工作流程兼容。
  • 如果你的项目使用的是私有 npm registry 或需要特殊的发布配置,确保在 .npmrc 文件中或者 package.jsonpublishConfig 字段中已经设置了正确的信息。

附加选项

  • 如果你需要跳过某些默认步骤(如测试或提交 Git),np 提供了一些命令行选项来定制发布流程。查阅 np 的官方文档或通过 np --help 查看可用选项,根据需要调整发布命令。

按照上述步骤操作后,你应该能够成功使用 np 发布版本号为 2.0.0-beta.2 的预发布版本到 npm registry。记得密切关注 np 在发布过程中给出的提示和确认信息,确保每个步骤符合你的预期。

  1. np --no-cleanup --no-publish --no-release-draft

    • 使用np工具(假设已经全局或局部安装)来执行发布前的准备工作。
    • --no-cleanup:禁用发布完成后清理临时文件的行为。
    • --no-publish:禁止np在最后一步执行实际的npm publish操作,即不立即发布到 npm registry。
    • --no-release-draft:不创建 GitHub release draft(如果项目与 GitHub 仓库关联)。这一步通常涉及生成 changelog 并在 GitHub 上创建一个待发布的版本草稿。
  "prebuild": "rimraf dist",
    "prepare": "npm run build",
 "release": "np"

手写一个release.ts

/* eslint-disable  import/no-extraneous-dependencies,@typescript-eslint/camelcase, no-console */
import inquirer from 'inquirer';
import fs from 'fs';
import path from 'path';
import child_process from 'child_process';
import util from 'util';
import chalk from 'chalk';
import semverInc from 'semver/functions/inc';
import { ReleaseType } from 'semver';

import pkg from '../package.json';

const exec = util.promisify(child_process.exec);

const run = async (command: string) => {
  console.log(chalk.green(command));
  await exec(command);
};

const currentVersion = pkg.version;

const getNextVersions = (): { [key in ReleaseType]: string | null } => ({
  major: semverInc(currentVersion, 'major'),
  minor: semverInc(currentVersion, 'minor'),
  patch: semverInc(currentVersion, 'patch'),
  premajor: semverInc(currentVersion, 'premajor'),
  preminor: semverInc(currentVersion, 'preminor'),
  prepatch: semverInc(currentVersion, 'prepatch'),
  prerelease: semverInc(currentVersion, 'prerelease'),
});

const timeLog = (logInfo: string, type: 'start' | 'end') => {
  let info = '';
  if (type === 'start') {
    info = `=> 开始任务:${logInfo}`;
  } else {
    info = `✨ 结束任务:${logInfo}`;
  }
  const nowDate = new Date();
  console.log(
    `[${nowDate.toLocaleString()}.${nowDate
      .getMilliseconds()
      .toString()
      .padStart(3, '0')}] ${info}
    `,
  );
};

/**
 * 获取下一次版本号
 */
async function prompt(): Promise<string> {
  const nextVersions = getNextVersions();
  const { nextVersion } = await inquirer.prompt([
    {
      type: 'list',
      name: 'nextVersion',
      message: `请选择将要发布的版本 (当前版本 ${currentVersion})`,
      choices: (Object.keys(nextVersions) as Array<ReleaseType>).map(level => ({
        name: `${level} => ${nextVersions[level]}`,
        value: nextVersions[level],
      })),
    },
  ]);
  return nextVersion;
}

/**
 * 更新版本号
 * @param nextVersion 新版本号
 */
async function updateVersion(nextVersion: string) {
  pkg.version = nextVersion;
  timeLog('修改package.json版本号', 'start');
  await fs.writeFileSync(path.resolve(__dirname, './../package.json'), JSON.stringify(pkg));
  await run('npx prettier package.json --write');
  timeLog('修改package.json版本号', 'end');
}

async function generateChangelog() {
  timeLog('生成CHANGELOG.md', 'start');
  await run(' npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0');
  timeLog('生成CHANGELOG.md', 'end');
}

/**
 * 将代码提交至git
 */
async function push(nextVersion: string) {
  timeLog('推送代码至git仓库', 'start');
  await run('git add package.json CHANGELOG.md');
  await run(`git commit -m "v${nextVersion}" -n`);
  await run('git push');
  timeLog('推送代码至git仓库', 'end');
}

/**
 * 组件库打包
 */
async function build() {
  timeLog('组件库打包', 'start');
  await run('npm run build');
  timeLog('组件库打包', 'end');
}

/**
 * 发布至npm
 */
async function publish() {
  timeLog('发布组件库', 'start');
  await run('npm publish');
  timeLog('发布组件库', 'end');
}

/**
 * 打tag提交至git
 */
async function tag(nextVersion: string) {
  timeLog('打tag并推送至git', 'start');
  await run(`git tag v${nextVersion}`);
  await run(`git push origin tag v${nextVersion}`);
  timeLog('打tag并推送至git', 'end');
}

async function main() {
  try {
    const nextVersion = await prompt();
    const startTime = Date.now();
    // =================== 更新版本号 ===================
    await updateVersion(nextVersion);
    // =================== 更新changelog ===================
    await generateChangelog();
    // =================== 代码推送git仓库 ===================
    await push(nextVersion);
    // =================== 组件库打包 ===================
    await build();
    // =================== 发布至npm ===================
    await publish();
    // =================== 打tag并推送至git ===================
    await tag(nextVersion);
    console.log(`✨ 发布流程结束 共耗时${((Date.now() - startTime) / 1000).toFixed(3)}s`);
  } catch (error) {
    console.log('💣 发布失败,失败原因:', error);
  }
}

main();

https://cloud.tencent.com/developer/article/1810012

git-chglog

"chglog": "git-chglog -o CHANGELOG.md",

bundlesize

"bundle-check": "bundlesize",

"bundlesize": [

{

"path": "./dist/index.js",

"maxSize": "20 kB"

}

],

Contributors

作者:Long Mo
字数统计:2.7k 字
阅读时长:10 分钟
Long Mo
文章作者:Long Mo
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Longmo Docs