1. 程式人生 > >基於cnpmjs.org構建企業私有npm庫

基於cnpmjs.org構建企業私有npm庫

為什麼要搭建?

npm——我們大家都知道是NodeJS的包管理工具,用於Node外掛的管理包括安裝、解除安裝、管理依賴等。

基於npm命令列我們可以快速的安裝專案中所依賴的程式碼模組,甚至可以自己釋出一些自己寫的外掛等。使得我們的專案開發效率得到大大的提升。

釋出到npm的模組是開源的,我們只能共享大家都能用的開源模組。

然而,現如今隨著業務越來越複雜,專案迭代速度也越來越快,那麼專案間的常用業務程式碼共享變得非常之有必要。而對於公司的業務程式碼我們當然是不能開源的。這時候就需要搭建一個類似於 http://npmjs.org 平臺私有的npm倉庫,用於企業裡面常用的業務模組,如業務元件的存放和快速安裝。

通俗一點來說,我們就是要搭建一個屬於企業內部的npm倉庫,自己管理包的同時藉助npm的命令列工具快速複用業務程式碼模組或者業務元件。

如何搭建?

業界主流的私有npm倉庫搭建的主流方案有如下幾種:

付費購買
使用 git+ssh 這種方式直接引用到 GitHub 專案地址
使用 Sinopia
使用 cnpmjs.org
本文將主要講解第4種。

本地測試環境:

window10
node v8.10.0
npm v5.6.0
mysql v8.0

=======================================

1. 安裝或者下載cnpmjs.org

通過npm安裝,安裝時需要加上版本號,如果沒有版本號目前安裝的2.19.4。beta版的資料庫有16張表,而2.x只有14張表。

npm install -g [email protected]
通過github直接下載cnpmjs.org

https://github.com/cnpm/cnpmjs.org

2. 修改配置

開啟配置檔案: cnpmjs.org/config/index.js

部分配置說明如下,來自 https://www.colabug.com/2731929.html

/*
 * server configure //伺服器配置
 */

registryPort: 7001
, //倉庫訪問埠(執行釋出安裝) webPort: 7002, //展示查詢站點訪問埠 bindingHost: '', //監聽繫結的 Host,預設127.0.0.1,外網訪問註釋掉此項即可 /** * database config //資料庫相關設定 */ database: { db: 'cnpmjs', //資料庫名稱 username: 'root', //資料庫訪問賬號 password: '123456', //資料庫訪問密碼 // the sql dialect of the database // - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb' dialect: 'mysql', //使用資料庫,預設sqlite,這裡我們改成mysql // custom host; default: 127.0.0.1 host: '127.0.0.1', //資料庫訪問IP,通常127.0.0.1 // custom port; default: 3306 port: 3306, //資料庫訪問埠,通常3306 // 模組檔案儲存,預設將釋出的私有模組跟快取公共模組儲存在本地檔案系統中,路徑~/.cnpmjs.org/nfs ,也就是模組檔案都儲存在這個目錄下;或者可以選擇三方儲存方式比如七牛等,著這裡配置外掛;也支援介面開發擴充套件儲存; nfs: require('fs-cnpm')({ dir: path.join(dataDir, 'nfs') }), // registry url name //模組註冊列表訪問域名,預設r.cnpmjs.org,安裝模組時會到這個域名下查詢,這個預設設定略坑,建議沒有外網域名的先清空回頭再配 registryHost: '', // default system admins //預設管理員賬號 admins: { // name: email //fengmk2: '[email protected]', admin: '[email protected]', //dead_horse: '[email protected]', }, /* * registry mode config 私有模組釋出相關配置 */ //是否開啟私有模式,預設為 false; //私有模式下只有管理員能釋出模組,其他賬號只有同步許可權 //非私有模式,註冊使用者都可以釋出模組 enablePrivate: false, // registry scopes //若為非私有模式釋出則此項必填,非管理員釋出模組式命名必須以scopes欄位開頭,模組命名示例“@cnpm/packagename” //更多瞭解npm-scope請查閱https://docs.npmjs.com/misc/scope scopes: [ '@cnpm', '@cnpmtest', '@cnpm-test' ], // 私有模組非scopes白名單,各種非以scope方式釋出的老模組的白名單管理,陣列形式維護 privatePackages: [], /** * sync configs 同步源倉庫相關設定 */ //npm官方registry地址,不會直接從這個地址同步模組,但有時會從這裡獲取模組資訊,除非必要請勿更改 officialNpmRegistry: 'https://registry.npmjs.com', officialNpmReplicate: 'https://replicate.npmjs.com', //同步模組上游registry地址 sourceNpmRegistry: 'https://registry.npm.taobao.org', //上游registry是否是cnpm,預設true,若要使用npm官方地址作為同步上游,請設定為false sourceNpmRegistryIsCNpm: true, //若安裝時模組不存在,是否向源registry進行同步,預設true syncByInstall: true, // 同步模式選項 // none: 不進行同步,只管理使用者上傳的私有模組,公共模組直接從上游獲取 // exist: 只同步已經存在於資料庫的模組 // all: 定時同步所有源registry的模組 syncModel: 'exist', // 'none', 'all', 'exist' // 同步時間間隔,預設10分鐘 syncInterval: '10m', // 是否同步模組中devDependencies,預設false syncDevDependencies: false, //使用者賬號系統接入,可以擴充套件接入公司的賬號系統 //詳見https://github.com/cnpm/cnpmjs.org/wiki/Use-Your-Own-User-Authorization userService: null, enableAbbreviatedMetadata: true,

最主要的配置是資料庫配置,一般情況下資料庫配置正確都可以正常啟動。

3. 匯入資料庫

進入資料庫(怎麼進自行百度);

建立資料庫;

create database cnpmjs;

切換到cnpm資料庫

use cnpmjs;

匯入cnpm資料庫配置檔案

檔案位於cpm安裝目錄docs/db.sql下

source docs/db.sql;

檢視匯入的表

我這個版本共匯入16個表

show tables;
  1. 啟動
    由於cnpmjs.org本身並不支援window環境,所以在window啟動需要修改一些東西

可以直接

node dispatch.js

也可修改package.json

"dev": "DEBUG=cnpm* node dispatch.js" 

改為

"dev": "set DEBUG=cnpm* node dispatch.js" 

啟動後訪問 ip:7002 頁面如下

  1. 使用cnpm
    安裝cnpm
npm i -g cnpm

把cnpm的registry指向我們的私有npm服務ip

cnpm config set registry ip:7001

之後cnpm的使用就與npm一致了,登入、釋出包等

問題總結:
在連結資料庫的過程中出現了一直連不上的情況,後經查閱資料發現是mysql版本的問題,使用較高版本的mysql會出現驗證失敗的問題,通過修改一次密碼即可解決該問題。

UPDATE mysql.user SET password=PASSWORD('newpassword') WHERE User='root';