1 前言

npm 是日常前端开发过程中离不开的包管理工具,可以帮助我们快速安装 npm 仓库中优秀的第三方代码包,它的出现极大地促进了 Node 及前端生态的发展繁荣。

那么问题来了,为什么要搭建私有 npm 仓库呢?

在日常工作中,大多数时候我们会使用 NPM 共有仓库中的优秀开源代码包,但还是会有一些不能够开源的代码封装和工具,或者对第三方的开源代码做定制化修改和扩展,这些代码包需要在组织内部进行管理和共享,不能够上传到 NPM 共有仓库中。因此我们需要搭建 NPM 私有仓库来满足上述需要。

搭建自己的私有仓库,同时还能够提升 NPM 包的安装下载速度和源的稳定性,比如大家常用的淘宝镜像源,本质上也是私有仓库。公司搭建自己的 NPM 仓库,就可以为自己的员工提供更快速稳定的工具包共享下载平台。

接下来会依次介绍,如何搭建私有仓库发布工具包到私有仓库,以及如何从共有仓库同步代码包,大概需要10分钟的阅读时间,建议边阅读边实践。其中:

系统版本:Ubuntu 18.04

node 版本:12.18.2

npm 版本:6.14.5

2 如何搭建私有仓库

搭建 npm 私有仓库的方法和工具比较多,这里我们选用 cnpmjs 进行搭建。cnpmjs 是由阿里巴巴开发维护的企业级私有仓库框架,已经有国内众多的大厂使用检验过。

2.1 安装 MYSQL

搭建 cnpm 服务是需要数据库支撑的,官方提供了 mysql、sqlite、postgres、mariadb 数据库的支持,在这里我们选用 mysql 来提供数据服务。

首先安装 MySQL

sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev

安装成功后,在命令行工具中输入 mysql 可以直接进入 MySQL,接下来我们要设置密码;

首先进入进入 mysql,然后输入如下代码:

use mysql;
update user set authentication_string=PASSWORD("这里输入你要改的密码") where User='root'; #更改密码
update user set plugin="mysql_native_password"; #如果没这一行可能也会报一个错误,因此需要运行这一行
flush privileges; #更新所有操作权限
exit

接下来我们登录 MySQL

mysql -u root -p

输入刚刚设置的密码即可登录进数据库,下面我们要配置允许数据库进行远程连接,方便我们进行调试:

# 这边是为了方便测试设置了 *,请根据实际情况进行设置
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%'IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 注释掉bind-address = 127.0.0.1
service mysql restart

现在我们就可以远程连接数据库了。(记得打开服务器 3306 安全组)

2.2 安装 CNPMJS.ORG

2.2.1 基本配置

首先 clone cnpmjs 项目并安装依赖

git clone https://github.com/cnpm/cnpmjs.org.git
cd npmjs.org
#选用 2.X 比较稳定的版本进行部署
git checkout 2.19.4
npm i

cnpmjs 中提供了 config 文件供配置,文件路径在 config/index.js,根据说明进行如下配置。

  • 服务器端口配置

    registryPort: 7001, // registry 端口,用于 npm config set registry
    webPort: 7002, // web 端口,用于访问 cnpm 网页
    // bindingHost: '127.0.0.1', // 为使其能够通过服务器端口访问,将其注释
    
  • 数据库配置

    database: {db: 'cnpmjs', // 数据库名称username: 'root', // 用户名password: '', // 密码dialect: 'mysql', // 服务器中安装的数据库host: '127.0.0.1', // 服务器 ip 地址port: 3306, // 数据库端口号  // storage: path.join(dataDir, 'data.sqlite'), // 因为我们选用的是 mysql,所以将其注释
    }
    
  • 是否启用私有模式

    // 在启用私有模式时,只有管理员才能发布工具包,非管理员发布工具包必须以 scope 开头,例如 @ke/hobber-cli
    enablePrivate: false,
    scopes: ['@jacob'] // 根据实际情况自由配置
    
  • 管理员账号配置

    admins: {  admin: 'jacob.lcs@qq.com',}
    

2.2.2 创建数据库表

首先保证目前的路径是在 cnpmjs.org 路径下,然后运行如下命令:

mysql -u root -p
create database cnpmjs;
source docs/db.sql;

此时数据库中应该存在以下数据表:

2.2.3 启动项目

在这里我们使用 pm2 启动项目:

npm i pm2 -g
pm2 start ./dispatch.js

