本章會介紹 CNPM 的基礎(chǔ)部署方法。
該文章所對應(yīng)的 cnpm 目標(biāo)版本為 v2.12.2,上下浮動一些兼容的版本問題也都不是特別大。
準(zhǔn)備
想要部署 CNPM,你需要做以下的一些準(zhǔn)備。
- 部署的宿體,如服務(wù)器、云主機(jī)、自己的電腦等;
- 數(shù)據(jù)庫,支持 MySQL、PostgreSQL、MariaDB,如果使用 SQLite 則無需準(zhǔn)備;
- Git 客戶端(推薦)。
開始部署
克隆 CNPM
首先在本地選擇一個目錄,比如我將它選擇在 /usr/app,然后預(yù)想 CNPM 的目錄為 /usr/app/cnpm,那么需要在終端 $ cd /usr/app。
接下去執(zhí)行 Git 指令將 CNPM 克隆到相應(yīng)目錄。
$ git clone https://github.com/cnpm/cnpmjs.org.git
Windows 用戶
Windows 用戶也可以用類似 Cygwin、MinGW、Powershell 甚至直接是 Command 等來運行 Git。
當(dāng)然也可以直接下載一些 GUI 工具來克隆,如 SourceTree。
非 Git 用戶
跑到 CNPM 的 Release 頁面,選擇相應(yīng)的版本下載,比如這里會選擇 v2.12.2 版。
下載完畢后將文件夾解壓到相應(yīng)目錄即可。
安裝依賴
安裝依賴其實就是一個 npm install,不過 CNPM 把該指令已經(jīng)寫到 Makefile 里面了,所以直接執(zhí)行下面的命令就好了。
$ make install
當(dāng)然萬一你是 Windows 用戶或者不會 make,那么還是要用 npm install。
$ npm install --build-from-source --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node
修改配置文件
新建一份 config/config.js 文件,并且寫入如下的骨架:
'use strict';
module.exports = {
};
在這里面輸入你需要的鍵值對。
這里將會列舉一些常用的配置項,其余的一些配置項請自行參考 config/index.js 文件。
配置字段參考
-
enableCluster:是否啟用 cluster-worker 模式啟動服務(wù),默認(rèn)false,生產(chǎn)環(huán)節(jié)推薦為true; -
registryPort:API 專用的 registry 服務(wù)端口,默認(rèn)7001; -
webPort:Web 服務(wù)端口,默認(rèn)7002; -
bindingHost:監(jiān)聽綁定的 Host,默認(rèn)為127.0.0.1,如果外面架了一層本地的 Nginx 反向代理或者 Apache 反向代理的話推薦不用改; -
sessionSecret:session 用的鹽; -
logdir:日志目錄; -
uploadDir:臨時上傳文件目錄; -
viewCache:視圖模板緩存是否開啟,默認(rèn)為false; -
enableCompress:是否開啟 gzip 壓縮,默認(rèn)為false; -
admins:管理員們,這是一個JSON Object,對應(yīng)各鍵名為各管理員的用戶名,鍵值為其郵箱,默認(rèn)為{ fengmk2: 'fengmk2@gmail.com', admin: 'admin@cnpmjs.org', dead_horse: 'dead_horse@qq.com' }; -
logoURL:Logo 地址,不過對于我這個已經(jīng)把 CNPM 前端改得面目全非的人來說已經(jīng)忽略了這個配置了; -
adBanner:廣告 Banner 的地址; -
customReadmeFile:實際上我們看到的 cnpmjs.org 首頁中間一大堆冗長的介紹是一個 Markdown 文件轉(zhuǎn)化而成的,你可以設(shè)置該項來自行替換這個文件; -
customFooter:自定義頁腳模板; -
npmClientName:默認(rèn)為cnpm,如果你有自己開發(fā)或者 fork 的 npm 客戶端的話請改成自己的 CLI 命令,這個應(yīng)該會在一些頁面的說明處替換成你所寫的; -
backupFilePrefix:備份目錄; -
database:數(shù)據(jù)庫相關(guān)配置,為一個對象,默認(rèn)如果不配置將會是一個~/.cnpmjs.org/data.sqlite的 SQLite;-
db:數(shù)據(jù)的庫名; -
username:數(shù)據(jù)庫用戶名; -
password:數(shù)據(jù)庫密碼; -
dialect:數(shù)據(jù)庫適配器,可選"mysql"、"sqlite"、"postgres"、"mariadb",默認(rèn)為"sqlite"; -
hsot:數(shù)據(jù)庫地址; -
port:數(shù)據(jù)庫端口; -
pool:數(shù)據(jù)庫連接池相關(guān)配置,為一個對象;-
maxConnections:最大連接數(shù),默認(rèn)為10; -
minConnections:最小連接數(shù),默認(rèn)為0; -
maxIdleTime:單條鏈接最大空閑時間,默認(rèn)為30000毫秒;
-
-
storege:僅對 SQLite 配置有效,數(shù)據(jù)庫地址,默認(rèn)為~/.cnpmjs/data.sqlite;
-
-
nfs:包文件系統(tǒng)處理對象,為一個 Node.js 對象,默認(rèn)是 fs-cnpm 這個包,并且配置在~/.cnpmjs/nfs目錄下,也就是說默認(rèn)所有同步的包都會被放在這個目錄下;開發(fā)者可以使用別的一些文件系統(tǒng)插件(如上傳到又拍云等),又或者自己去按接口開發(fā)一個邏輯層,這些都是后話了; -
registryHost:暫時還未試過,我猜是用于 Web 頁面顯示用的,默認(rèn)為r.cnpmjs.org; -
enablePrivate:是否開啟私有模式,默認(rèn)為false;- 如果是私有模式則只有管理員能發(fā)布包,其它人只能從源站同步包;
- 如果是非私有模式則所有登錄用戶都能發(fā)布包;
-
scopes:非管理員發(fā)布包的時候只能用以scopes里面列舉的命名空間為前綴來發(fā)布,如果沒設(shè)置則無法發(fā)布,也就是說這是一個必填項,默認(rèn)為[ '@cnpm', '@cnpmtest', '@cnpm-test' ],據(jù)蘇千大大解釋是為了便于管理以及讓公司的員工自覺按需發(fā)布;更多關(guān)于 NPM scope 的說明請參見 npm-scope; -
privatePackages:就如該配置項的注釋所述,出于歷史包袱的原因,有些已經(jīng)存在的私有包(可能之前是用 Git 的方式安裝的)并沒有以命名空間的形式來命名,而這種包本來是無法上傳到 CNPM 的,這個配置項數(shù)組就是用來加這些例外白名單的,默認(rèn)為一個空數(shù)組; -
sourceNpmRegistry:更新源 NPM 的 registry 地址,默認(rèn)為https://registry.npm.taobao.org; -
sourceNpmRegistryIsCNpm:源 registry 是否為 CNPM,默認(rèn)為true,如果你使用的源是官方 NPM 源,請將其設(shè)為false; -
syncByInstall:如果安裝包的時候發(fā)現(xiàn)包不存在,則嘗試從更新源同步,默認(rèn)為true; -
syncModel:更新模式(不過我覺得是個typo),有下面幾種模式可以選擇,默認(rèn)為"none";-
"none":永不同步,只管理私有用戶上傳的包,其它源包會直接從源站獲取; -
"exist":定時同步已經(jīng)存在于數(shù)據(jù)庫的包; -
"all":定時同步所有源站的包;
-
-
syncInterval:同步間隔,默認(rèn)為"10m"即十分鐘; -
syncDevDependencies:是否同步每個包里面的devDependencies包們,默認(rèn)為false; -
badgeSubject:包的 badge 顯示的名字,默認(rèn)為cnpm; -
userService:用戶驗證接口,默認(rèn)為null,即無用戶相關(guān)功能也就是無法有用戶去上傳包,該部分需要自己實現(xiàn)接口功能并配置,如與公司的 Gitlab 相對接,這也是后話了; -
alwaysAuth:是否始終需要用戶驗證,即便是$ cnpm install等命令; -
httpProxy:代理地址設(shè)置,用于你在墻內(nèi)源站在墻外的情況。
一個可能的配置
下面給出一個樣例配置:
module.exports = {
enableCluster: true,
database: {
db: "snpm",
username: "username",
password: "password",
dialect: "mysql",
host: "127.0.0.1",
port: 3306
},
enablePrivate: false,
admins: {
xadillax: "i@2333.moe"
},
syncModel: "exist",
nfs: require('upyun-cnpm').create({
bucket: "your bucket",
oprator: "your id",
password: "your secret"
}),
scopes: [ '@cheniu', '@souche', '@souche-f2e' ],
badgeSubject: 'snpm',
privatePackages: [ 'snpm' ]
};
上面的配置包文件系統(tǒng)層用的是 upyun-cnpm 插件,需要在 CNPM 源碼根目錄執(zhí)行
$ npm install --save -d upyun-cnpm這個時候你的
package.json就有更改與源 Repo 不一致了,如果是 Git 克隆的用戶在以后升級更新系統(tǒng)的時候稍稍注意一下可能的沖突即可。
官方 NFS 插件
下面給出幾個官方的 NFS 插件:
- upyun-cnpm:包本體存在又拍云的插件;
- fs-cnpm:包本體存在本地的插件;
- sfs-client:包本體存在 SFS(Simple FIle Store)插件;
- qn-cnpm:包本體存在七牛的插件;
- oss-cnpm:包本體存在阿里云 OSS 的插件。
以后官方如果有一些新的插件進(jìn)來,這里可能不會更新了,請自行去 NFS Storage Wrappers 獲取最新的 NFS 插件們。
初始化數(shù)據(jù)庫
如果你使用的是 SQLite 的話,數(shù)據(jù)庫是自動就好了的,可以忽略該步。
其它數(shù)據(jù)庫需要自行導(dǎo)入初始數(shù)據(jù)庫結(jié)構(gòu)。
初始數(shù)據(jù)庫腳本在 docs/db.sql 里面,你可以用一些 GUI 工具將數(shù)據(jù)導(dǎo)入,也可以直接進(jìn)入命令行導(dǎo)入。
比如你用的是 MySQL,就可以在本機(jī)操作 MySQL。
$ mysql -u yourname -p
mysql> use cnpmjs;
mysql> source docs/db.sql
啟動服務(wù)
搞好配置之后就可以直接啟動服務(wù)了。
簡單啟動
最簡單的辦法也是我現(xiàn)在正在用的方法就是直接用 node 執(zhí)行一下入口文件就好了。
$ node dispatch.js
其實我是在 tmux 里面執(zhí)行上面的指令的。
官方腳本啟動
官方的其它一些指令,比如你可以用 NPM 的 script 來運行。
$ npm run start
在 CNPM 里面,npm script 還有下面幾種指令
npm run dev:調(diào)試模式啟動;npm run test:跑測試;npm run start:啟動 CNPM;npm run status:查看 CNPM 啟動狀態(tài);npm run stop:停止 CNPM。