基于cnpmjs.org构建企业私有npm库

版权声明:本文为博主原创文章,转载请注明出处。如对文章知识有关问题欢迎评论和右侧chat快问提出。 https://blog.csdn.net/sir1241/article/details/82227648

为什么要搭建?

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张表。

扫描二维码关注公众号,回复: 3951200 查看本文章

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;
  1. 启动
    由于cnpmjs.org本身并不支持window环境,所以在window启动需要修改一些东西

可以直接

node dispatch.js

也可修改package.json

"dev": "DEBUG=cnpm* node dispatch.js" 

改为

"dev": "set DEBUG=cnpm* node dispatch.js" 

启动后访问 ip:7002 页面如下

  1. 使用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';

猜你喜欢

转载自blog.csdn.net/sir1241/article/details/82227648