什麼是CPM
CPM 是一套輕量且基礎功能完善的私有Node包管理源。它是基於 clusic 的 rex 架構開發,擁有程式負載均衡的特點。它主要提供一整套簡易安裝模式,使用者只需要clone此專案到本地,修改config資料夾下的檔案即可執行。它的資料來源基於mysql資料庫和redis快取(支援redis叢集),能夠有效提高NPM包的下載速度。它還擁有自定義使用者系統接入的功能,讓企業可以自主接入自己的使用者體系,同時可以根據使用者的scopes來確定使用者提交私有包的許可權。
文件
詳細請移步 這裡
預覽
搭建
CPM搭建的前提條件是:
- Nodejs >= 8.0.0
- MySQL >= 5.6.16
- Redis 無限制
請先搭建好以上的環境。
下載
我們需要從Github下載我們的程式。
$ git clone https://github.com/cevio/cpm.git
複製程式碼
請下載穩定的master分支,其他分支僅開發使用,不建議下載。下載完畢後開啟 database.sql
檔案,建立mysql資料庫。
依賴
安裝必要的依賴,以便我們可以驗證程式是否可以啟動。
$ npm i -g @clusic/cli pm2
$ cd cpm
$ npm i
複製程式碼
@clusic/cli
是clusic架構的開發工具。
開發除錯
$ npm run dev
複製程式碼
安裝完畢依賴,我們即可以啟動程式。但是你會發現報錯,因為我們沒有指定使用者驗證體系。
Error: You should setup your own `UserService` first
at module.exports (/Users/shenyunjie/code/mzftech/cpm/app.bootstrap.js:7:11)
at WorkerService.createService (/Users/shenyunjie/code/mzftech/cpm/node_modules/@clusic/rex/lib/app.js:106:15)
at process._tickCallback (internal/process/next_tick.js:68:7)
at Function.Module.runMain (internal/modules/cjs/loader.js:744:11)
at startup (internal/bootstrap/node.js:285:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)
複製程式碼
請不要緊張,這是非常正常的。
修改配置
配置有兩個地方需要修改:
- config/config.{env}.js
{env}
表示你的環境變數,一般開發是config.development.js
,生產環境是config.production.js
。你可以自由修改引數配置。注意registryHost
屬性必須修改為你自己的http://127.0.0.1:7002
,否則下載包會報錯,如果上線後,請直接修改為你的域名,比如http://npm.example.com
。 - config/plugin.{env}.js
{env}
同上。一般是用來配置外掛的資料,這裡我們需要根據環境不通來修改mysql
和redis
的資料配置。注意,redis如果需要支援叢集模式,請將redis的配置下面的options
程式設計一個等價資料結構的陣列即可。
完成上面修改後,我們僅需要支援下使用者即可。
使用者體系
使用者體系分兩個函式需要實現:
Login()
登入驗證函式User()
使用者查詢函式
我們需要執行命令:
$ clusic add authorization --service
複製程式碼
程式的app/service/
下面會自動建立一個檔案叫authorization.js
,這個檔案就是我們的使用者體系檔案。
為了測試啟動,我們可以直接複製下面程式碼來快速建立使用者體系函式:
const { ContextComponent } = require('@clusic/method');
module.exports = class AuthorizationService extends ContextComponent {
constructor(ctx) {
super(ctx);
}
async Login(account, password) {
return {
account: account,
name: account,
email: account + '@cpm.com',
avatar: 'https://i.loli.net/2017/08/21/599a521472424.jpg',
scopes: ['@' + account, '@html5', '@node'],
extra: {}
}
}
async User(account) {
return {
account: account,
name: account,
email: account + '@cpm.com',
avatar: 'https://i.loli.net/2017/08/21/599a521472424.jpg',
scopes: ['@' + account, '@html5', '@node'],
extra: {}
}
}
};
複製程式碼
儲存後,你可以在專案根目錄下通過以下命令啟動檢視:
$ npm run dev
複製程式碼
開啟http://127.0.0.1:7002
即可看到我們的頁面。恭喜你,那麼你可以使用CPM了。
命令支援
CPM支援以下的命令組合:
$ npm login --registry=http://npm.test.cn
$ npm logout --registry=http://npm.test.cn
$ npm install (with no args, in package dir) --registry=http://npm.test.cn
$ npm install [<@scope>/]<name> --registry=http://npm.test.cn
$ npm install [<@scope>/]<name>@<tag> --registry=http://npm.test.cn
$ npm install [<@scope>/]<name>@<version> --registry=http://npm.test.cn
$ npm install [<@scope>/]<name>@<version range> --registry=http://npm.test.cn
$ npm install <git-host>:<git-user>/<repo-name> --registry=http://npm.test.cn
$ npm install <git repo url> --registry=http://npm.test.cn
$ npm install <tarball file> --registry=http://npm.test.cn
$ npm install <tarball url> --registry=http://npm.test.cn
$ npm install <folder> --registry=http://npm.test.cn
$ npm update [-g] [<pkg>...] --registry=http://npm.test.cn
$ npm uninstall [<@scope>/]<pkg>[@<version>]... [-S|--save|-D|--save-dev|-O|--save-optional|--no-save] --registry=http://npm.test.cn
$ npm publish [<tarball>|<folder>] [--tag <tag>] [--otp otpcode] [--dry-run] --registry=http://npm.test.cn
$ npm unpublish [<@scope>/]<pkg>[@<version>] --registry=http://npm.test.cn
$ npm whoami [--registry <registry>] --registry=http://npm.test.cn
$ npm owner add <user> [<@scope>/]<pkg> --registry=http://npm.test.cn
$ npm owner rm <user> [<@scope>/]<pkg> --registry=http://npm.test.cn
$ npm owner ls [<@scope>/]<pkg> --registry=http://npm.test.cn
$ npm deprecate <pkg>[@<version>] <message> --registry=http://npm.test.cn
$ npm view [<@scope>/]<name>[@<version>] --registry=http://npm.test.cn
$ npm dist-tag add <pkg>@<version> [<tag>] --registry=http://npm.test.cn
$ npm dist-tag rm <pkg> <tag> --registry=http://npm.test.cn
$ npm dist-tag ls [<pkg>] --registry=http://npm.test.cn
$ npm access public [<package>] --registry=http://npm.test.cn
$ npm access restricted [<package>] --registry=http://npm.test.cn
複製程式碼
對於內部私有包而言,這些命令已經足夠使用,如果需要擴充套件,可以自行擴充套件,或者在 Github 上提Issue給我,我酌情考慮新增升級。
簡化命令
在每個命令後面寫上 --registry=http://npm.test.cn 比較繁瑣,那麼我們可以自己生成一個命令叫cpm簡化它。你可以通過 yeoman 開始建立你們的CPM命令:
const childProcess = require('child_process');
const argv = process.argv.slice(2);
argv.push('--registry=http://npm.test.cn');
childProcess.spawn('npm', argv, { stdio: 'inherit' });
複製程式碼
請修改上面的http://npm.test.cn
為你自己的服務地址。
原理是在我們通過cpm
命令代替 npm
命令的時候,在命令的最末尾加上一個 --registry=http://npm.test.cn
指向我們的 Registry。
我們完全可以用cpm
代替掉npm
了。比如
$ cpm login
$ cpm install vue
$ cpm publish
複製程式碼
其他簡化命令的方法有很多,你可以下載npm install nrm -g
等來切換。
深入使用者體系
上面有一串測試用的程式碼,我們來剖析下。不論是Login
還是User
函式都返回如下的資料結構:
- account
string
使用者賬號,唯一性的。 - name
string
使用者姓名 - email
string
使用者郵箱 - avatar
string
使用者頭像 - scopes
array
使用者私有域陣列
至於 extra
是額外引數,可以隨意傳,作用在web介面上。而scope
,你可以通過自己的邏輯程式碼給不同使用者提供可以上傳的scopes
作用域。
scopes作用域作用結果都是在使用者執行
cpm login
後生效。如果你改動過程式碼,需要使用者重新登入生效。
上線
上線生成環境需要將production
配置完整才能上線,上到伺服器後執行命令:
$ npm run start
複製程式碼
更新
考慮到一般企業擁有自己的gitlab,當然會clone一份到自己的倉庫,所以請在clone後執行rm -rf .git
,清除源倉庫的引用。你可以提交本程式到你自己的倉庫。更新的時候只需要執行
npm run update
複製程式碼
執行完畢這個命令,我們會從github上將master分支的程式碼通過zip包模式下載,覆蓋到本地,當然這是全量覆蓋的。由於您的git倉庫的存在,所以可以對比出修改了哪些檔案,你可以revert或者自己處理非app/下的檔案內容,一般都是配置。然後修改提交上線即可。
如果是線上上,當然是git pull
拉去你已經本地更新好的檔案,然後通過命令:
$ npm run restart
複製程式碼
感謝
感謝大家使用CPM,如有疑問請提交issue,我會幫忙解答。