为什么要搭建?
npm——我们大家都知道是NodeJS的包管理工具,用于Node插件的管理包括安装、卸载、管理依赖等。
基于npm命令行我们可以快速的安装项目中所依赖的代码模块,甚至可以自己发布一些自己写的插件等。使得我们的项目开发效率得到大大的提升。
发布到npm的模块是开源的,我们只能共享大家都能用的开源模块。
然而,现如今随着业务越来越复杂,项目迭代速度也越来越快,那么项目间的常用业务代码共享变得非常之有必要。而对于公司的业务代码我们当然是不能开源的。这时候就需要搭建一个类似于 http://npmjs.org 平台私有的npm仓库,用于企业里面常用的业务模块,如业务组件的存放和快速安装。
通俗一点来说,我们就是要搭建一个属于企业内部的npm仓库,自己管理包的同时借助npm的命令行工具快速复用业务代码模块或者业务组件。
如何搭建?
业界主流的私有npm仓库搭建的主流方案有如下几种:
付费购买
使用 git+ssh 这种方式直接引用到 GitHub 项目地址
使用 Sinopia
使用 cnpmjs.org
本文将主要讲解第4种。
本地测试环境:
window10
node v8.10.0
npm v5.6.0
mysql v8.0
=======================================
1. 安装或者下载cnpmjs.org
通过npm安装,安装时需要加上版本号,如果没有版本号目前安装的2.19.4。beta版的数据库有16张表,而2.x只有14张表。
npm install -g [email protected]
通过github直接下载cnpmjs.org
https://github.com/cnpm/cnpmjs.org
2. 修改配置
打开配置文件: cnpmjs.org/config/index.js
部分配置说明如下,来自 https://www.colabug.com/2731929.html
/*
* server configure //服务器配置
*/
registryPort: 7001, //仓库访问端口(执行发布安装)
webPort: 7002, //展示查询站点访问端口
bindingHost: '', //监听绑定的 Host,默认127.0.0.1,外网访问注释掉此项即可
/**
* database config //数据库相关设置
*/
database: {
db: 'cnpmjs', //数据库名称
username: 'root', //数据库访问账号
password: '123456', //数据库访问密码
// the sql dialect of the database
// - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb'
dialect: 'mysql', //使用数据库,默认sqlite,这里我们改成mysql
// custom host; default: 127.0.0.1
host: '127.0.0.1', //数据库访问IP,通常127.0.0.1
// custom port; default: 3306
port: 3306, //数据库访问端口,通常3306
// 模块文件存储,默认将发布的私有模块跟缓存公共模块存储在本地文件系统中,路径~/.cnpmjs.org/nfs ,也就是模块文件都存储在这个目录下;或者可以选择三方储存方式比如七牛等,着这里配置插件;也支持接口开发扩展储存;
nfs: require('fs-cnpm')({
dir: path.join(dataDir, 'nfs')
}),
// registry url name //模块注册列表访问域名,默认r.cnpmjs.org,安装模块时会到这个域名下查找,这个默认设置略坑,建议没有外网域名的先清空回头再配
registryHost: '',
// default system admins //默认管理员账号
admins: {
// name: email
//fengmk2: '[email protected]',
admin: '[email protected]',
//dead_horse: '[email protected]',
},
/*
* registry mode config 私有模块发布相关配置
*/
//是否开启私有模式,默认为 false;
//私有模式下只有管理员能发布模块,其他账号只有同步权限
//非私有模式,注册用户都可以发布模块
enablePrivate: false,
// registry scopes
//若为非私有模式发布则此项必填,非管理员发布模块式命名必须以scopes字段开头,模块命名示例“@cnpm/packagename”
//更多了解npm-scope请查阅https://docs.npmjs.com/misc/scope
scopes: [ '@cnpm', '@cnpmtest', '@cnpm-test' ],
// 私有模块非scopes白名单,各种非以scope方式发布的老模块的白名单管理,数组形式维护
privatePackages: [],
/**
* sync configs 同步源仓库相关设置
*/
//npm官方registry地址,不会直接从这个地址同步模块,但有时会从这里获取模块信息,除非必要请勿更改
officialNpmRegistry: 'https://registry.npmjs.com',
officialNpmReplicate: 'https://replicate.npmjs.com',
//同步模块上游registry地址
sourceNpmRegistry: 'https://registry.npm.taobao.org',
//上游registry是否是cnpm,默认true,若要使用npm官方地址作为同步上游,请设置为false
sourceNpmRegistryIsCNpm: true,
//若安装时模块不存在,是否向源registry进行同步,默认true
syncByInstall: true,
// 同步模式选项
// none: 不进行同步,只管理用户上传的私有模块,公共模块直接从上游获取
// exist: 只同步已经存在于数据库的模块
// all: 定时同步所有源registry的模块
syncModel: 'exist', // 'none', 'all', 'exist'
// 同步时间间隔,默认10分钟
syncInterval: '10m',
// 是否同步模块中devDependencies,默认false
syncDevDependencies: false,
//用户账号系统接入,可以扩展接入公司的账号系统
//详见https://github.com/cnpm/cnpmjs.org/wiki/Use-Your-Own-User-Authorization
userService: null,
enableAbbreviatedMetadata: true,
最主要的配置是数据库配置,一般情况下数据库配置正确都可以正常启动。
3. 导入数据库
进入数据库(怎么进自行百度);
创建数据库;
create database cnpmjs;
切换到cnpm数据库
use cnpmjs;
导入cnpm数据库配置文件
文件位于cpm安装目录docs/db.sql下
source docs/db.sql;
查看导入的表
我这个版本共导入16个表
show tables;
- 启动
由于cnpmjs.org本身并不支持window环境,所以在window启动需要修改一些东西
可以直接
node dispatch.js
也可修改package.json
"dev": "DEBUG=cnpm* node dispatch.js"
改为
"dev": "set DEBUG=cnpm* node dispatch.js"
启动后访问 ip:7002 页面如下
- 使用cnpm
安装cnpm
npm i -g cnpm
把cnpm的registry指向我们的私有npm服务ip
cnpm config set registry ip:7001
之后cnpm的使用就与npm一致了,登录、发布包等
问题总结:
在链接数据库的过程中出现了一直连不上的情况,后经查阅资料发现是mysql版本的问题,使用较高版本的mysql会出现验证失败的问题,通过修改一次密码即可解决该问题。
UPDATE mysql.user SET password=PASSWORD('newpassword') WHERE User='root';