用sinopia在linux系统中搭建npm私有库

公司对于搭建本地私有npm库有如下要求:
  1. 私有包托管在内部服务器中
  2. 项目中使用了公共仓库上的公共包,也使用了内部服务器上的私有包
  3. 希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库
  4. 服务器硬盘有限,希望只缓存下载过的包,而不是全部同步
  5. 对于下载,发布npm包有对应的权限管理,安装方便,配置简单,依赖少
sinopia

sinopia是一个零配置带缓存的npm包管理工具,符合上述要求

安装过程及遇到的问题解决

安装环境:
ubuntu 16.04LTS
node 7.8.0
npm 4.2.0

安装配置node及npm

从官网下载https://nodejs.org/en/download/current/ 下载最新二进制压缩包node-v7.8.0-linux-x64.tar.xz


放到当前用户下面的目录,并解压

$ tar xvJf node-v7.8.0-linux-x64.tar.xz

进入bin目录

$ cd bin
$ ./node -v
v7.8.0

说明nodejs已经安装成功,为了方便执行命令,需要配置环境变量

$ sudo vi /etc/profile

在文件底部插入,保存

PATH=$PATH:/{prefix}/node-v7.8.0-linux-x64/bin

使之生效

$ source /etc/profile

这样就可以在所有位置输入命令,验证node及npm安装成功

$ node -v
v7.8.0
$ npm -v
v4.2.0

可以先配置下npm的源地址

$ npm set registry https://registry.npm.taobao.org/ # 推荐淘宝npm镜像
安装配置sinopia
$ npm install -g sinopia

安装完成,启动

$ sinopia
warn --- config file - /home/{user}/.config/sinopia/config.yaml
warn --- http address - http://localhost:4873/

上面信息第一行是生成的配置文件,第二行是默认地址,浏览器打开可看到



配置文件能完成如下等功能:

  • 设置包存放路径
  • 设置用户信息文件路径及数量
  • 设置上游地址
  • 设置包发布、安装权限
  • 设置监听地址

配置文件config.yaml如下:

#
# This is the default config file. It allows all users to do anything,
# so don't use it on production systems.
#
# Look here for more config file examples:
# https://github.com/rlidwka/sinopia/tree/master/conf
#

# path to a directory with all packages
storage: /home/{user}/.local/share/sinopia/storage # 库存路径,需要考虑磁盘空间

web: # 自定义web项,即浏览器访问页面
  # web interface is disabled by default in 0.x, will be enabled soon in 1.x
  # when all its issues will be fixed
  #
  # set this to `true` if you want to experiment with web ui now;
  # this has a lot of issues, e.g. no auth yet, so use at your own risk
  #enable: true

  title: Sinopia
  # logo: logo.png
  # template: custom.hbs

auth:
  htpasswd:
    file: ./htpasswd # 添加用户(npm adduser)后自动创建,保存用户信息,可以初始化用户
    # Maximum amount of users allowed to register, defaults to "+inf".
    # You can set this to -1 to disable registration.
    #max_users: 1000 # 设置为-1不能npm adduser

# a list of other known repositories we can talk to
uplinks: # 可以配置多个上游地址,后面packages中的proxy指定用哪个
  npmjs:
    url: https://registry.npm.taobao.org/ # 更改此上游地址
    # amount of time to wait for repository to respond
    # before giving up and use the local cached copy
    #timeout: 30s # 请求上游地址超时时间

    # maximum time in which data is considered up to date
    #
    # default is 2 minutes, so server won't request the same data from
    # uplink if a similar request was made less than 2 minutes ago
    #maxage: 2m # 包过期时间

    # if two subsequent requests fail, no further requests will be sent to
    # this uplink for five minutes
    #max_fails: 2 # 容许依赖请求最大失败数
    #fail_timeout: 5m # 依赖请求超时时间

packages: # 包的权限管理,$all为所有人,$authenticated为通过验证人
                  # 分布和安装两种权限,值可以特指某几人
  '@*/*': # 跟package.json中的name属性进行匹配
    # scoped packages
    access: $all
    publish: $authenticated

  '*':
    # allow all users (including non-authenticated users) to read and
    # publish all packages
    #
    # you can specify usernames/groupnames (depending on your auth plugin)
    # and three keywords: "$all", "$anonymous", "$authenticated"
    access: $all

    # allow all known users to publish packages
    # (anyone can register by default, remember?)
    publish: $authenticated

    # if package is not available locally, proxy requests to 'npmjs' registry
    proxy: npmjs

