cnpm
是由淘宝团队开发的企业内部npm私有库,它包含仓库和网站两个部分:
安装基本要求
- node >= 4.3.1
- Databases:支持以下类型
- sqlite3 >= 3.0.2, 默认为
sqlite3
- MySQL >= 0.5.0, 包括
mysqld
和mysql cli
.mysql@5.6.16
是开发者测试过的版本. - MariaDB
- PostgreSQL
1. 处理流程
通过cnpm
我们可以实现同步获取官方包更新,同时内部的包只在内部安装使用,不会被发布到官方地址.
cnpm
官方网络配置如下图所示:
在内部项目中,实际流程大致如下:
1.1. 包安装流程
在cnpm
中通过如下流程处理install
命令:
npm client客户端(npm/yarn/cnpm等)
--------发起install请求-----------
cnpm webiste根据配置处理请求:
a. 当为内部包或cnpm同步的包时 ==> 读取本地同步包数据.
b. 其他情况 ==> 实时查询源数据
当查找到数据 ==> 返回数据
当查找不到数据 ==> 继续下一步
---查找sourceNpmRegistry配置地址---
当查找到数据后,cnpm webiste进行如下处理:
1. 如果有缓存需求,缓存包到本地,并增加同步更新任务.
2. 返回包数据
当没有数据时,返回错误
1.2. 包发布流程
在cnpm
中通过如下流程处理publish
命令:
npm client客户端(npm/yarn/cnpm等)
--------发起publish请求-----------
检测是否为管理员:
a. 是,继续下一步.
b. 否,报错
cnpm webiste根据配置处理请求:
a. 当为配置的scopes或者privatePackages白名单中的包时 ==> 缓存包文件在服务端并存储到数据库中.并返回结果
b. 其他情况 ==> 发布到sourceNpmRegistry配置的地址,进入下一步
--------如果是公开包时------------
查看是否有缓存需求配置,如果有,则缓存包到本地,并增加同步更新任务.同时返回结果
2. 安装
2.1. 安装并启动项目
//1. 进入对应安装目录,拉取git仓库源码
git clone https://github.com/cnpm/cnpmjs.org.git
//2. 修改配置文件(配置文件说明见下)并执行安装任务
make install
//3. 启动任务
npm start
//或
./bin/nodejsctl start
nodejsctl
自带进程管理,你无需使用pm2
(或forever
)监控.
可以使用以下命令进行更多操作
//查看状态
npm run status
//或
./bin/nodejsctl status
//停止服务
npm run stop
//或
./bin/nodejsctl stop
//重启服务
./bin/nodejsctl restart
2.2. 配置项说明
进入./config/index.js
可以修改配置,源项目文件见此,必须配置的项为registryHost
,详细配置说明如下:
- enableCluster:是否开启集群模式
- registryPort:仓库端口,使用客户端访问的端口(配置客户端时使用,详见
3. 客户端配置
) - webPort:网站端口,访问页面的端口(你可以通过
http://服务端IP:端口号
进行访问) - sessionSecret:session秘钥
- jsonLimit:json文件最大限制
- viewCache:web页面浏览缓存
- limit:
koa-limit
中间件配置,限制下载速度. - enableCompress:是否启用gzip压缩
- admins:管理员邮箱配置,控制发布权限.
name: email
形式 - mail:邮件配置,使用Nodemailer
- logoURL:网站LOGO地址
- adBanner:广告图配置
- customReadmeFile:用于替换cnpm自己的readme
- customFooter:自定义底部html文件
- npmClientName:显示在页面中的客户端提示,显示
${name} install package
,效果可参看此处 - packagePageContributorSearch:包页面合作方查询链接
- maxDependencies:在package.json中最多依赖的包数量
- backupFilePrefix:备份地址
- database:数据库配置
db
:数据库名username
:数据库用户名password
:数据库密码dialect
:数据库类型,支持mysql
,sqlite
,postgres
,mariadb
host
:数据库地址port
:数据库端口pool
:线程池配置storage
:存储地址,sqlite
用- downloadRedirectToNFS:加密跳转,如果配置为真,则跳转到
nfs.url(dist.key)
- registryHost:client请求时的包地址(
请改为服务器IP地址
) - enablePrivate:是否开启私有模式
- 开启时:只有管理员能发布,但所有人都能下载安装
- 关闭时:所有人都能发布
- scopes:官方说明见此.配置后,在该scopes列表下的包都会认为是私有包,只对内发布.(如
@cnpm/msnpm-testpackage
) - privatePackages:私有包定义,在该列表下的包也会只对内发布,用于补充scopes的白名单包列表.
- officialNpmRegistry:官方npm库地址
- officialNpmReplicate:官方替代库地址
- sourceNpmRegistry:私有库源地址(用于同步非公共包)
- sourceNpmRegistryIsCNpm:
sourceNpmRegistry
如果是cnpm
的地址时为真 - syncByInstall:如果本地没有,尝试从源地址同步
- syncModel:同步模式,
该配置对私有包没有影响
. none
:不在本地保存,只代理sourceNpmRegistry的包all
:同步所有包exist
:只同步存在的(安装过的)包- syncConcurrency:同步并发量
- syncInterval:同步周期,默认10分钟
- syncPopular:同步热门包,默认关闭.
- syncPopularInterval:同步热门包周期.
- topPopular:同步的数量,默认前100
- syncDevDependencies:是否同步开发依赖
- syncChangesStream:不明用途
- handleSyncRegistry:同上
- httpProxy:http代理,当在防火前后需要代理时配置,如
httpProxy: 'http://proxy.mycompany.com:8080'
3. 客户端配置
使用客户端进行如下配置即可开始使用私有库.
npm: npm config set registry "http://私有库地址:registryPort端口"
yarn: yarn config set registry "http://私有库地址:registryPort端口"
cnpm: cnpm config set registry "http://私有库地址:registryPort端口"
附带仓库地址备份,帮助还原配置
淘宝仓库:"https://registry.npm.taobao.org"
官方仓库: "https://registry.npmjs.org"