搭建NPM私有库

Sinopia已暂停维护,现由verdaccio在它基础上进行更新升级

用verdaccio搭建私有库

https://github.com/verdaccio/verdaccio#readme

搭建一个无需配置的本地npm仓库,你不必安装和复制整个CouchDB数据库。保留自己小的数据库,如果这里的包文件不存在,会询问npmjs.org,它只保留你需要使用的包。

使用方法

  • 使用私有包

如果你想使用所有npm包系统的好处而且不把代码发送到公共系统里,并且使用私有包像公共一样方便。

有关详情查阅私有包章节

  • 缓存npmjs.org注册表

如果你有多个服务器想安装软件包,可以使用此方法减少延迟(慢的npmjs.org只连接到每个包/版本一次)并提供有限故障转移(如果npmjs.org关闭了,我们还可以在缓存里找到可用的包)。

有关详情查阅使用公共包章节

  • 覆盖公共包

如果你想使用一些第三方包的修改版本(例如,你发现一个bug,但是维护者也不接受你的请求),你可以在本地以相同的名字发布你的版本。

有关详情查阅覆盖公共包章节

搭建NPM私有库_第1张图片
image

安装

安装并运行(在config.yaml里,应用将创建一个以后也可以编辑的默认配置)

npm install -g verdaccio
verdaccio

npm配置

npm set registry http://localhost:4873/

如果你使用HTTPS, 添加一个适当的CA信息(“null” 的意思从系统获取CA列表)

npm set ca null

现在你可以浏览 http://localhost:4873/, 这里将被列出和被搜索出来的本地包。

服务端配置

在那个目录下运行 verdaccio ,它会在相应目录下创建自己的文件。此文件默认有2个文件(config.yaml和storge),htpasswd在添加用户后才被创建。

  • config.yaml是用来配置访问权限,代理,文件存储路径等所有配置信息的

  • storge 存放NPM包的。

  • htpasswd 保存用户账户、密码等信息。

config.yaml配置文件

运行一个服务时,它自动创建一个配置文件。默认配置文件,它允许所有用户做任何事,所以不要在生产环境使用它。

# 存储NPM包的路径
storage: /Users/luckytien/.local/share/verdaccio/storage


auth:
  htpasswd:
    #保存用户账户、密码等信息文件
    file: ./htpasswd
    # 允许注册的最大用户数, 默认是无限制
    # 如果是-1, 禁止注册
    #max_users: 1000

# 我们可以访问已知的其他存储库列表,用于请求资源不存在,根据此处配置地址请求其他服务器
uplinks:
  npmjs:
    url: https://registry.npmjs.org/    //默认为npm官网,可以在此修改成其他源地址
    
# 配置权限管理
packages:
  '@*/*':
    # 范围包
    access: $all                       // 用户对匹配的项目进行安装
    publish: $authenticated             // 用户对匹配的项目进行发布

  '*':
    # 允许所有用户(包括没有验证的用户)读取和发布所有包
    #
    # 可以指定用户名/组名(取决于你的插件)
    # 3个关键字: "$all", "$anonymous", "$authenticated"
    # $all表示所有人
    # $anonymous表示匿名者
    # $authenticated表示只通过验证的人可以执行对应操作
    access: $all

    # 允许所有已知用户发布包(默认任何人都可以注册)
    publish: $authenticated

    # 如果本地没有可用的私有包,代理会请求'npmjs'仓库
    proxy: npmjs

# 日志设置
logs:
  - {type: stdout, format: pretty, level: http}
  #- {type: file, path: verdaccio.log, level: info}

注册一个新的用户

npm adduser --registry http://localhost:4873/

这将提示输入用户名、密码、邮箱并将这些用户凭证保存在服务里。

注意:添加新用户之前,切换到对应的源。

使用私有软件包

添加用户和用户访问软件包的管理权限。

推荐为你的私有包定义一个前缀,例如“local“,所以你所有私有包都将像这样:“local-foo”。此方法可以清楚的分离公共包和私有包

使用npmjs.org公共包

如果一些包在存储中不存在,服务器就会去尝试从npmjs.org获取它。如果npmjs.org关闭了,此服务就从缓存中获取可用的包。它只下载所需要的包(相当于通过客户端请求),并且这些信息将被缓存。所以如果客户端重复请求同样的包,它可以直接提供包,而不用再请求npmjs.org。

例如:如果你成功的从这台服务器获取过[email protected]一次,哪怕npmjs.or关闭了,你也能够在任何时候再次获取它(和它的所有依赖)。但是会提示[email protected]不会被下载直到它被人实际需要。如果npmjs.org离线,此服务器会提示只有[email protected]是被发布的(相当于只在缓存从获取)。

覆盖公共包

如果你想使用一些公共包 foo 的修订版本, 你仅能发布它到你本地服务器里,所以当你输入npm install foo ,它将会考虑安装你的版本。

这里有2个选项:

  1. 创建单独fork和停止与公共版本同步

    如果你想这么做,你应该修改你的配置文件,因为它不再向npmjs发送此请求。为这个包添加单独的配置到 config.yaml,并且从 'proxy_access' 列表移除 npmjs, 然后重启此服务。

    当你发布你的本地包时,首先版本字符串要比现有版本高,因此它在缓存里与现有版本不会冲突。

  2. 想暂时使用你的版本,但是公共包更新的与它一样就使用公共包。

    为了避免版本冲突,你可以使用下一个补丁版本的自定义预发布后缀。例如,如果一个公共包版本是 0.1.2 ,你可以发布 0.1.3-my-temp-fix。此方式你的包将被使用直到他的原始维护者更新它的公共包到0.1.3

兼容性

自动支持标准的npm客户端的所有功能,这些客户端在私有仓库中支持是有意义的。可惜的是,他不能一直支持。

基本功能:

  • 安装包(npm install,npm upgrade等)- 支持
  • 发布包(npm publish)- 支持

高级包控制:

  • 取消发布包(npm unpublish)- 支持
  • 标记包(npm tag)- 尚未支持,不久会支持
  • 弃用包(npm deprecate)- 不支持

用户管理

  • 注册新用户(npm adduser {newuser})- 支持
  • 转让拥有权(npm owner add {user} {pkg})- 不支持,用它自己的acl管理系统

其他信息

  • 搜索包(npm search)- 浏览器支持,不支持命令行
  • 关注包(npm star, npm unstar)- 不支持,在私有仓库中是无意义的

现有类似服务和方法

  • npm+git(git+ssh://dependencies)- 许多人这么用,但是有个麻烦问题,npm update 不能更新,不能以这种方式用git子目录等。
  • reggie - 这看起来确实非常有趣。可以借用一些代码。
  • shadow-npm,public service - 它使用了与npmjs.org相同的代码。
  • gemfury和其他服务 - 这些都是闭源的云服务。
  • npm-registry-proxy,npm-delegate,npm-proxy。 - 这些只是代理

你可能感兴趣的:(搭建NPM私有库)