# log settings
logs:
  - {type: stdout, format: pretty, level: http}
  #- {type: file, path: sinopia.log, level: info}

listen: 0.0.0.0:4873 # 设置监听地址,0.0.0.0匹配本机地址

# if you use nginx with custom path, use this to override links
#url_prefix: https://dev.company.local/sinopia/
# Configure HTTPS, it is required if you use "https" protocol above.
#https:
#  key: path/to/server.key
#  cert: path/to/server.crt
# you can specify proxy used with all requests in wget-like manner here
# (or set up ENV variables with the same name)
#http_proxy: http://something.local/ # 设置代理服务器
#https_proxy: https://something.local/
#no_proxy: localhost,127.0.0.1

# maximum size of uploaded json document
# increase it if you have "request entity too large" errors
#max_body_size: 1mb # http请求body大小

修改uplinks及listen值,同上,重启sinopia
如果想引用别的配置文件,请通过sinopia -c <配置文件>指定
最后更改npm源地址为私有库地址

$ npm set registry http://{服务器ip}:4873/ # 内网测试可行(外网暂无条件测试)
用pm2托管sinopia

上面方式启动sinopia只是暂时的,退出命令行就没有了,因此需要一个长期开启sinopia方案,通过pm2托管,可以让sinopia进程永远活着,就算意外挂了也可自动重启。
安装pm2

$ npm install -g pm2

安装完后,使用pm2启动sinopia

$ pm2 start sinopia
[PM2] Spawning PM2 daemon with pm2_home=/home/{user}/.pm2
[PM2] PM2 Successfully daemonized
...
[PM2] Done.

pm2提供开机自启动功能

$ pm2 startup ubuntu # 或centos,看具体环境

将图片红圈内容复制运行



最后保存配置信息

$ pm2 save

到此为止,居于sinopia的npm私有库搭建完成了,当下次启动linux时,npm私有库已经自动运行了

客户端操作

nrm的使用

nrm是个方便的npm源管理工具,来做快速registry切换,可选

$ npm install -g nrm
$ nrm ls
  npm ---- https://registry.npmjs.org/
  cnpm --- http://r.cnpmjs.org/
  taobao - https://registry.npm.taobao.org/
  nj ----- https://registry.nodejitsu.com/
  rednpm - http://registry.mirror.cqupt.edu.cn/
  npmMirror  https://skimdb.npmjs.com/registry/
  edunpm - http://registry.enpmjs.org/

加入新创建的私有库地址,并切换

$ nrm add xgnpm http://{ip}:{port}/
$ nrm use xgnpm
创建npm用户

在发布包之前,一般需要创建用户

$ npm adduser # 注册,根据提示创建完成
$ npm login

创建用户后,默认会在配置文件同级目录生成htpasswd,保存用户信息

发布

简单创建一个npm包

$ mkdir publishtest
$ cd publishtest
$ npm init
$ vi index.js
$ ls
index.js  package.json
$ npm publish

打开浏览器,发现这个包已经上传至服务器



再看看这个包的实际路径

若要取消发布,执行

$ npm unpublish
升级

要升级包,只需更改package.json的version属性,version要比原来的大才行

安装

安装会先找本地有无该包,没有的话从上游地址下载,然后保存到storage中,下次安装直接从本地获取

$ npm install publishtest01

会生成node_modules,里面就是刚才发布的包

补充:windows下安装sinopia

windows环境中基本与linux下相同,但可能会遇到几个问题

  1. 需要安装python2.7
    下载安装python2.7,配置环境变量PATH,npm config set python python2.7
  2. MSBuild版本不对
    安装Visual Studio Express 2013 for Windows Desktop可以解决
  3. 安装sinopia时出现错误
    crypt3跟fs-ext模块安装错误可以忽略,windows不支持
  4. windows下pm2无效,用nssm来开启服务
    下载nssm,解压,命令行运行nssm install sinopia,跳出对话框,输入配置
  • path: node
  • startup directory: C:\Users\Administrator\AppData\Roaming\npm\node_modules\sinopia
  • arguments: C:\Users\Administrator\AppData\Roaming\npm\node_modules\sinopia\lib\cli.js -c C:\Users\Administrator.config\sinopia\config.yaml

然后按install service按钮,最后在命令行运行sc start sinopia,服务自动开启

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容