Sinopia---构建私有NPM仓库

系统:Ubuntu
该私有仓库可以放私有包,也可以自动缓存Npm官方库上的包

一、安装

$ npm install sinopia -g --no-optional --no-shrinkwrap
$ npm i sinopia -g  ## 这种方式易报错

二、报错处理

  • 错误一:python:请安装$ apt-get install python
  • 错误二:make g++ command not found : 请安装:sudo apt-get install g++
  • 错误三:make: *** [Release/obj.target/fs-ext/fs-ext.o] Error 1: 请如此安装:npm install sinopia -g --no-optional --no-shrinkwrap

Dependencies crypt3 and fs-ext are native modules that could fail to compile and unavailable on Windows. They are optional and does not affect usage of Sinopia. To avoid errors, you can not install this dependencies with no-optional and no-shrinkwrap options.
貌似是说:crypt3 这个包 Sinopia并不需要,所以为了避免它导致该错误,用npm install sinopia -g --no-optional --no-shrinkwrap 这种方式安装。
错误三详见:github-上的解释

三、运行

wxq@ubuntu:~$ sinopia
### 会输出:
 warn  --- config file  - /home/wxq/.config/sinopia/config.yaml  ## sinopia的配置文件所在位置
 warn  --- http address - http://localhost:4873/  ## 你的npm私有库的访问地址
...
  • 本地访问私有库地址

1、配置文件:

默认路径:~/.config/sinopia/config.yaml

#
# This is the default config file. It allows all users to do anything,
# so don't use it on production systems.
#
# Look here for more config file examples:
# https://github.com/rlidwka/sinopia/tree/master/conf
#

# 依赖包的存放位置
storage: /home/wxq/sinopia/storage

auth:
  htpasswd:
    ## 在私有仓库添加账户时,账户信息的存放位置。
    file: ./htpasswd    
    # Maximum amount of users allowed to register, defaults to "+inf".
    # You can set this to -1 to disable registration.
    ## npm私库允许注册的最大用户数,如果设置为-1则表示禁止注册。
    #max_users: 1000

# a list of other known repositories we can talk to
uplinks:
  ## npm私库 依赖的第三方npm库的地址,可以配置其他的npm源(如:cnpm)。
  npmjs:
    url: https://registry.npmjs.org/

packages:
  '@*/*':
    # scoped packages
    access: $all
    publish: $authenticated

  '*':
    # allow all users (including non-authenticated users) to read and
    # publish all packages
    #
    # you can specify usernames/groupnames (depending on your auth plugin)
    # and three keywords: "$all", "$anonymous", "$authenticated"
    access: $all

    # allow all known users to publish packages
    # (anyone can register by default, remember?)
    publish: $authenticated

    # if package is not available locally, proxy requests to 'npmjs' registry
    # 如果本地仓库的包不可用,则从上面配置的第三方npmjs源中进行获取。
    proxy: npmjs

# log settings
logs:
  - {type: stdout, format: pretty, level: http}
  #- {type: file, path: sinopia.log, level: info}
## 这里配置sinopia的监听IP,默认是监听在 127.0.0.1:4873的,改成0.0.0.0:4873的话,就可以被外网访问了(当然也可以借助Nginx来处理)。
listen: 0.0.0.0:4873

四、Npm镜像地址管理:Nrm

用于管理npm的镜像仓库地址

$ npm i nrm -g
$ nrm add sinopia http://localhost:4873   ## 添加新搭建的npm私有仓库地址

### 其他相关命令:
$ nrm --help 查看
$ nrm ls  ## 列出所有的可用镜像仓库地址

五、sinopia使用

1、npm 下载包

切换为新搭建的私有仓库后,npm的使用方式没有任何改变,仍是使用npm install xxx安装我们所需要的包。
如果私有仓库中没有所需要的包,会从备用的镜像中下载并缓存到本地,下一次在进行安装时会直接从私有仓库中获取。

2、npm 发布包

要在私有npm仓库中发布包首先需要注册或登陆账号。

  • 1、需要先登录

1)、如果还没有账号,通过输入命令

npm adduser --registry <指定你的账号要添加到的NPM源:如:http://localhost:4873/>

