Verdaccio,cnpm,git仓库搭建企业级私库

3,351 阅读6分钟

       当你发布一个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端口查看是否已存在

好了,到这里三种方式创建私有库基本已经完成!!!

最后:如果你觉得对你有帮助,留下个脚印吧!如果你觉得文章有问题,留下点意见吧!