在当今软件开发的世界中,快速、高效地发布和部署软件包是至关重要的。上回我们说了如何利用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功能在本地实现自动化。
发表评论 取消回复