启动之后运行 pm2 status 查看项目当前运行状态,如下显示则表示成功运行。

在 config/index.js 中我们配置了两个端口号,分别是 7001、7002,需要在安全组中开放这两个端口,此时使用 IP + 端口号即可访问部署的 cnpm 服务,如下所示:

3 发布工具包到私有仓库

上面提到过 7001 端口是用于 npm set config registry 用的,比如说笔者的服务器域名为 http://lcs.show,那么 registry 地址就为 http://lcs.show:7001,使用如下命令进行设置。

npm config set registry http://lcs.show:7001# 添加用户并登录
npm adduser
npm login

准备一个测试项目发布到 npm 仓库中,将 package.json 中的 name 改为 scopes 中的字段开头,例如 @jacob/aeditor,执行如下命令即可。

npm publish

显示如下即表示发布成功。

然后我们访问我们搭建的私有 npm 仓库页面查看该工具包的介绍页,该包的访问地址如下:http://lcs.show:7002/@jacob/aeditor。

显示如下:

发布到我们的私有仓库之后可以测试一下安装是否成功,运行 npm i @jacob/aeditor 即可,安装成功则表示成功运行。

4 进阶配置

经过上述配置之后我们可以使用 npm 私有仓库进行工具包的发布、安装操作了,使用私有 npm 仓库的目的之一是保证 npm install 服务的稳定性和速度,所以在公司搭建好 npm 私仓之后要做的另一件事是定时同步 npm 共有仓库中的工具包,将所有的包存储在公司内部的服务器中。cnpmjs 也给我们提供了以下两种同步方式:

4.1 手动同步

在私有仓库首页搜索某个工具包,如果这个包在服务器中不存在的话会显示如下界面:

cnpmjs 提供了两个选项,一个是从官方 npm 仓库中进行同步,再一个就是去官方 npm 仓库中搜索,在这里我们点击 SYNC 进行同步操作,cnpmjs 就会自动帮我们进行同步操作了,同步完成后就可以在私仓首页搜索到对应的包信息,这里要注意的是,cnpmjs 同步并不是只同步你搜索的包,而是会同步其所有的依赖

同步完成后我们就可以在私仓中搜索到对应的包信息了。

4.2 自动同步

cnpmjs 还提供了自动同步的方式,在 config/index.js 文件中有一个 syncModel 配置项,提供了三个配置(none - 不自动同步、exist - 同步私仓中已存在的包、all - 同步所有的包),在这里就可以根据实际情况进行配置了。

如果自动同步所有包的话会带来一个问题,就是磁盘体积问题,笔者在同步 Vue、less 两个包之后硬盘空间已经占用了 30G 以上,笔者还没有来得及测试到底有多大,40G 的云空间已经存满了。同步所有包的话服务器磁盘空间会有很大压力,所幸 cnpmjs 也为我们提供了 OSS 选项,笔者使用 qn-cnpm(七牛云 OSS) 进行演示。

安装 qn-cnpm:

npm i qn-cnpm

使用 qn-cnpm,在 config/index 的 nfs 进行配置,配置如下:

nfs: require('qn-cnpm')({accessKey: 'your access key',secretKey: 'your secret key',bucket: 'qiniu',domain: 'http://qiniu-sdk-test.qiniudn.com'
});

这样可以将自动同步的包存储到云服务中去了。

5 常见问题 QA

  • 400 Bad Request - PUT http://lcs.show:7001/@jacb%2faeditor - invalid scope

    出现这种情况一般是 scopes 没有设置好,导致当前的包的 scope 不包含在 cnpmjs 的 scopes 数组内,修改完成之后进行重新启动 cnpm。

  • 403 Forbidden - PUT http://lcs.show:7001/aeditor - no_perms

    这种就是当前 npm 登录的用户不是私有仓库的管理员并且没有设置工具包的 scope,导致发布失败。

6 参考文档

  • cnpmjs 官方部署文档

    https://github.com/cnpm/cnpmjs.org/wiki/Deploy

  • 分分钟教会你搭建企业级的 npm 私有仓库

    https://juejin.im/post/6844904196651630599

  • CNPM搭建私有的NPM服务

    http://blog.fens.me/nodejs-cnpm-npm/

