搭建NPM私有库

作者: 天天luck | 来源:发表于2017-01-10 16:12 被阅读5295次

    用Sinopia搭建私有库

    https://github.com/rlidwka/sinopia
    

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

    使用方法

    • 使用私有包

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

    有关详情查阅私有包章节

    • 缓存npmjs.org注册表

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

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

    • 覆盖公共包

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

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

    image

    安装

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

    npm install -g sinopia
    sinopia
    

    npm配置

    npm set registry http://localhost:4873/
    

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

    npm set ca null
    

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

    服务端配置

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

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

    • storge 存放NPM包的。

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

    config.yaml配置文件

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

    # 存储NPM包的路径
    storage: /Users/luckytien/.local/share/sinopia/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: sinopia.log, level: info}
    

    注册一个新的用户

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

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

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

    使用私有软件包

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

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

    使用npmjs.org公共包

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

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

    覆盖公共包

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

    这里有2个选项:

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

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

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

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

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

    兼容性

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

    基本功能:

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

    高级包控制:

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

    用户管理

    • 注册新用户(npm adduser {newuser})- 支持
    • 转让拥有权(npm owner add {user} {pkg})- 不支持,sinopia用它自己的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。 - 这些只是代理

    相关文章

      网友评论

      • 菠萝炒辣条:看这个项目github上的更新,最近一次是3年前,确定还能用?
        天天luck:用verdaccio替代 基于Sinopia
      • 艾丝美拉达_02fd:有一个问题,发布包如何发布到这个私人的npm库中呢?求大神指导下
      • 2e9b4896b503:兼容性

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

        这个表示后续npm功能有升级,Sinopia不一定持续支持吗??
        天天luck:@丶左手阳光 npm主要功能都支持 够用了 它的出现肯定是随着npm主流的
      • 麋鹿的海子:正好想弄一个本地的私有裤。棒
        天天luck:裤要穿厚点

      本文标题:搭建NPM私有库

      本文链接:https://www.haomeiwen.com/subject/fqokbttx.html