然后依次输入用户名,密码,邮箱用户即可创建完毕。
2)、如果已有账号,通过输入命令

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

然后依次输入用户名,密码,邮箱用户即可登陆。
3)、退出登录

npm logout --registry http://localhost:4873/
  • 2、执行初始化。
$ npm init

这个过程中要输入项目名,版本号,作者,开源协议等信息,自动生成package.json文件。
这里可以在这里填写相关信息或者直接回车跳过,因为后续可以直接修改package.json文件。
此外,通过在目录内新建README文件,可添加包的使用说明和用例代码。README文件支持markdown,书写十分方便。

  • 3、发布包到私有npm仓库了。
npm publish --registry <你的私有仓库地址>

3、发布私有包

所有的私有模块都是 scoped package 的.

scope 是 npm 的新特性。如果一个模块的名字以 "@" 开始,那么他就是一个scoped package。scope 就是"@"与"/"之间的部分。

@scope/project-name

当你注册私有模块到一个用户下时,你的 scope 就是当前用户的用户名。

@username/project-name

如果要使用 npm init 初始化一个软件包,你可以通过自定义 --scope 选项设置你的 scope

npm init --scope=<your_scope>

如果你在大多数时候使用的 scope 都是相同的,可以设置一个默认的 scope ,这样在我们初始化的时候会自动使用该 scope 。

npm config set scope <your_scope>

发布:

npm publish
  • image.png

4、更新发布

npm更新包和发布包的命令是一样的,都是npm publish,不同之处在于,你需要修改包的版本。

所以步骤是:

  • 1.修改包的版本(package.json里的version字段)
  • 2.npm publish

参考:
http://www.cnblogs.com/kelsen/p/4964574.html
http://www.jianshu.com/p/e4db4a0af96a

六、Sinopia的config.yaml文件详解:

config.yaml是sinopia的配置文件

1>其常用的配置

storage: 仓库保存的地址,publish时仓库保存的地址。

auth: htpasswd file:账号密码的文件地址,初始化时不存在,可指定需要手工创建。

           max_users:默认1000,为允许用户注册的数量。

                为-1时,不允许用户通过npm adduser注册。

              但是,当为-1时,可以通过直接编写htpasswd file内容的方式添加用户。

语法:用户名:{SHA}哈希加密的字符=:autocreated 时间

加密算法:SHA1哈稀之后再转换成 Base64 输出就好

uplinks: 配置上游的npm服务器,主要用于请求的仓库不存在时到上游服务器去拉取。

packages: 配置模块。access访问下载权限,publish包的发布权限。

  格式如下:

scope:

      **权限**:**操作**

scope:两种模式

一种是 @/ 表示某下属的某项目

另一种是 * 匹配项目名称(名称在package.json中有定义)

权限:

l access: 表示哪一类用户可以对匹配的项目进行安装(install)

l publish: 表示哪一类用户可以对匹配的项目进行发布(publish)

l proxy: 如其名,这里的值是对应于 uplinks 的名称,如果本地不存在,允许去对应的uplinks去取。

操作:

l $all 表示所有人(已注册、未注册)都可以执行对应的操作

l $authenticated 表示只有通过验证的人(已注册)可以执行对应操作,注意,任何人都可以去注册账户。

l $anonymous 表示只有匿名者可以进行对应操作(通常无用)

l 或者也可以指定对应于之前我们配置的用户表 htpasswd 中的一个或多个用户,这样就明确地指定哪些用户可以执行匹配的操作

listen:配置监听端口和主机名。

   localhost:4873 #默认

   0.0.0.0:4873 #在所有网卡监听

代理:

#http_proxy: [http://something.local/](http://something.local/)  #http代理

#https_proxy: [https://something.local/](https://something.local/)  #https代理

#no_proxy: localhost,127.0.0.1  #不适用代理的iP

修改了配置文件后,运行命令

$ sinopia -c config.yml

2>附录github中比较全的配置和说明

https://raw.githubusercontent.com/rlidwka/sinopia/master/conf/full.yaml

#仓库
# path to a directory with all packages
storage: ./storage

