写在前面

为什么要学会搭建npm私有库

答:

  • npm私有库只针对公司内部局域网开放,不对外部公开,具有一定的保密性
  • 速度比在直接在npm下载更快,甚至是比淘宝源更快。因为毕竟是在公司局域网
  • 对于发布和下载npm包配置权限管理
  • 私有库能够将包资源进行缓存,响应的话会加快下载速度
  • 搭建npm私有库算作对团队的一个技术亮点

verdaccio

verdaccionodejs 创建的轻量的私有npm proxy registryfrokedsinopia@1.4.0 ,是一个开源的npm私有库的搭建工具,可以搭建一套属于自己公司的npm仓库。

  • yarn 、npm 和pnmp 100%兼容
  • 提供的DockerKubernetes支持,很容易安装和使用
  • 发布的包是私有和配置访问权限
  • verdaccio是需要缓存所有相关项,并且在本地或者私有网络下可以加速安装

搭建过程

  1. 下载之前保证您的node版本>v8.x npm版本>v5.x
  2. yarn>v1.x pnpm>v2.x web应用支持浏览器
  3. ChromeFirefoxEdgeIE11以上

安装verdaccio

  1. //在cmd输入
  2. npm install -g verdaccio //npm下载
  3. yarn global add verdaccio //yarn下载 用yarn下载的时候 verdaccio运行不起来的时候请换成npm下载
  4. //或者nrm切换下源地址 要是报权限错误的话,请选择cmd<以管理员身份运行>在输入一次
  5. //或者在cmd输入下面的命令:
  6. npm install -g verdaccio --unsafe-perm
  7. //--unsafe-perm添加上是为了防止报 gyp ERR! permission denied 的权限问题
  8. //下载完成后会有红色字体表示:表示没有python的环境,这个时候不需要理会。
  9. //在cmd输入:verdaccio 执行效果如下:

image.png

配置信息

