系统: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
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