手把手搭建npm私有仓库

最近为公司项目写好的creator 3.x框架准备投入使用,框架封装成npm包的形式,并非以cocos插件形式实现。

以前的使用方式是创建一个svn库,其他人checkout下来,package.json配置成file引入

package.json:


{

  "name": "cocos_framework_demo",

  "creator": {

    "version": "3.8.5"

  },

  ......

  "dependencies": {

    "framework": "file:../cocos_framework_module"

  }

}

然而这种方式会有个问题:

多个项目都会直接引用到同一个框架库目录(持续更新到最新),但是框架在迭代过程中必定会有一些修改难以兼容旧版本,否则框架只会变成屎山。

部分用到旧版本的项目由于各种原因(已上线,人员精力有限)不好做适配修改,这部分项目就需要继续使用旧版本框架。

显然这种情况下用svn管理不太合适,我们需要一个可以兼容多版本的管理工具。

稍等…这不就是npm吗?

于是我们就有了一个需求,搭建私有npm源

在网上搜寻了一番,综合功能性和易用性,最终决定使用 Verdaccio 进行搭建

  • Verdaccio简介

Verdaccio,是一个轻量级的 npm 私有仓库的开源解决方案。npm是一个基于http的协议,用来存放软件包并且维护版本和依赖,利用 http 提供的 url路径 来对软件包进行增删改查。所以 Verdaccio 这款软件的核心就是实现 npm协议。

Verdaccio 有一个内置的数据库来存放所有的 npm 包,除此之外它还有一套默认的鉴权机制:htpasswd。htpasswd鉴权是通过htpasswd文件来存放所有的 npm用户,鉴权、添加/删除的时候通过对文件的读写来实现。

Verdaccio 提供了上行链路功能, 安装 Verdaccio 仓库中不存在的包时,可以配置向上游仓库下载。

Verdaccio 还提供了强大的身份认证系统。

  • 先给总结,看下是否适合您

Verdaccio可以直接 npm install 安装,window,linux 皆可运行。

配置简单,可以单独配置访问,发布,删除权限

可以设置上游npm源(如taobao镜像等),当需要拉取仓库中不存在的库时,会从上游仓库下载并且缓存到本地

看到这里,我相信你的需求应该跟我一样,那么我们手把手开始了~

以下操作皆在windows下执行,linux下也一样,如有差异会特殊说明

1.安装verdaccio

npm i -g verdaccio

2.启动verdaccio

控制台运行

verdaccio

出现上图所示日志 说明verdaccio已经成功启动

留意上图标记处


config file  - C:\Users\gotech\AppData\Roaming\verdaccio\config.yaml

这个文件是verdaccio的配置文件,我们记住这个文件路径。

3.修改verdaccio配置

用编辑器打开上面的配置文件

我们只需要修改几个关键配置

config.yaml:

  • storage:库存储路径,windows下建议修改这个,否则默认路径在c盘会占用不少c盘空间

  • uplinks:上游库地址,建议修改为国内的源(如taobao https://registry.npmmirror.com/),访问速度更快

  • listen:监听端口,允许其他人访问

至此配置大功告成,我们关掉之前运行的窗口重新运行verdaccio让配置生效

在需要访问这个私有库的电脑用浏览器打开 http://私有库地址:4873

如果看到这个页面,那么恭喜你,你的私有仓库已经成功搭建!只是暂时空空如也~

4.切换npm源

在需要访问这个私有仓库的电脑设置npm源

npm config set registry http://私有仓库地址:4873

5.创建用户,设置权限

我们的需求是任何可以访问私有仓库的人都可以使用我们的私有库,但是只有共和国最优秀的人才才能发布和删除私有库,因此在发布我们的私有库之前,还有很重要的一步,就是创建用户,和设置权限。

  • 创建用户

控制台输入npm adduser,按照提示输入帐号密码邮箱即可完成帐号创建

  • 设置权限

帐号创建完毕后我们打开verdaccio的配置文件,找到packages 字段,

修改publish(发布)和unpublish(删除) 为我们刚才创建的帐号(可以添加多个,用空格隔开)

  • 重启verdaccio

6.发布库

回到我们需要发布的库目录,编辑package.json帮我们的库取个霸气外漏的名字(因为要发布,不能太随意)

package.json:

在这个目录打开控制台

  • 执行 npm login 用刚才创建的账号密码按照提示登录

  • 执行 npm publish 把库发布到私有仓库

发布完毕后我们到后台 http://私有仓库地址:4873 刷新一下

优雅,霸气,无须多言。

至此我们的私有库已经成功发布,使用方式跟常规的库一样,名称,版本就是package.json设置好的name和version

7.后台运行verdaccio

上一秒还沉浸在成功搭建私有仓库的你,可能下一秒就会发现运行verdaccio的窗口不能关掉,否则进程也会关掉

显然这也不符合我们优雅的定位,借助 pm2 我们可以后台运行verdaccio

pm2 是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态

关于 pm2 这里不展开详细介绍,有兴趣的可以自行搜索相关资料,本文只作简单的安装和使用介绍

  • 安装 pm2 npm install pm2 -g

  • 使用 pm2 运行verdaccio

pm2 start verdaccio

  • 执行 pm2 list 查看是否成功运行

windows下需要注意,直接执行 pm2 start verdaccio可能会报错,需要指定verdaccio具体路径

pm2 start C:\Users\gotech\AppData\Roaming\npm\node_modules\verdaccio\bin\verdaccio

8.其他

回到我们的开头,注意看原来的用法

package.json:


"dependencies": {

    "framework": "file:../cocos_framework_module"

}

如果我们改为使用私有仓库里的库,那么正常应该改为


"dependencies": {

    "gotech-cocos-3x": "^1.0.0"

}

但是我们原来的名称叫做framework,在代码里面的用法也是 import * from "framework"

我们不希望在代码里面看到那个霸气外漏的名字,框架就简单的叫做框架就好。

那么我们可以用这种方式配置别名


"dependencies": {

    "framework": "npm:gotech-cocos-3x@^1.0.0"

}

大功告成,优雅,实在优雅~

3赞

好的,我这就用svn的方法

既然都私有的 npm 包,走 git 子模块 不是更合理?本身 git 提供了用户权限控制。相当于复用了用户的权限。多一套 npm ,只适用于 js 系,而且多了服务器管理 pm2 管理,这显然是很麻烦的,没看出优势在哪里?

它主要是为了版本管理,我的框架目前用的 git,因为每个版本我基本做到了向前兼容。
如果哪天不兼容了,我可能也得改用 npm 了

兼容可以走分支,除非它这个是后续发布公有,那时再走 npm 比较合理。