文章同步於 Github blog前端
公司出於自身隱私保護須要,不想把本身的代碼開源到包管理區,可是又急需一套完整包管工具,來管理愈來愈多的組件、模塊和項目。對於前端,最熟悉的莫過於npm,bower等;可是bower的市場兼容性明顯沒有npm強壯,加之commonjs規範的日益成熟。npm應該是前端包管理的不二選擇。node
公司對於搭建本地私有npm庫有以下要求:git
Sinopia 是一個零配置的私有的帶緩存功能的npm包管理工具,做者是是rlidwka,一個大神,也是一隻貓~ 往社區內貢獻過不少代碼,包括 jshttp, markdown-it 等等,也是 Node.js 核心代碼庫的活躍貢獻者。github
使用sinopia,你不用安裝CouchDB或MYSQL之類的數據庫,Sinopia有本身的迷你數據庫,若是要下載的包不存在,它將自動去你配置的npm地址上去下載,並且硬盤中只緩存你如今過的包,以節省空間。web
sinopia有如下幾個優點值得關注:算法
嗯,這種方式可行,也最簡單,但真真的太爛了,姑且不說不能使用 semver,關鍵仍是 url 太醜,若是是強迫症真的無法忍~數據庫
暫且不論 cnpm 只是做爲鏡像使用,其實這個方案缺點就挺多的,用的人多,速度不必定快,緩存,關鍵是不支持發佈包以及登錄、註冊,再加上配置過於複雜。並且,還須要安裝數據庫。express
土豪啊,我還能說什麼呢。。。可是問題是,npm在國內訪問慢,仍是不是的沒法訪問,花錢也買不到好的服務,何須呢。npm
首先,你要本身配置nodejs及npm的環境,而後運行json
npm install -g sinopia
$ sinopia warn --- config file - .....\AppData\Roaming\sinopia\config.yaml warn --- http address - http://localhost:4873/
而後打開:http://localhost:4873/
若是能正常顯示,說明安裝成功。
固然,你也可使用pm2或其餘的守護進程進行管理,具體步驟以下:
安裝pm2:npm install -g pm2
啓動:pm2 start `which sinopia`
更多高級的pm2使用方法能夠查看pm2電子書,至關詳細,強烈推薦。
Sinopia的特色是,你在哪一個目錄運行,它的就會在對應的目錄下建立本身的文件。目錄下默認有兩個文件:config.yaml
和storage
,htpasswd
是添加用戶以後自動建立的。
root@debian:/usr/local/apps/sinopia# ls config.yaml htpasswd storage
其中config.yaml是用來配置訪問權限,代理,文件存儲路徑等全部配置信息的,htpasswd用來保存用戶的帳號密碼等息息,storage是用來存放npm包的。
# # 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 # # path to a directory with all packages storage: ./storage //npm包存放的路徑 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: -1 //默認爲1000,改成-1,禁止註冊 # a list of other known repositories we can talk to uplinks: npmjs: url: http://registry.npm.taobao.org/ //默認爲npm的官網,因爲國情,修改 url 讓sinopia使用 淘寶的npm鏡像地址 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 proxy: npmjs # log settings logs: - {type: stdout, format: pretty, level: http} #- {type: file, path: sinopia.log, level: info} # you can specify listen address (or simply a port) listen: 0.0.0.0:4873 ////默認沒有,只能在本機訪問,添加後能夠經過外網訪問。
storage: 倉庫保存的路徑
web: 是否支持WEB接口
auth: 驗證相關
uplinks: 配置上游的npm服務器,主要是用於請求的倉庫不存在時去上游服務器拉取
packages: 配置模塊/包的發佈(publish)、下載(access)的權限等
listen: 配置監聽端口與主機名
max_users: -1
表示咱們將最大用戶數設置爲-1,表示禁用 npm adduser 命令來建立用戶,不過咱們仍然能夠經過當前目錄下的 htpasswd 文件來初始化用戶。
示例:
yorkie:{SHA}?????????????????=:autocreated 2016-02-05T15:33:46.238Z weflex:{SHA}????????????????=:autocreated 2016-02-05T15:39:19.960Z james:{SHA}????????????????=:autocreated 2016-02-05T17:59:05.041Z
上面的加密算法也很簡單,就是簡單的SHA1哈稀以後再轉換成 Base64 輸出就好,後面跟着的只是表示時間。
配置大體分爲兩個部分,一個是以 @weflex/* 爲開頭的,另外一個則是通配符 *。
這個固然就是對 package.json 中的 name 字段進行匹配,好比 @weflex/app 將匹配第一個配置,而 express 則匹配第二個。
這裏這麼配置的意義在於:通常團隊或者公司的私有項目,會採用不一樣的權限控制,因而這裏借用了 NPM 的 scoped name 即 @company 的形式,例如 @weflex/app 即表示 WeFlex 下屬的 app 項目了。
接下來,每個命名過濾器(filter)下都有三項基本設置:
對於1和2的值,咱們一般有如下一些可選的配置:
或者也能夠指定對應於以前咱們配置的用戶表 htpasswd 中的一個或多個用戶,這樣就明確地指定哪些用戶能夠執行匹配的操做
配置完成後,再運行:
$ sinopia -c config.yml
強烈推薦使用nrm來管理本身的代理。
全局安裝nrm能夠快速修改,切換,增長npm鏡像地址。
$ npm install -g nrm # 安裝nrm $ nrm add XXXXX http://XXXXXX:4873 # 添加本地的npm鏡像地址 $ nrm use XXXX # 使用本址的鏡像地址
$ nrm --help # 查看nrm命令幫助 $ nrm list # 列出可用的 npm 鏡像地址 $ nrm use taobao # 使用`淘寶npm`鏡像地址
安裝完成.以後你經過npm install 安裝的包,sinopia都會幫你緩存到本地了.試一下吧。
mkdir test && cd test npm install lodash # sinopia發現本地沒有 lodash包,就會從 taobao鏡像下載 rm -rf node-modules # 刪除目錄 npm insatll lodash # 第二次安裝就會從緩存下載了,速度很快
建立新用戶
1.確保本身已經切換到配置的代理
➜ ~ nrm ls npm ---- https://registry.npmjs.org/ cnpm --- http://r.cnpmjs.org/ taobao - http://registry.npm.taobao.org/ nj ----- https://registry.nodejitsu.com/ rednpm - http://registry.mirror.cqupt.edu.cn npmMirror https://skimdb.npmjs.com/registry * sinopia http://192.168.1.200:4873/
2.運行npm adduser
,填寫信息,註冊帳號。若是已經有帳號,直接運行npm login
便可。
➜ ~ npm adduser Username: test Password:
3.運行$ npm publish
發佈新包。