明道若昧,进道若退,夷道若纇。 上德若谷;大白若辱;广德若不足;建德若偷;质真若渝。
最近想把博客用到的图标单独打包成 npm 包,但是有一些图标涉及到品牌规范,并且不太想占用公共资源,于是想着不发布到 npm 官方注册表。
之前在 使用 github Action 发布 npm 包 的时候,有在 github 上面发布 npm 包,但是一来 npm 也是公开的,二来没有深入研究,故而也不太适合。
在自托管的 gitlab 上实际上也可以发布 Package,但当时应该是没有仔细看文档,因懒惰而劝退。这次在自托管的 forgejo 点进去,发现 发布 npm 包 还挺简单的。

指定不同的 registries
因为是私有注册表,不是公开注册表的镜像,所以如果指定安装的时候用私有的话,package.json 里边其他的包也会去查找私有注册表,直接 404。
npm 无法为 非 scope 包 指定不同 registries,推荐的解决方案是 将范围 scope 与注册表相关联。
虽然看起来不是那么优雅,但也算能解决问题。
在项目的 .npmrc 文件中设置此注册中心
registry=https://registry.npmjs.org
@myReg:registry=https://fo.my.reg/api/packages/pub/npm/
默认模块会从官方下载,@myReg 范围的包则从自己的注册表下载。
npm 安装远程 URL
正好最近有个项目报错,于是发现,其实 npm 的 package.json 里是可以 从远程安装 的。
npm install <git remote url>
但是设计的时候指针对 git 来源,支持 git+ssh, git+https 协议,以及 github gist bitbucket gitlab 等别名。似乎是通过 git 将目标的仓库克隆下来并安装。
因为已经打包成了 npm 包,暂时没有尝试这种方式。
其他的 publish 相关
因为我需要打包静态资源,一开始打包后发现文件都不见了,这时候需要在 package.json 里边添加 file 区域,指定需要 publish 的文件。
"files": [
"data/**/*",
"*.js",
"*.d.ts"
],
typescript 相关的 d.ts 需要在 exports 里边指定:
"exports": {
".": {
"import": "./index.js",
"require": "./index.js"
},
"./content": {
"import": {
"types": "./content.d.ts",
"default": "./content.js"
},
"require": {
"types": "./content.d.ts",
"default": "./content.js"
}
},
}
然后可以用 npm pack 预览一下打包后的压缩包。
确认无误就可以 npm publish 了。
最后,就可以打造相对可控的开发环境了。
没有监控,没有追踪,没有大公司利益。才足够安心。