在window上測(cè)試安裝cnpm私有倉(cāng)庫(kù)
官方說明只能在linux和mac安裝
1. clone到本地,安裝dependencies
# from git
$ git clone https://github.com/cnpm/cnpmjs.org.git
# 因?yàn)槭窃趙indow上安裝,所有官方文檔上的一些命令就不能使用了,
$ cd cnpmjs.org
$ npm install
$ npm run dev
上面的最后一條命令執(zhí)行肯定是會(huì)報(bào)錯(cuò)的,下面我們就按著報(bào)錯(cuò)提示,一個(gè)一個(gè)的解決
最終搭建自己完美的私有npm倉(cāng)庫(kù)
2. npm run dev報(bào)錯(cuò)
D:\www\cnpmjs.org [master ≡ +0 ~1 -0 !]
λ npm run dev
> cnpmjs.org@3.0.0-alpha.16 dev D:\www\cnpmjs.org
> DEBUG=cnpm* node dispatch.js
'DEBUG' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序
或批處理文件。
npm ERR! Windows_NT 10.0.14393
npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "dev" npm ERR! node v6.10.0
npm ERR! npm v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! cnpmjs.org@3.0.0-alpha.16 dev: `DEBUG=cnpm* node dispatch.js`
npm ERR! Exit status 1
此命令錯(cuò)誤主要是window不能執(zhí)行DEBUG=cnpm*命令,所以我們要改這條命令
更新package.json中命令如下,主要看dev命令
{
"scripts": {
"dev": "set DEBUG=cnpm* & node dispatch.js",
"test": "make jshint && make test",
"test-local": "make test",
"start": "./bin/nodejsctl start && cp History.md docs/web/history.md",
"status": "./bin/nodejsctl status",
"stop": "./bin/nodejsctl stop"
}
}
再次執(zhí)行npm run dev命令,已經(jīng)不錯(cuò)了
D:\www\cnpmjs.org [master ≡ +0 ~2 -0 !]
λ npm run dev
> cnpmjs.org@3.0.0-alpha.16 dev D:\www\cnpmjs.org
> set DEBUG=cnpm* & node dispatch.js
Starting cnpmjs.org ...
cluster: false
admins: {"fengmk2":"fengmk2@gmail.com","admin":"admin@cnpmjs.org","dead_horse":"dead_horse@qq.com"}
scopes: ["@cnpm","@cnpmtest","@cnpm-test"]
sourceNpmRegistry: https://registry.npm.taobao.org
syncModel: none
[Wed Jan 24 2018 14:52:05 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)] [worker:34728] Server started, registry server listen at 127.0.0.1:7001, web
listen at 127.0.0.1:7002, cluster: false
3. 我們根據(jù)提示訪問127.0.0.1:7002,不用說又要報(bào)錯(cuò)了,但是頁(yè)面應(yīng)該是能訪問的了
cnpmjs.org:middleware:auth GET / with "" +0ms
cnpmjs.org:middleware:auth GET /total with "" +416ms
{ SequelizeDatabaseError: SQLITE_ERROR: no such table: module
at Query.formatError (D:\www\cnpmjs.org\node_modules\sequelize\lib\dialects\sqlite\query.js:348:14)
at afterExecute (D:\www\cnpmjs.org\node_modules\sequelize\lib\dialects\sqlite\query.js:112:29)
at replacement (D:\www\cnpmjs.org\node_modules\sqlite3\lib\trace.js:19:31)
at Statement.errBack (D:\www\cnpmjs.org\node_modules\sqlite3\lib\sqlite3.js:16:21)
name: 'SequelizeDatabaseError',
message: 'SQLITE_ERROR: no such table: module',
parent:
{ Error: SQLITE_ERROR: no such table: module
at Error (native)
errno: 1,
code: 'SQLITE_ERROR',
sql: 'SELECT count(name) AS count FROM module;' },
original:
{ Error: SQLITE_ERROR: no such table: module
at Error (native)
errno: 1,
code: 'SQLITE_ERROR',
sql: 'SELECT count(name) AS count FROM module;' },
sql: 'SELECT count(name) AS count FROM module;',
url: '/total' }
SequelizeDatabaseError: SQLITE_ERROR: no such table: module
at Query.formatError (D:\www\cnpmjs.org\node_modules\sequelize\lib\dialects\sqlite\query.js:348:14)
at afterExecute (D:\www\cnpmjs.org\node_modules\sequelize\lib\dialects\sqlite\query.js:112:29)
at replacement (D:\www\cnpmjs.org\node_modules\sqlite3\lib\trace.js:19:31)
at Statement.errBack (D:\www\cnpmjs.org\node_modules\sqlite3\lib\sqlite3.js:16:21)
這些錯(cuò)誤的意思簡(jiǎn)單說就是沒有database,沒有table,什么都沒有,怎么辦
// - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb'
這是cnpmjs支持的數(shù)據(jù)庫(kù)列表,默認(rèn)使用sqlite,我準(zhǔn)備使用mysql,所以安裝mysql請(qǐng)百度
4. 因?yàn)槲覀兪窃趙indow上跑這個(gè)項(xiàng)目,所以一些自動(dòng)化命令我們就不能使用了
我們要手動(dòng)執(zhí)行sql語句,創(chuàng)建數(shù)據(jù)表,sql語句在./docs/db.sql
為方便,使用navicat客戶端工具(自己安裝)
4.1 連接mysql

4.2 創(chuàng)建數(shù)據(jù)庫(kù)cnpmjs(名字隨便)
在mysql連接名字上比如local,右鍵->新建數(shù)據(jù)庫(kù)

