npm私服搭建
程序员文章站
2022-05-29 18:53:17
...
npm私服搭建
使用cnpm来搭建npm私服
- sinopia虽然也可以,安装简单,不过没有cnpm功能强大。推荐使用cnpm
- cnpm是使用koa的框架搭建的,另外可配置成sqlite、mysql等数据库,sequelize是一个ORM框架,有兴趣可以了解一下相关知识
下载项目
http://github.com/cnpm/cnpm.org,
安装项目所需的依赖包
- 确保你装了node,在当前项目路径下执行
npm install
- 这个步骤可能会出现err(之前在一台机子上遇到过),可以不用管,确保安装了对应的依赖就行
- 可以试一下执行
node dispatch
开启项目,没报错的话还是能用的。
配置相关信息 配置文件在config/index.js
里面
- 服务器相关文件的地址配置,可以不用动
var dataDir = path.join(process.env.HOME || root, '.cnpmjs.org');
- 注释掉
bindingHost
,这个配置是绑定访问的ip地址为127.0.0.1,即是只能本地访问。 -
这里重点是dialect这里,你可以选择用sqlite,也可以用mysql。sqlite是一个零配置的数据库,你可以用navicat来查看里面的数据,sqlite文件在.cnpmjs.org/data.sqlite。
db: 'cnpm',//数据库名称,自己随便定义 username: 'root', password: 'root', // the sql dialect of the database // - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb' dialect: 'mysql',//这里改成mysql // custom host; default: 127.0.0.1 host: '127.0.0.1', // custom port; default: 3306 port: 3306,
- 修改属性
registryHost: '127.0.0.1:7001',
没深究这个属性干嘛的,设置成这样不会错。 -
syncModel
一般设置成exist
,不要设置成none
,不然publish个包都出问题。至于all
最好不要,这个会更新网上仓库所有的包,看了下github issues说:需要1T的空间,数据库数据要40G~syncModel:'exist'
-
enableAbbreviatedMetadata:true
如果不改成true的话sync的时候提示这个要设置成true的。
数据库相关
- 检查你之前config/index.js那里
dialect
的值。- 如果是mysql的话,就建mysql数据库,
db: 'cnpm'
名称就是设置的这个 - 如果是sqlite的话 ,你可以执行
node dispatch
启动服务器,然后在.cnpmjs.org里面会有个data.sqlite文件,我们的sqlite的数据库数据都在这里文件里面,具体可以百度一下sqlite吧
- 如果是mysql的话,就建mysql数据库,
- 最重要的一点,你必须要初始化你的数据库。
你可以拷贝doc/db.sql去初始化mysql或者sqlite数据库
还有一种方法,打开test文件夹,你会看到有个init_db.js文件,对,执行node test/init_db
也可以初始化数据库 - 如果你是mysql数据库,初始化数据库的时候发现报错,可能是你的mysql版本问题导致的,我遇到过的就是utfmb4和复合索引长度问题。如果对sql比较熟的话可以修改一下sql脚本来解决。
- 最后注意个地方,如果你用的是mysql的话,在
common/sequelize
加个配置database.timezone="+08:00"
,不然squelize会默认使用UTC时间,这样入库时间字段gmt_create会少8个小时。sqlite则不需要这样。
启动服务器
- 执行
node dispatch
,其实在linux环境下的话,可以执行npm start
,这个脚本会执行bin/nodejsctl
文件,可以打开看看。 - 这里这个cnpm就搭建起来了,打开浏览器访问
127.0.0.1:7002
可以看到,随便搜索个插件例如gulp
,会发现找不到,这时你可以点击sync,来同步对应的。这里说一点,服务器会把所有对应的插件和依赖的所有版本同步下来。刚开始的时候会等很久,synclog页面可能会出现死掉的情况(具体不知道为什么),不过没关系,服务器有在跑的,跑一两个小时都有可能。我下载一下常用的插件到最后nfs文件夹都10多g了。
发布你自己的包
-
首先npm仓库地址设置成自己的服务器的,或者执行npm的时候加 –registry
npm set registry http://服务器地址:7001
- 发布包的时候不加私有域的话是要登录管理员帐号的,可以查看config/index.js,找到admins属性那些就是管理员了,你可以加上你喜欢的,不过查找数据库user表会发现没有admin等这些管理员,我是自己参考
test/init_db.js
来创建admin的,反正最后数据库user表要存在对应的名称就行。 - 登录
npm login
根据提示即可。注意,发布到共有域要登录管理员 - cd 到你的项目目录没有package.json的还执行
npm init
,然后执行npm publish
即可
注意事项
- window下可以搭建cnpm,不一定linux或centos
- sync的时候不要停掉服务器,不确定会出什么问题,有时候会同步很久,就让服务器挂在那里就好,不要停掉
- 如果
npm publish
提示401或者403错误,请检查你登录的是管理员帐号,确认配置文件和数据库user表有没有对应名称 - 包同步下来后服务器可以离线运行,我公司服务器就是离线环境。我修改了源码做了相关的增量更新机制,这个不复杂,看了下源码,受益良多。
- 服务器可以使用pm2做进程守护,这样不怕别人关我的cmd啦~
最后如果有遗漏或者错误的地方可以提醒我~