有一点规模的团队,都需要逐渐构建自己的npm包。现在有一个比较好的解决方案Sinopia,可以快速搭建和部署私有的npm服务器。

本文详细记录了我在搭建私有npm包时,遇到的问题,以及个人的思考。

1. 安装Sinopia

安装

首先,你要自己配置nodejs及npm的环境,然后运行

npm install -g sinopia

启动

$ sinopiawarn  --- config file  - .....\AppData\Roaming\sinopia\config.yamlwarn  --- http address - http://localhost:4873/

然后打开:http://localhost:4873/

连接中的文档已经写的很详细了,我就不重复造轮子了。

安装Sinopia

深坑预警

后来我们把私有仓库改为了verdaccio,因为sinoipa不支持包命名空间,详情请见下文。

3、搭建好私有npm仓库后遇到什么坑?

我发现使用nrm切换到私有npm仓库对应的源后,下载带@ 符号的包都下载失败,比如下载 @angular/core,就会下载失败,这是为什么呢,查阅了一些资料,发现这其实是Sinopia自己的bug,bug产生的原因就是:sinopia在代理到npmjs.org公有库时将@符号转码为%40,致使在公有库中找不到对应的包,返回404 ,简单点说就是 @angular/core 代理请求的时候被转换成了 %40angular/core,所以我们需要在代理请求发出之前将其转回 @angular/core

4、如何解决?

修改sinopia源码:修改位于sinopia/lib/up-storage.js文件第10行:将var encode = encodeURIComponen;,更改为:var encode = function(thing) {return encodeURIComponent(thing).replace(/^%40/, ‘@’);}; ,这段代码的含义就是将%40转回@,于是就解决了不能下载带有@符号的npm包的bug

5、更好的解决方案?

由于sinopia的作者已于二年前停止对sinopia的维护和升级,所以出来了一个sinopia的fork,名字叫做Verdaccio,然后由Verdaccio继续对sinopia进行更新和维护,具体如何使用Verdaccio来构建私有npm服务器,请见Verdaccio的github介绍

参考文档

2. 构建过程中遇到的问题:

2.1. 外网无法访问私有sinopia服务器

[root@webteam sysconfig]# systemctl stop firewalld.service
[root@webteam sysconfig]# systemctl start firewalld.service
[root@webteam sysconfig]# firewall-cmd --permanent --add-port=4873/tcp
success
[root@webteam sysconfig]# firewall-cmd --reload
success
[root@webteam sysconfig]# 

参考文档

2.2. 开机自启动

ascs@webteam sinopia]$ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/ascs/.pm2/dump.pm2
[ascs@webteam .pm2]$ pm2 startup centos
[PM2] Init System found: systemd
-----------------------------------------------------------PM2 detected systemd but you precised centosPlease verify that your choice is indeed your init systemIf you arent sure, just run : pm2 startup
-----------------------------------------------------------
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup centos -u ascs --hp /home/ascs
[ascs@webteam .pm2]$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup centos -u ascs --hp /home/ascsWe trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:#1) Respect the privacy of others.#2) Think before you type.#3) With great power comes great responsibility.[sudo] password for ascs: 

2.3. 关于添加用户失败的问题

$ npm adduser
Username: webteam
Password:
Email: (this IS public) (yueshenghu@ascs.tech)
npm ERR! code E500
npm ERR! Internal Server Errornpm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2018-05-08T13_17_14_767Z-debug.log

这个问题,在查看sinopia服务器之后,我发现是Linux目录权限问题。

[ascs@webteam sinopia]$ sinopiawarn  --- config file  - /usr/share/nginx/html/sinopia/config.yamlwarn  --- http address - http://0.0.0.0:4873/error --- unexpected error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/htpasswd'
Error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/htpasswd'at Error (native)http  <-- 500, user: undefined, req: 'PUT /-/user/org.couchdb.user:webteam', error: internal server errorerror --- unexpected error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/htpasswd'
Error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/htpasswd'at Error (native)http  <-- 500, user: undefined, req: 'PUT /-/user/org.couchdb.user:webteam', error: internal server error
^C

