欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

npm私服搭建

程序员文章站 2022-05-29 18:53:17
...

npm私服搭建

使用cnpm来搭建npm私服

  1. sinopia虽然也可以,安装简单,不过没有cnpm功能强大。推荐使用cnpm
  2. cnpm是使用koa的框架搭建的,另外可配置成sqlite、mysql等数据库,sequelize是一个ORM框架,有兴趣可以了解一下相关知识

下载项目

http://github.com/cnpm/cnpm.org,

安装项目所需的依赖包

  • 确保你装了node,在当前项目路径下执行 npm install
  • 这个步骤可能会出现err(之前在一台机子上遇到过),可以不用管,确保安装了对应的依赖就行
  • 可以试一下执行 node dispatch 开启项目,没报错的话还是能用的。

配置相关信息 配置文件在config/index.js里面

  1. 服务器相关文件的地址配置,可以不用动
    var dataDir = path.join(process.env.HOME || root, '.cnpmjs.org');
  2. 注释掉bindingHost,这个配置是绑定访问的ip地址为127.0.0.1,即是只能本地访问。
  3. 这里重点是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,
  4. 修改属性registryHost: '127.0.0.1:7001',没深究这个属性干嘛的,设置成这样不会错。
  5. syncModel一般设置成exist,不要设置成none,不然publish个包都出问题。至于all最好不要,这个会更新网上仓库所有的包,看了下github issues说:需要1T的空间,数据库数据要40G~
    syncModel:'exist'
  6. enableAbbreviatedMetadata:true如果不改成true的话sync的时候提示这个要设置成true的。

数据库相关

  1. 检查你之前config/index.js那里dialect的值。
    • 如果是mysql的话,就建mysql数据库,db: 'cnpm'名称就是设置的这个
    • 如果是sqlite的话 ,你可以执行node dispatch启动服务器,然后在.cnpmjs.org里面会有个data.sqlite文件,我们的sqlite的数据库数据都在这里文件里面,具体可以百度一下sqlite吧
  2. 最重要的一点,你必须要初始化你的数据库。
    你可以拷贝doc/db.sql去初始化mysql或者sqlite数据库
    还有一种方法,打开test文件夹,你会看到有个init_db.js文件,对,执行node test/init_db也可以初始化数据库
  3. 如果你是mysql数据库,初始化数据库的时候发现报错,可能是你的mysql版本问题导致的,我遇到过的就是utfmb4和复合索引长度问题。如果对sql比较熟的话可以修改一下sql脚本来解决。
  4. 最后注意个地方,如果你用的是mysql的话,在common/sequelize加个配置database.timezone="+08:00",不然squelize会默认使用UTC时间,这样入库时间字段gmt_create会少8个小时。sqlite则不需要这样。

启动服务器

  1. 执行node dispatch,其实在linux环境下的话,可以执行npm start,这个脚本会执行bin/nodejsctl文件,可以打开看看。
  2. 这里这个cnpm就搭建起来了,打开浏览器访问127.0.0.1:7002可以看到,随便搜索个插件例如gulp,会发现找不到,这时你可以点击sync,来同步对应的。这里说一点,服务器会把所有对应的插件和依赖的所有版本同步下来。刚开始的时候会等很久,synclog页面可能会出现死掉的情况(具体不知道为什么),不过没关系,服务器有在跑的,跑一两个小时都有可能。我下载一下常用的插件到最后nfs文件夹都10多g了。

发布你自己的包

  1. 首先npm仓库地址设置成自己的服务器的,或者执行npm的时候加 –registry

    npm set registry http://服务器地址:7001
    
  2. 发布包的时候不加私有域的话是要登录管理员帐号的,可以查看config/index.js,找到admins属性那些就是管理员了,你可以加上你喜欢的,不过查找数据库user表会发现没有admin等这些管理员,我是自己参考test/init_db.js来创建admin的,反正最后数据库user表要存在对应的名称就行。
  3. 登录npm login根据提示即可。注意,发布到共有域要登录管理员
  4. cd 到你的项目目录没有package.json的还执行npm init,然后执行npm publish即可

注意事项

  1. window下可以搭建cnpm,不一定linux或centos
  2. sync的时候不要停掉服务器,不确定会出什么问题,有时候会同步很久,就让服务器挂在那里就好,不要停掉
  3. 如果npm publish提示401或者403错误,请检查你登录的是管理员帐号,确认配置文件和数据库user表有没有对应名称
  4. 包同步下来后服务器可以离线运行,我公司服务器就是离线环境。我修改了源码做了相关的增量更新机制,这个不复杂,看了下源码,受益良多。
  5. 服务器可以使用pm2做进程守护,这样不怕别人关我的cmd啦~

最后如果有遗漏或者错误的地方可以提醒我~