搭建NPM私有库
用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个选项:
-
创建单独fork和停止与公共版本同步
如果你想这么做,你应该修改你的配置文件,因为Sinopia不再向npmjs发送此请求。为这个包添加单独的配置到
config.yaml
,并且从 'proxy_access' 列表移除npmjs
, 然后重启此服务。当你发布你的本地包时,首先版本字符串要比现有版本高,因此它在缓存里与现有版本不会冲突。
-
想暂时使用你的版本,但是公共包更新的与它一样就使用公共包。
为了避免版本冲突,你可以使用下一个补丁版本的自定义预发布后缀。例如,如果一个公共包版本是
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。 - 这些只是代理