# a list of users
#
# This could be deprecated soon, use auth plugins instead (see htpasswd below).
users:
  admin:
    # crypto.createHash('sha1').update(pass).digest('hex')
    password: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

#是否支持web接口
web:
  # web interface is disabled by default in 0.x, will be enabled soon in 1.x
  # when all its issues will be fixed
  #
  # set this to `true` if you want to experiment with web ui now;
  # this has a lot of issues, e.g. no auth yet, so use at your own risk
  #enable: true title: Sinopia
  # logo: logo.png
  # template: custom.hbs

auth:
  htpasswd: file: ./htpasswd
    # Maximum amount of users allowed to register, defaults to "+inf".
    # You can set this to -1 to disable registration.
    #max_users: 1000 # a list of other known repositories we can talk to
#上游npm服务器配置
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
 #设置请求无应答超时时间
    # amount of time to wait for repository to respond
    # before giving up and use the local cached copy
    #timeout: 30s

#设置数据认为最新的时间为2分钟,2分钟同一个数据的请求不会向上游服务器请求
    # maximum time in which data is considered up to date #
    # default is 2 minutes, so server won‘t request the same data from
    # uplink if a similar request was made less than 2 minutes ago
    #maxage: 2m

#设置访问失败达到某次数,就停止一段时间不访问上游服务器,默认是2次不应答,5分钟不去请求
    # if two subsequent requests fail, no further requests will be sent to
    # this uplink for five minutes
    #max_fails: 2 #fail_timeout: 5m

    # timeouts are defined in the same way as nginx, see:
    # http://wiki.nginx.org/ConfigNotation
 #包权限配置
packages:
  # uncomment this for packages with "local-" prefix to be available
  # for admin only, it‘s a recommended way of handling private packages
  #'local-*':
  #  access: admin
  #  publish: admin
  #  # you can override storage directory for a group of packages this way:
  #  storage: 'local_storage'

  '*':
    # allow all users to read packages (including non-authenticated users)
    #
    # you can specify usernames/groupnames (depending on your auth plugin)
    # and three keywords: "$all", "$anonymous", "$authenticated" access: $all

    # allow ‘admin‘ to publish packages
    publish: admin

#如果包本地不存在,则去npmjs去请求
    # if package is not available locally, proxy requests to ‘npmjs‘ registry
    proxy: npmjs

#####################################################################
# Advanced settings
#####################################################################

# if you use nginx with custom path, use this to override links
#url_prefix: https://dev.company.local/sinopia/
 # You can specify listen address (or simply a port).
# If you add multiple values, sinopia will listen on all of them.
#
# Examples:
#
#listen:
# - localhost:4873 # default value
# - http://localhost:4873     # same thing
# - 0.0.0.0:4873 # listen on all addresses (INADDR_ANY)
# - https://example.org:4873  # if you want to use https
# - [::1]:4873 # ipv6
# - unix:/tmp/sinopia.sock    # unix socket

#https证书配置(listen需要设置成https)
# Configure HTTPS, it is required if you use "https" protocol above.
#https:
#  key: path/to/server.key
#  cert: path/to/server.crt

# type: file | stdout | stderr
# level: trace | debug | info | http (default) | warn | error | fatal
#
# parameters for file: name is filename
#  {type: ‘file‘, path: ‘sinopia.log‘, level: ‘debug‘},
#
# parameters for stdout and stderr: format: json | pretty
#  {type: ‘stdout‘, format: ‘pretty‘, level: ‘debug‘},
logs: - {type: stdout, format: pretty, level: http}
  #- {type: file, path: sinopia.log, level: info}

#代理设置
# you can specify proxy used with all requests in wget-like manner here
# (or set up ENV variables with the same name)
#http_proxy: http://something.local/
#https_proxy: https://something.local/
#no_proxy: localhost,127.0.0.1 #设置json文档大小上限
# maximum size of uploaded json document
# increase it if you have "request entity too large" errors
#max_body_size: 1mb

# Workaround for countless npm bugs. Must have for npm <1.14.x, but expect
# it to be turned off in future versions. If `true`, latest tag is ignored,
# and the highest semver is placed instead.
#ignore_latest_tag: false
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342