如何搭建私有NPM仓库,私有NPM仓库搭建教程相关推荐

  1. python 内网镜像站_搭建私有YUM仓库与内网镜像站

    原标题:搭建私有YUM仓库与内网镜像站 搭建私有YUM仓库 私有yum仓库环境 系统版本:centos7.4 IP:192.168.1.47 #最好能上公网 私有yum仓库服务端配置 第一:创建使用y ...

  2. 搭建Docker本地私有镜像仓库

    在使用Docker service create创建容器时,Docker首先默认从Docker Hub官方去下载镜像,这很不方便,很多时候我们的镜像都是使用Dockerfile自定义私有镜像,不对外公 ...

  3. npm本地仓库搭建教程

    看完你将能收获:搭建自己本地的个人或者公司私有的npm仓库. ** 前言 ** npm是随同node.js一起绑定安装的包管理工具,其他比较知名的包管理工具有bower,yarn等. npm现在已经是 ...

  4. 如何搭建一个私有npm仓库

    业界主流的私有npm仓库搭建的主流方案有如下几种: 付费购买 使用 git+ssh 这种方式直接引用到 GitHub 项目地址 使用 Sinopia 使用 cnpmjs.org 第一种,一是考虑到公司 ...

  5. 在5分钟内搭建企业内部私有npm仓库

    下面通过三种方法来搭建公司私有npm仓库,每种方式都有自己的优势. Node.js >= 6.11.3,我的Node版本:node v8.2.1 Linux or OSX,我的系统版本:Cent ...

  6. 使用verdaccio搭建私有npm仓库

    verdacico官网 https://verdaccio.org/zh-CN/docs/setup-npm verdacico安装前准备 确保电脑已安装node.js 步骤一:输入node -v 验 ...

  7. 多个 本地仓库_【运维工具】搭建npm私有镜像仓库,天下苦于npm build久矣

    ​01 前 言 当你的研发团队越来越大,或是你无法忍受node超慢的构建时你可以考虑继续读下去,给大家推荐一个基于Verdaccio相对较完整的解决方案. 由于环境的原因,我们直接去 http://n ...

  8. 构建前端团队的私有npm仓库

    有一点规模的团队,都需要逐渐构建自己的npm包.现在有一个比较好的解决方案Sinopia,可以快速搭建和部署私有的npm服务器. 本文详细记录了我在搭建私有npm包时,遇到的问题,以及个人的思考. 1 ...

  9. Nexus 搭建私有镜像仓库

    Nexus 搭建私有镜像仓库 说明 国内网络环境下直接使用默认的 npm 下载资源过慢,所以很多文章中都建议将 npm 的 registry 切换为 淘宝的 npm 镜像,如下 npm config ...

最新文章

  1. 七种编程语言的学习曲线
  2. js-在url后面添加时间戳清除浏览器打开页面的缓存
  3. ios中MKHorizMenu用法
  4. 试试看 ? 离奇古怪的javascript题目
  5. 企业级rancher搭建Kubernetes(采用rancher管理平台搭建k8s)
  6. dc/os_DC / OS中具有Java和数据库应用程序的服务发现
  7. 疫情相关电信诈骗涉案金额超3.51亿元,谨防这四类骗局!
  8. java query object_java queryforobject
  9. gson 不忽略空_仅在不为null或不为空的情况下,Gson序列化字段
  10. python-字符串基础
  11. ENVI入门系列教程---一、数据预处理---3.2 遥感图像几何精校正
  12. Hotel 旅馆 题解(From luoguBlog)
  13. 泾县高级职业中学计算机专业课程,泾县高级职业中学:以人为本 促可持续发展...
  14. 希尔伯特空间、欧几里德空间
  15. 计算机游戏软件制作,游戏制作软件,制作游戏的软件
  16. 框架设计--第七章 MyBatis的核心配置--习题答案
  17. html 表格输出excel,html中导出excel表格
  18. 团队协作常见问题分析与解决
  19. Unity 打包项目发红
  20. 国际音标(IPA)和美国音标(KK)对照表

热门文章

  1. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(3)
  2. Java 8 中的 HashMap
  3. File操作 - list()/listFiles()与目录过滤器
  4. 主存储器扩展技术(计组)
  5. 【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + RS-LiDAR-16 激光雷达测试
  6. 中科大2018计算机在安徽招生最低分,中国科学技术大学2020年录取分数线(附2017-2020年分数线)...
  7. 微商无钢圈内衣怎么做引流?微商内衣如何寻找客源?
  8. 机器学习——决策树实践(预测隐形眼镜类型)
  9. Java语言实现输出一百以内的所有质数的算法
  10. java inflater_Deflater与Inflater的压缩与解压缩