那么怎么解决这个问题呢?

仔细查看Linux提示的错误,考虑远程向sinopia服务添加用户的时候,也是向linux目录下写文件的时候,这个时候的文件夹,如果没有其他用户的写权限,那么是没有办法写入的。所以就会报错。

解决方法:

进入sinopia的父级目录,然后将sinopia目录的权限提升。

[ascs@webteam sinopia]$ cd ..
[ascs@webteam html]$ su
密码:
[root@webteam html]# chmod 757 sinopia/
[root@webteam html]# ls -al
总用量 20
drwxrwxr-x+ 19 root root 4096 5月   8 14:17 .
drwxr-xr-x.  3 root root   18 4月   3 14:22 ..
-rw-rwxr--+  1 root root  537 5月   3 16:40 50x.html
drwxr-xrwx   3 root root   40 5月   4 19:57 sinopia

2.4. 关于发布包失败的问题

解决了添加用户失败的问题,结果发布包又出了问题,为什么呢?

$ npm publish
npm ERR! Unexpected token u in JSON at position 0npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2018-05-08T13_41_42_751Z-debug.log

查看sinopia的日志

/home/ascs/.pm2/logs/sinopia-error-1.log last 15 lines:
1|sinopia  | Error: EACCES: permission denied, open '/usr/share/nginx/html/sinopia/storage/.sinopia-db.json'
1|sinopia  |     at Error (native)
1|sinopia  |     at Object.fs.openSync (fs.js:642:18)
1|sinopia  |     at Object.fs.writeFileSync (fs.js:1348:33)
1|sinopia  |     at LocalData.sync (/usr/lib/node_modules/sinopia/lib/local-data.js:42:6)
1|sinopia  |     at LocalData.add (/usr/lib/node_modules/sinopia/lib/local-data.js:20:10)
1|sinopia  |     at updater (/usr/lib/node_modules/sinopia/lib/local-storage.js:251:27)
1|sinopia  |     at /usr/lib/node_modules/sinopia/lib/local-storage.js:582:5
1|sinopia  |     at /usr/lib/node_modules/sinopia/lib/local-fs.js:248:8
1|sinopia  |     at callback (/usr/lib/node_modules/sinopia/lib/local-fs.js:197:19)
1|sinopia  |     at onRead (/usr/lib/node_modules/sinopia/lib/local-fs.js:214:9)

没错,又碰上了权限问题。老办法,给.sinopia-db.json添加些权限。

切换到root权限,然后给文件授权。

简单粗暴的给了777,看官如果你要部署在公网上,请慎重哟。

[root@webteam storage]# chmod 777 .sinopia-db.json
[root@webteam storage]#
[root@webteam storage]# ls -al
总用量 4
drwxrwxrwx 3 root root  52 5月   8 21:55 .
drwxr-xrwx 3 root root  56 5月   8 21:37 ..
drwxrwxr-x 2 ascs ascs  90 5月   8 21:55 cityworks3d_cm
-rwxrwxrwx 1 root root 103 5月   8 21:55 .sinopia-db.json

再次发布,成功!

$ npm publish
+ cityworks3d_cm@1.0.0

3. 随之而来的问题:

3.1. npm的命名空间问题

如果因为你起的包名与现有的包名太相近而被阻止发布这个包,那么找到一个独一无二包名最简单方法就是使用你的作用域。你可以使用@+你的npm用户名加在包名前面将包划到你的npm账户作用域下。比如,我的npm用户名是ceejbot,所以我的作用域是@ceejbot。

在你自己的作用域下发布一个包是免费的!你可以这样去做:

我已经知道json-stream与现有包名太接近了,所以我需要找到一个新的名字。首先,我需要编辑我的package.json文件,添加我的npm账户名来划分一个作用域,所以:

