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
包时需要注意的几个事项:
权限要求:
- 使用
-g
选项:由于命令中包含了-g
(全局)标志,这意味着np
将被安装到全局 npm 目录中,通常需要管理员权限。在命令行中,可能需要使用sudo
(Unix/Linux/macOS)或以管理员身份运行命令提示符(Windows)来执行安装。
- 使用
版本兼容性:
- Node.js 和 npm 版本:确保你的系统中安装了与
np
兼容的 Node.js 和 npm 版本。可以在np
的官方文档或 GitHub 页面查看其对环境版本的要求。通常,保持 Node.js 和 npm 的更新可以避免兼容性问题。
- Node.js 和 npm 版本:确保你的系统中安装了与
替代
npm publish
:- 发布流程:
np
是npm publish
命令的一个封装和增强,它提供了一套标准化且可配置的发布流程,包括但不限于:自动执行prepublish
、prepare
、test
等生命周期脚本,检查 package.json 文件完整性,生成 changelog,提交版本更新到 Git,打标签,最后才执行npm publish
发布到 npm registry。使用np
发布时,通常不再需要直接运行npm publish
。
- 发布流程:
配置与个性化:
.npmrc
和package.json
:np
会读取项目根目录下的.npmrc
和package.json
文件来获取发布配置。确保这些文件中的name
、version
、repository
、files
、scripts
等字段正确无误,特别是publishConfig
字段,可能包含发布到私有 registry 的配置。
Git 工作流集成:
- Git 状态:在使用
np
发布前,确保你的 Git 工作区是干净的(无未提交的更改),并且处于正确的分支(通常为master
或main
)。np
通常会在发布过程中自动提交更改、打标签并推送至远程仓库。
- Git 状态:在使用
确认发布意图:
- 确认提示:
np
在发布过程中会提供交互式的确认提示,确保你了解即将进行的操作。仔细阅读并确认提示信息,避免误操作导致不必要的发布。
- 确认提示:
遵循 SemVer:
- 版本号管理:
np
建议遵循 Semantic Versioning(SemVer)原则管理版本号。在发布时,根据更新内容选择合适的版本号增量(major、minor、patch),确保版本升级对下游使用者的影响清晰可预期。
- 版本号管理:
更新依赖:
- 依赖更新:如果你的包有依赖其他库,确保在发布前已更新相关依赖至最新稳定版本,并在
package.json
中记录正确的依赖版本范围。np
可能会检查依赖项并给出建议,但最终责任在于开发者。
- 依赖更新:如果你的包有依赖其他库,确保在发布前已更新相关依赖至最新稳定版本,并在
总结来说,使用 np
包进行 Node.js 包发布时,需要注意权限要求、环境兼容性、配置文件的正确性、Git 工作流的整合、发布意图的确认、遵循 SemVer 版本管理原则以及依赖项的更新。遵循这些注意事项,可以确保使用 np
顺利且有效地完成包的发布过程。
如果我需要发布一个2.0.0-beta.2的版本,使用np如何做到
若要使用 np
发布一个名为 2.0.0-beta.2
的预发布版本,你可以按照以下步骤操作:
- 更新 package.json: 首先,确保在你的项目根目录下的
package.json
文件中,将version
字段设置为2.0.0-beta.2
。这是告诉 npm 你打算发布的版本标识。
{
"name": "your-package-name",
"version": "2.0.0-beta.2"
// ... 其他字段
}
清理并验证项目状态: 确保你的工作区干净(没有未提交的更改),且处于正确的发布分支(通常是
master
或main
)。所有待发布的代码改动已经提交,并推送到远程仓库。运行
np
命令: 打开终端,进入项目根目录,然后运行np
命令。np
会自动检测项目状态、执行测试、构建等预发布任务,并最终发布到 npm registry。
cd your-project-directory
np
np
会引导你完成整个发布流程,包括确认版本信息、是否执行测试、是否生成 changelog 等。由于你已经在 package.json
中指定了预发布版本号,np
应该会识别并尊重这个设定,直接发布 2.0.0-beta.2
版本。
注意:
- 如果你的项目有特殊的发布流程需求,比如特定的生命周期脚本、额外的发布验证等,确保这些已经在
package.json
的scripts
字段中定义,并且与np
的工作流程兼容。 - 如果你的项目使用的是私有 npm registry 或需要特殊的发布配置,确保在
.npmrc
文件中或者package.json
的publishConfig
字段中已经设置了正确的信息。
附加选项:
- 如果你需要跳过某些默认步骤(如测试或提交 Git),
np
提供了一些命令行选项来定制发布流程。查阅np
的官方文档或通过np --help
查看可用选项,根据需要调整发布命令。
按照上述步骤操作后,你应该能够成功使用 np
发布版本号为 2.0.0-beta.2
的预发布版本到 npm registry。记得密切关注 np
在发布过程中给出的提示和确认信息,确保每个步骤符合你的预期。
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"
}
],