config.yaml文件的配置信息

  1. #
  2. # 这是默认的配置文件. 它会允许我们做任何事情,
  3. # 所以不要在生产环境(系统)使用它.
  4. #
  5. # 在这里可以看见更多的配置示例:
  6. # https://github.com/verdaccio/verdaccio/tree/master/conf
  7. #
  8. # 包含所有包的目录路径,npm私服包的存放目录以及缓存地址
  9. storage: ./storage
  10. # 包含plugins的目录路径,默认插件的文件位置,一般只对docker部署有关系
  11. plugins: ./plugins
  12. web: #verdaccio的界面
  13. title: Verdaccio
  14. # comment out to disable gravatar support 注释掉gravatar禁止使用
  15. # gravatar: false
  16. # by default packages are ordercer ascendant (asc|desc) 默认的packages是准备好的两个选择
  17. # sort_packages: asc
  18. # convert your UI to the dark side 用户界面是黑夜模式
  19. # darkMode: true
  20. # translate your registry, api i18n not available yet 看看下你的注册表,i18n api还不能使用
  21. # i18n:
  22. # list of the available translations 查看可以使用的注册列表的地址:https://github.com/verdaccio/ui/tree/master/i18n/translations
  23. # web: en-US
  24. auth:
  25. htpasswd:
  26. file: ./htpasswd #保存用户的账号信息比如用户名,密码等,还没有注册或者登录的话暂时看不到
  27. # Maximum amount of users allowed to register, defaults to "+inf".允许注册的最大用户数量,可以是无穷大
  28. # You can set this to -1 to disable registration. 你可以设置-1去禁止用户通过 npm adduser 去注册
  29. # max_users: 1000 #默认注册人数最大数量是1000
  30. # a list of other known repositories we can talk to 我们需要了解其他相关有名的存储库
  31. uplinks: #配置上游的npm服务器,主要用于请求的库不存在时可以去到上游服务器去获取,可以多配置下上游链路的链接
  32. npmjs:
  33. url: https://registry.npmjs.org/
  34. agent_options: #代理的配置项
  35. keepAlive: true
  36. maxSockets: 40
  37. maxFreeSockets: 10
  38. packages: # 配置模块,access访问下载权限,pushlish包的发布权限
  39. '@*/*': # 一种是@/表示某下面所属的某项目,关键字匹配
  40. # scoped packages 配置权限管理
  41. access: $all # 表示哪一类用户可以对匹配的项目进行安装(install)和查看包的信息
  42. publish: $authenticated # 表示哪一类用户可以对匹配的项目进行发布(publish)
  43. unpublish: $authenticated # 表示哪一类用户可以对匹配的项目进行卸载(publish)
  44. proxy: npmjs # 这里的值是对应于 uplinks 的名称,如果本地不存在,允许去对应的uplinks去拉取
  45. '**': # 另一种是*匹配项目名称(名称在package.json中有定义)
  46. # allow all users (including non-authenticated users) to read and
  47. # publish all packages
  48. # 允许所有用户(包括未经身份验证的用户)读取和发布所有包
  49. # you can specify usernames/groupnames (depending on your auth plugin) 您可以指定用户名/组织名称(取决于验证身份的插件)
  50. # and three keywords: "$all", "$anonymous", "$authenticated" 三个关键字:所有的,匿名的,验证过的 也可以使用具体的用户名或者组织名称(公司私有的名字)和配置的用户表 htpasswd 有关
  51. access: $all
  52. # allow all known users to publish/publish packages 允许所有用户去发布包
  53. # (anyone can register by default, remember?) 任何人都可以默认注册
  54. publish: $authenticated
  55. unpublish: $authenticated
  56. # if package is not available locally, proxy requests to 'npmjs' registry 如果包不允许在本机使用,可以用proxy请求npmjs注册表的代理
  57. proxy: npmjs
  58. # You can specify HTTP/1.1 server keep alive timeout in seconds for incoming connections. 传入的指定连接的HTTP/1.1服务器保持活跃状态直到超时,以秒为单位
  59. # A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout. 值为0的时候的服务表现行为和8.0.0之前版本的nodejs链接的时候没有保持活跃状态导致超时
  60. # WORKAROUND: Through given configuration you can workaround following issue 解决办法:通过已知的配置,你可以解决这些问题: https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enough. 如果60不够的话可以设置为0
  61. server:
  62. keepAliveTimeout: 60
  63. middlewares:
  64. audit:
  65. enabled: true
  66. # log settings 设置日志
  67. logs:
  68. - { type: stdout, format: pretty, level: http }
  69. #- {type: file, path: verdaccio.log, level: info}
  70. #experiments: 实验性的
  71. # # support for npm token command 支持npmtoken令牌
  72. # token: false
  73. # # support for the new v1 search endpoint, functional by incomplete read more on ticket 1732
  74. # search: false
  75. # # disable writing body size to logs, read more on ticket 1912
  76. # bytesin_off: false
  77. # This affect the web and api (not developed yet) 这些会影响webapi(尚未开发的功能)
  78. #i18n:
  79. #web: en-US
  80. #默认是没有的,只能在本机访问,添加后可以通过外网访问
  81. listen:0.0.0.0:4873

通过pm2启动verdaccio

  • 什么是pm2?
    pm2 是一款著名的nodejs进程守护和管理工具,下面我们用pm2来启动verdaccio:
  1. npm install -g pm2 //安装pm2
  2. pm2 start verdaccio //启动verdaccio status为online即为成功 如下图所示:

image.png

pm2常见命令

  1. npm install pm2 -g // 命令行安装 pm2
  2. pm2 start app.js // 启动app.js应用程序
  3. pm2 start app.js -i 4 // 后台运行pm2,启动4个app.js
  4. // 也可以把'max' 参数传递给 star
  5. // 正确的进程数目依赖于Cpu的核心数目
  6. pm2 start app.js --watch // 当文件变化时自动重启应用
  7. pm2 list // 列表 PM2 启动的所有的应用程序
  8. pm2 monit // 显示每个应用程序的CPU和内存占用情况
  9. pm2 logs // 显示所有进程日志
  10. pm2 start app.js --name="api" // 启动应用程序并命名为 "api"
  11. pm2 start script.sh // 启动 bash 脚本
  12. pm2 show [app-name] // 显示应用程序的所有信息
  13. pm2 logs [app-name] // 显示指定应用程序的日志
  14. pm2 stop all // 停止所有的应用程序
  15. pm2 stop 0 // 停止 id为 0的指定应用程序
  16. pm2 restart all // 重启所有应用
  17. pm2 restart 0 // 重启指定的进程
  18. pm2 delete all // 关闭并删除所有应用
  19. pm2 delete 0 // 删除指定应用程序id为0的
  20. ...可以百度查阅下 ^_^