{"name": "json-stream"
}

修改为:

{"name": "@ceejbot/json-stream"
}

然后我要发布这个包。被划了作用域的包默认是私有的,所以要通过—access=public 让它变为公有的包:

> npm publish --access=public
+ @ceejbot/json-stream@1.0.0

每个人都可以向npm注册表中发布公共的作用域包,但是你想发布私有的包就要付费订阅了。

参考文章

3.2. 生产环境中的使用

3.2.1. 容器部署

最佳实践是将sinopia作为单独服务部署在docker容器中

在此我制作了一个可以直接使用的Docker Image启动容器则自动开启服务, pm2将会守护sinopia进程

3.2.2. 版本控制

将sinopia作为公司内部npm库还存在几个问题

使用npm publish上传的流程无法统一管理, 也就是无法持续集成/code review
每个版本的更新信息完全依靠文档, 无法通过code diff追溯
以gitlab为例, 我的做法是

 将ci runner的服务器切换至私有源, 使用npm adduser注册一个root用户

在sinopia服务器上将sinopia/config.yaml中的max-users设置为-1, 禁止注册与私自更新版本
将node库源代码在gitlab中创建项目 提交代码走PR流程
ci.yml中, build环境处理lint, unit test, production build等流程,tag环境npm publish提交版本, 保持gitlab与npm版本一致
邮件通知各组成员 库版本更新信息
3.2.3. 团队使用

团队所有成员切换npm至私有库

推荐使用nrm库 可以方便的切换npm源

nrm add private http://localhost:4873 # 添加源管理nrm ls # 查看源列表nrm use private # 切换至该源npm install @scope/package-name@version --save-dev #

其它操作与npm公用库相同

参考文章

4. 补充说明

4.1. NRM常用命令

nrm最常有的命令有 :
1.nrm ls 查看已有的源
2.nrm add <源名称> <源地址> 新增源
3.nrm use <源名称>切换到现有的源
4.nrm test  测速

4.2. 使用npm安装包

使用 npm –save 标志下载一个包


常规: npm install pkg, 快捷方式: npm i pkg.常规: npm i --global pkg, 快捷方式: npm i -g pkg.(全局安装一个包)常规: npm i --save pkg, 快捷方式: npm i -S pkg`.(安装一个项目依赖包,写进dependence)常规: npm i --save-dev pkg, 快捷方式: npm i -D pkg`.(全局安装一个项目开发依赖包,写进devDependence)

举个栗子:

npm install lodash --save

这将会在下载包文件之前修改 package.json 文件的依赖关系字段。现在打开刚才创建的 package.json 文件我们会发现多了个 dependencies 字段。