4.3 執(zhí)行sql
在數(shù)據(jù)庫(kù)cnpmjs名字上右鍵->命令行界面,將./docs/db.sql中的sql語句進(jìn)行copy,
粘貼到命令,回車執(zhí)行ok。
特別注意有個(gè)./docs/user.sql,必須單獨(dú)執(zhí)行一下

4.4 修改配置文件config/index.js
主要配置db, username, password, dialect, host, port
/**
* database config
*/
database: {
db: 'cnpmjs',
username: 'root',
password: 'root',
// the sql dialect of the database
// - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb'
dialect: 'mysql',
// custom host; default: 127.0.0.1
host: '127.0.0.1',
// custom port; default: 3306
port: 3306,
// use pooling in order to reduce db connection overload and to increase speed
// currently only for mysql and postgresql (since v1.5.0)
pool: {
maxConnections: 10,
minConnections: 0,
maxIdleTime: 30000
},
// the storage engine for 'sqlite'
// default store into ~/.cnpmjs.org/data.sqlite
storage: path.join(dataDir, 'data.sqlite'),
logging: !!process.env.SQL_DEBUG,
},
5. 重新啟動(dòng)項(xiàng)目npm run dev,現(xiàn)在應(yīng)該一切正常了

7001驗(yàn)證

6. 現(xiàn)在到了我們?cè)趺词褂盟接袔?kù)的時(shí)候了
6.1 我們使用nrm這個(gè)模塊進(jìn)行npm庫(kù)的管理
#
$ npm install nrm -g
$ nrm ls
# npm ---- https://registry.npmjs.org/
# cnpm --- http://r.cnpmjs.org/
# * taobao - https://registry.npm.taobao.org/
# nj ----- https://registry.nodejitsu.com/
# rednpm - http://registry.mirror.cqupt.edu.cn/
# npmMirror https://skimdb.npmjs.com/registry/
# edunpm - http://registry.enpmjs.org/
上面可以看出可以用的npm倉(cāng)庫(kù)地址,*標(biāo)明當(dāng)前使用的倉(cāng)庫(kù)地址,使用npm use 'name'切換倉(cāng)庫(kù)
6.2 添加本地私有倉(cāng)庫(kù)
cnpm提供兩個(gè)端口:7001和7002,其中7001用于NPM的注冊(cè)服務(wù),7002用于Web訪問
$ nrm add local http://127.0.0.1:7001/
add registry local success
$ nrm ls
# npm ---- https://registry.npmjs.org/
# cnpm --- http://r.cnpmjs.org/
# * taobao - https://registry.npm.taobao.org/
# nj ----- https://registry.nodejitsu.com/
# rednpm - http://registry.mirror.cqupt.edu.cn/
# npmMirror https://skimdb.npmjs.com/registry/
# edunpm - http://registry.enpmjs.org/
# local -- http://127.0.0.1:7001/
local就是我們剛才添加的本地私有npm倉(cāng)庫(kù),執(zhí)行
nrm use local
# 使用本地倉(cāng)庫(kù)
6.3 發(fā)布npm包
在發(fā)布 npm 包之前,需要先將原先的 config/config.js 中添加一些配置屬性:
enablePrivate: true, // 只有管理員可以發(fā)布 npm 包,默認(rèn)為 false,即任何人都可以發(fā)布包
admins: {
admin: 'admin@admin.com' // 管理員權(quán)限
},
scopes: ['@company'], // 私有包必須依附于 scope 下
登錄我們配置的管理員
# 使用本地倉(cāng)庫(kù)
nrm use local
Registry has been set to: http://127.0.0.1:7001/
# 執(zhí)行登錄
npm login
Username: admin # 輸入用戶名
Password: # 密碼admin
Email: (this IS public) admin@admin.com # 郵箱就是配置的郵箱
Logged in as admin on http://127.0.0.1:7001/.
我們知道,要發(fā)布包到npm,需要有g(shù)ithub倉(cāng)庫(kù)地址,現(xiàn)在我們就在github上建個(gè)demo作測(cè)試
實(shí)際使用應(yīng)該使用公司內(nèi)部的gitlab
我們直接使用已有的demo
git clone git@github.com:twolun/xxx-utils.git
cd xxx-utils
npm publish
+ @evcard/evcard-utils@1.0.2
# 應(yīng)該是發(fā)布成功
1.下面我們?cè)趥}(cāng)庫(kù)中查看,已經(jīng)有了一個(gè)包了

2.這上面只有通過搜索才能查看到發(fā)布的包

3.進(jìn)一步查看,注意我畫紅線的部分,是在config/index.js里配置的

4.最后一點(diǎn)要注意,就是我們發(fā)布包的package.json文件里有包名的寫法
尤其注意name的寫法@company也是固定的,與config/index.js里的配置相對(duì)應(yīng)
{
"name": "@company/xxx-utils",
"version": "1.0.3",
"description": "私有包測(cè)試demo",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "admin@admin.com",
"license": "ISC"
}
6.4 安裝本地倉(cāng)庫(kù)剛剛發(fā)布的xxx-utils包
D:\github\fis3-parser-html-plugin1
npm install @company/xxx-utils -S
fis3-parser-html-plugin@1.0.0 D:\github\fis3-parser-html-plugin1
`-- @company/xxx-utils@1.0.3
npm WARN fis3-parser-html-plugin@1.0.0 No repository field.
到此安裝成功,應(yīng)該可以使用了
總結(jié)
- 全程window環(huán)境,相信在mac, linux環(huán)境肯定也沒問題的
- sql語句手動(dòng)執(zhí)行,創(chuàng)建database和table
- 更改相關(guān)配置一切搞定
- 全程沒有使用cnpm這個(gè),使用更方便nrm來切換倉(cāng)庫(kù)池
- 更多詳細(xì)配置請(qǐng)查看cnpmjs.org官方文檔