发布npm包的流程

  1. 新建一个文件夹名称为npm-test ,在cmd控制台上输入 ```javascript cd npm-test
    npm init //初始化 默认指向index.js文件,所以新建一个index.js文件

//index.js文件 module.exports.Say = function(name){ return (“Hello “ + name); }

  1. 好了,执行verdaccio命令就可以发布了
  2. ```javascript
  3. npm adduser --registry http://localhost:4873 //添加功能,无账号的添加完毕直接包
  4. npm login --registry=http://localhost:4873 //登录功能,有账号的话可以直接使用这个
  5. npm publish --registry http://localhost:4873 //发布包

可以使用nrm进行管理npm源,来避免手动输入registry

  1. nrm add company http://localhost:4873 //company可以换任意名称 url地址 添加功能
  2. nrm use company //使用company的源地址
  3. //这样的话简单了结,不用手动输入registry
  4. npm addUser
  5. npm login
  6. npm publish
  7. //注意:registry要切换到公司私有服务器地址,如果不是用nrm管理切换,则需要带上私有registry(重复啦!)

此时在http://localhost:4873/ 页面上进行更新,就会发现你发布的包(包的名称就是文件的名称)。

接下来呢,我们来下载刚刚发布的包

  1. //注意:registry要切换到公司私有服务器地址,如果不是用nrm管理切换,则需要带上私有registry(再来一遍)
  2. //新建一个文件夹名为 app
  3. cd app
  4. npm install npm-test //要是没有切换的话,请手动添加 --registry=http://localhost:4873
  5. //成功如图所示
  • 删除发布的包
  1. npm unpublish npm-test --force //清除发布的包

npm私有库的权限管理

因为verdaccio默认是人人都可以注册的,所以需要先将注册窗口关闭

  1. auth:
  2. htpasswd:
  3. file: ./htpasswd
  4. // 此配置项可以关闭注册功能
  5. max_users: -1

verdaccio 的认证是基于 verdaccio-htpasswd, 可以通过官方提供的工具来生成 www.htaccesstools.com/htpasswd-ge…,将生成的段字符串添加到 htpasswd 中即可,这样的话就可以登录npm私有库

之后就需要修改verdaccio文件下的config.yaml的配置:针对不同的包来设置access,publish,unpublish对应的权限组,因为htpasswd是默认的鉴权插件,所以只能写入相应的用户名,all,authenticated,$anonymous

  1. //小小实例下:
  2. auth:
  3. htpasswd:
  4. file: ./htpasswd
  5. // 此配置项可以关闭注册功能
  6. max_users: -1
  7. duGroup:
  8. // 这里可以自定义用户组
  9. demoPublish: [xiaoming, xiaohong, xiaoli]
  10. demoUnpublish: [xiaojun, xiaoming]
  11. testPublish: [xiaoming,xiaojun]
  12. packages:
  13. '@demo/*':
  14. access: $all
  15. // 针对不同的包,可以指定不同的用户组来满足权限控制
  16. publish: demoPublish
  17. unpublish: demoUnpublish
  18. proxy: npmjs
  19. 'test':
  20. access: $all
  21. publish: testPublish
  22. unpublish: demoUnpublish
  23. proxy: npmjs

或者通过安装htpasswd-for-sinopia工具来添加账号

  1. npm install htpasswd-for-sinopia -g
  2. sinopia-adduser // 在 htpasswd 目录执行

为其他登录的用户生成用户名和密码,之后将用户名和密码写入verdaccio文件夹下的htpasswd文件中,然后就跟上文是一样的步骤。

好了,结束了,谢谢~

技术交流

欢迎关注公众号“燕小书”,回复:“技术交流”进微信技术交流群,公众号会陆续发布优质文章。