构建前端团队的私有npm仓库相关推荐

  1. 如何搭建私有NPM仓库,私有NPM仓库搭建教程

    1 前言 npm 是日常前端开发过程中离不开的包管理工具,可以帮助我们快速安装 npm 仓库中优秀的第三方代码包,它的出现极大地促进了 Node 及前端生态的发展繁荣. 那么问题来了,为什么要搭建私有 ...

  2. 如何搭建一个私有npm仓库

    业界主流的私有npm仓库搭建的主流方案有如下几种: 付费购买 使用 git+ssh 这种方式直接引用到 GitHub 项目地址 使用 Sinopia 使用 cnpmjs.org 第一种,一是考虑到公司 ...

  3. 在5分钟内搭建企业内部私有npm仓库

    下面通过三种方法来搭建公司私有npm仓库,每种方式都有自己的优势. Node.js >= 6.11.3,我的Node版本:node v8.2.1 Linux or OSX,我的系统版本:Cent ...

  4. 使用verdaccio搭建私有npm仓库

    verdacico官网 https://verdaccio.org/zh-CN/docs/setup-npm verdacico安装前准备 确保电脑已安装node.js 步骤一:输入node -v 验 ...

  5. 生鲜 B2B 技术平台的前端团队该如何搭建

    此文写于 1 年前,转载至此,大家可以加 Scott 微信: codingdream 成为朋友圈的朋友,聊南聊北,哈哈哈. ![图片描述][1] 线下越重,线上需要越轻,这个轻指的是轻便轻巧和简洁易用 ...

  6. 搭建前端私有npm杂记

    随着前端队伍越来越壮大,项目间共享代码就变得尤为重要.常用的框架/类库没必要在每个项目都放一份,团队内部产出的公共模块也需要有合理的共享机制.现在,用npm管理前端代码已经是业界趋势.楼主尝试用私有n ...

  7. 多个 本地仓库_【运维工具】搭建npm私有镜像仓库,天下苦于npm build久矣

    ​01 前 言 当你的研发团队越来越大,或是你无法忍受node超慢的构建时你可以考虑继续读下去,给大家推荐一个基于Verdaccio相对较完整的解决方案. 由于环境的原因,我们直接去 http://n ...

  8. 前端基建——前端团队技术构建方向指引

    文章目录 前言 一.前端基建内容概括 1.1 前端规范文档 1.2 前端脚手架 1.3 前端项目模板 1.4 前端组件库 前言 在一个前端团队中,构建好前端团队的基建工程,一方面是在个人业绩上能有点亮 ...

  9. 前端团队研发效能提升的探索与实践

    读者受益 研发效能定义:知道研发效能是什么?(对「研发效能」的定义有一个经得起推敲的参考) 研发效能提升:知道如何提升技术团队的研发效能?(对提升自己所在团队研发效能有一些想法/灵感) 技术的价值:当 ...

最新文章

  1. 真香!Vision Transformer 快速实现 Mnist 识别
  2. 网站推广过程中如遇网站降权应从网站推广中哪些细节着手分析?
  3. Android Binder Driver缺陷导致定屏问题分析
  4. 二月1500-1999元性价比排行榜:前三都是魅族手机
  5. mysql中的select into 与insert into语句用于备份数据
  6. 计算机学院李成伟,【迎新专题二】校长李成伟带队视察迎新工作
  7. 如何在App中实现朋友圈功能之一朋友圈实现原理浅析——箭扣科技Arrownock
  8. 华硕计算机u盘启动不了怎么办,华硕笔记本、台式机无法从U盘启动安装系统的终极解决办法-网络教程与技术 -亦是美网络...
  9. 任意文件读取与下载漏洞
  10. 微信小程序ios地图标记点无法点击第二次 markertap
  11. 天使轮,种子,A轮,B轮,C轮,Pre-IPO
  12. 产品设计中的五个层次需求,你知道吗?
  13. Kubernetes 进阶训练营 Pod基础
  14. 塔式和机架式它们到是什么?有什么区别?
  15. 王者荣耀选手退役后转行程序员,自学的那种!网友:中国版“阿甘”
  16. 【沐风老师】3dMax一键生成石头插件使用教程
  17. 如何配置使用 Log4j
  18. tensorflow2.1,CUDA10.1 的 WIN10下安装
  19. mysql移植海思_nniefacelib是一个在海思35xx系列芯片上运行的人脸算法库
  20. SQL语句压缩数据库

热门文章

  1. w7鼠标计算机无法识别,win7系统下usb鼠标无法识别的解决方法
  2. 【概率图与随机过程】09 探索EM公式的底层逻辑与由来
  3. python算公倍数的案例_【71页】关于python经典的80个案例操作(附源码解析)
  4. ppt取色器怎么取外面的颜色
  5. 基因数据处理120之scala调用SSW在linux下运行
  6. 地下城php补丁怎么用,地下城与勇士补丁用途及其使用方法详解
  7. C语言产生随机数并写入文件中
  8. python内存的回收机制_Python 内存管理以及垃圾回收机制
  9. 这个情人节如何过得不一样?快来看哪个国家才是全球浪漫目的地 | 美通社头条...
  10. CCAI中国人工智能大会活动第一天报道