在当今软件开发的世界中,快速、高效地发布和部署软件包是至关重要的。上回我们说了如何利用GitHub流水线来自动化发布Rust的包,本文手把手教你如何自动发布一个npm包。
npm申请access token
首先,你肯定得有个npm账号,怎么注册就不细说了。
登陆以后,在个人设置里,找到access tokens:
看到access tokens这一栏
在Generator New Token下拉有2个选项,第一个粒度更精细些,我们用第二个传统的Classic Token就可以。
打开后,选择Publish:
点击Generate Token按钮,然后就生成了一个token:
这个token只会出现一次,所以需要你复制,做好备份。
GitHub工程配置流水线
这一步,与Rust工程的没有两样,都是利用GitHub的能力。
在这个工程的设置里,找到Secrets:
点击New repository secret,名称填npm_token:
在当前工程下,新建.github/workflows/npm-publish.yml
,内容如下:
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
name: Publish Package to npmjs
on:
push:
# branches: [ main ]
# paths:
# - 'src/'
tags:
- '**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# Setup .npmrc file to publish to npm
- uses: actions/setup-node@v3
with:
node-version: '16.x'
registry-url: 'https://registry.npmjs.org'
- run: yarn
- run: npm run build
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
有几点注意:
- 如果你有单元测试的部分,也可以对应加上。
- 我这里用的yarn,你也可以改为npm ci或者pnpm i(可能需要额外安装)。
- Node.js版本这里用的16,你可能要对应修改
- 流水线的触发策略这里是打tag后触发,你也可以修改为主分支。但不管怎样,都需要注意每次发版,package.json里的版本号(一般不要手动修改,而是用npm version命令)
到GitHub这个工程页面看
点开Actions:
流水线成功后,就能收到npm给你发的邮件了:
npm仓库里也就有了这个包:
TIPS
- 如果你的工程确定要发布到npm上,建议根目录下创建.npmrc文件,内容为
registry=https://registry.npmjs.org/
- 建议添加
.npmignore
,用来忽略不需要发布的文件。当然,如果没有它,npm会读取.gitignore
。如果把node_modules发上去,就闹笑话了。 - 推荐使用TypeScript开发工具包
- 考虑到你的npm包的不同受众或平台,你最好发布多种类型的文件,比如CommonJS、ESM或者UMD(JS模块化发展到今天,不是很有必要了),然后在package.json中添加以下几个字段,分别对应不同的模块化方案与类型:
"main": "dist/index.js",
"module": "dist/index.mjs",
"types": "dist/index.d.ts",
- 本地npm publish
有的同学可能觉得在GitHub上配置这一通麻烦,那么不用流水线,就在本地执行npm publish,能不能做到自动化?
当然是可以的。
package.json的scripts提供了相应的几个钩子。打个比方,你有个build的命令,那么执行npm run build时,会先执行npm run prebuild,执行完以后,再执行npm run postbuild。注意看,就是pre和post这俩单词。
而npm publish命令,肯定也是有预构建的命令的,npm prepublish。不过,它被弃用了,换成了这俩prepublishOnly
或prepare
。
也就是说,你可以使用这两个命令来整合你预发布需要做的事情,比如升级版本号,比如单元测试,比如构建。
以下是个样例:
"prepare": "npm version patch && npm run test && npm run build"
当你执行npm publish时,就会先触发npm run prepare。
总结
通过本文的学习,我们了解了如何利用GitHub流水线的强大功能来自动化发布npm包。自动化发布不仅提高了我们的开发效率,还降低了人为错误的风险。文末也给出了一些TIPS建议,你也可以使用npm的hook功能在本地实现自动化。