当你发布一个npm包的时候是不是考虑过,npm是开源的,而你上班公司的机密是不允许外泄的,这个时候如果公司自己的服务器上有一个npm库,可以提供给下载公司自己封装的私有组件就好了,当你考虑到这些的时候,有人已经帮你铺平了道路。
现在比较流通的构建私有仓库的方法就是上明标题所讲的三种方式,三种方式各有千秋,你可以选择适合你自己的方式,下面我就最近的研究记录一下三种方式的实现方法。
当前环境 --------->>>>> centOS :7.4
Verdaccio | sinopia
环境要求
Verdaccio是nodejs开发的轻量级的文本型仓库,所以安装verdaccio首先需要安装node(node具体安装步骤本文不做讲解),
安装
使用npm全局安装verdaccio(sinopia区别跟verdaccio不大,所以这里只说一下verdaccio)
$ npm i verdaccio -g
查看帮助文档,非常简单就几条参数
$ verdaccio -h
运行
如果你的verdaccio已经加入了全局变量$PATH中,直接任意地方执行下面命令即可启动(注意上面的警告⚠,尽量不要在根目录运行)
$ verdaccio
然后我们浏览器打开(IP:4873)即可。。。看不到
这里我们要做一些处理,这里的监听地址为http://localhost:4783/,但是公网上访问需要设置为0.0.0.0:4873首先前往verdaccio配置文件
$ vim ~/.config/verdaccio/config.yaml
#### 加入
listen:
0.0.0.0:4873
修改后保存退出重新运行verdaccio;
如果还是访问不到检查一下防火墙状态将4873端口开启(如果你开启了防火墙那么需要对访问的端口就得加入白名单),当然最简单关了防火墙。。。。不建议
###查看防火墙列表包含的端口列表
$ firewall-cmd --zone=public --list-ports
###开启防火墙 + 查看状态 + 关闭防火墙
$ systemctl start firewalld
$ systemctl status firewalld
$ systemctl stop firewalld
### 添加端口 + 重启防火墙 + 查看端口开启状态
$ firewall-cmd --zone=public --add-port=4873/tcp --permanent
### 添加端口 + 重启防火墙 + 查看端口开启状态
$ firewall-cmd --zone=public --add-port=4873/tcp --permanent
$ firewall-cmd --reload
$ firewall-cmd --zone=public --query-port=80/tcp
现在再输入(IP:4873)即可访问到Verdaccio仓库首页
PM2进程守护
你可能注意到了,每次启动verdaccio后就不能进行其他操作了,,,
所以就有了进程守护这个概念,首先我们先使用node安装pm2
$ npm i -g pm2
$ pm2 start verdaccio
同样的效果,但是不会占用操作板了!!!到这里仓库的搭建已经完成了,下面就是如何将自己的包发到私库中了
nrm源管理
安装nrm
$ npm i nrm -g
查看nrm 源
$nrm ls
添加+删除 私有源(vc 为你自己取得名字,开心就好)
$ nrm add vc http//:xxx.xxx.xxx.xxx:4873/
###当你不想要这个源的时候可以删除
$ nrm del vc
使用私有源
$ nrm use vc
查看当前源
$nrm current
登录VC(私库)
###先看看有没有登录
$ npm whoami
$npm login
...输入用户名 + 密码 + email
(你可以使用你的npm账号密码登录,这个verdaccio好像没有注册一说,纯文本形式)
###项目根目录执行
$npm publish
然后去你的私库上缪一眼
到此,verdaccio搭建到上传已经完成!
详细配置
## 以下的配置都是相对于~/.config/verdaccio/config.yaml 文件位置的
# 上传的私有包存储位置
storage: ./storage
# 插件的位置
plugins: ./plugins
#监听端口
listen:
0.0.0.0:4873
#可视化页面的配置
web:
title: Verdaccio
# comment out to disable gravatar support
# gravatar: false
# by default packages are ordercer ascendant (asc|desc)
# sort_packages: asc#用户信息
auth:
htpasswd:
file: ./htpasswd
# Maximum amount of users allowed to register, defaults to "+inf".
# You can set this to -1 to disable registration.
# max_users: 1000
# 上游服务器,表示如果你的库中没有此文件,可以去其他上游服务器拉取
uplinks:
npmjs:
url: https://registry.npmjs.org/
# 包的配置
packages:
#表示为私有包,只要以@mrlwc-verdaccio开头的包就不会代理到外部
'@mrlwc-verdaccio/*':
# scoped packages
# $all 表示所有人(已注册、未注册)都可以执行对应的操作
# $authenticated 表示只有通过验证的人(已注册)可以执行对应操作,注意,任何人都可以去注册账户。
# $anonymous 表示只有匿名者可以进行对应操作(通常无用)
# 或者也可以指定对应于之前我们配置的用户表 htpasswd 中的一个或多个用户
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
#其他的包 这里的props值是对应于 uplinks 的名称,如果本地不存在,允许去对应的uplinks去取
'**':
# allow all users (including non-authenticated users) to read and
# publish all packages
#
# you can specify usernames/groupnames (depending on your auth plugin)
# and three keywords: "$all", "$anonymous", "$authenticated"
#表示哪一类用户可以对匹配的项目进行安装(install)
access: $all
# allow all known users to publish/publish packages
# (anyone can register by default, remember?)
#表示哪一类用户可以对匹配的项目进行发布(publish)与撤销(unpublish)
publish: $authenticated
unpublish: $authenticated
# if package is not available locally, proxy requests to 'npmjs' registry
proxy: npmjs
# You can specify HTTP/1.1 server keep alive timeout in seconds for incoming connections.
# A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout.
# WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enough.server:
keepAliveTimeout: 60
middlewares:
audit:
nabled: true
# log settingslogs: - { type: stdout, format: pretty, level: http }
#- {type: file, path: verdaccio.log, level: info}
#experiments:
#
# support for npm token command
# token: false
git仓库充当npm私库
个人建议没必要使用这种方法,唯一的优点就是不用自己搭建npm仓库,当你买不起服务器的时候又想自己捣鼓一些东西的时候可以用,不太适合企业级(如果在企业里,我都能开公司了,,,还在乎买个服务器的钱?所以代码肯定是在私有服务器上,肯定要搭建私有代码仓库,我都搭建私有代码库了,还在乎搭建个npm库?)有是不是这个道理嘛,所以,个人觉得有点鸡肋,纯当有这么回事。
创建gitlab私有组
首先登录gitlab(没有的可以先注册,任意一种代码仓库都行)去创建一个组
比如我这里创建了一个组gitstore
然后创建一个新项目
编写库组件
index这里我就简单一点随便写点东西
package.json文件配置
当你拉取仓库的时候什么都没有,首先运行,其他信息自己填
$npm init --scope=你组的名字
完成后去到package.json文件,将private设置为true,可有效防止将包发到公网上
###完成后提交就行
$git add .
$git commit -m "xxx"
$git push
安装依赖
然后随便去到一个项目执行即可安装到这个包
$ npm i -S git+ssh://git@git.lug.ustc.edu.cn:你的组名/你的包名.git
or
$ npm i -S git+https://git.lug.ustc.edu.cn/你的组名/你的包名.git
隐患
使用这种方式安装的包不能够使用npm update
来更新依赖,解决办法可以是你每次提交更新包的时候打上tag标记
$ git tag -a v1.0.1 -m"xxxx"
$ git push origin v1.0.1
然后手动更新你安装此依赖的项目中package.json的tag,然后再执行npm update
cnpm
首先前往cnpm的github地址可以看到cnpm安装的环境要求有两个,这里数据库我选择mysql
1:node版本>=8
2:必须要有数据库
Mysql安装
前往mysql官网,找到下载rpm包的地址,如下:
1:找到yum仓库
2:找到你系统对应的版本
3:复制下载链接
4:在服务器运行wget下载
$ wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
5:通过rpm软件安装
$ rpm -ivh mysql80-community-release-el7-3.noarch.rpm
###RPM常用命令
-i 安装软件包
--nodeps 不验证软件包的依赖
-v 可视化,提供更多的详细信息的输出
-h 显示安装进
--force 强制安装,即使覆盖其他包的文件也要安装
-a 查询所有已经安装的软件包
-f 查询 文件所属于的软件包
-q 查询软件包(通常用来看下还未安装的软件包)
-l 显示软件包的文件列表
-d 显示被标注为文档的文件列表
6:安装mysql-server
$ yum install mysql-server
###检查安装
rpm -qf|grep mysql
7:启动mysql
$ systemctl start mysqld.service
8:初始化mysql
mysql安装后会有一个初始暂时密码在你的/var/log/mysqld.log
文件中,所以我们打开该文件记住初始密码
$ cat /var/log/mysqld.log | grep 'temporary password'
###执行该命令后会出现一个默认密码在尾部
A temporary password is generated for root@localhost: 密码位置
### 进入数据库
$ mysql -uroot -p'xxxxxxxx'
### 修改密码(初始化的反人类密码我想没人愿意记住,另外新密码有强度要求)
$ alter user root@localhost identified by '新密码'
###创建一个npmjs的库
$ create database If Not Exists npmjs Character Set UTF8
cnpm下载
$ git clone https://github.com/cnpm/cnpmjs.org.git
$ cd cnpmjs.org/
$ npm install
#报错就执行这条
$ npm install --unsafe-perm=true --allow-root
导入数据
###在cnpmjs.org目录下进入mysql
> use cnpmjs;
> source docs/db.sql
修改配置文件
$ vim config/index.js
> admin中添加一个用户
> database 字段中配置自己的数据库信息
> scopes 中添加私有包名前缀
> bingingHost 中必须修改为0.0.0.0(不然公网访问不到)
弄完这些后基本仓库已经搭建起来了,,,在cnpm.org文件运行npm run dev
即可(同样可以使用pm2守护进程)如果现在进入浏览器还是访问不到,请检查防火墙,如果一切顺利,输入IP:7002端口就可以看到web端了
测试发布
我们还是使用之前verdaccio的项目,首先切换源(客户机)
###cnpm默认使用7001端口进行传输绑定,7002为web显示
$ nrm add cpm http://xxx.xxx.xxx.xxx:7001/
$nrm use cpm
###将package.json中的包名修改为上面scopeds定义的组开头如(@mrlwc-cpm/xxxx)
$ npm login
...
$ npm publish
然后去7002端口查看是否已存在
好了,到这里三种方式创建私有库基本已经完成!!!
最后:如果你觉得对你有帮助,留下个脚印吧!如果你觉得文章有问题,留下点意见吧!