動手搭建一個私有倉儲

痛點

  • 有時候執行npm install命令安裝某些模塊的時候,特別慢,常常安裝失敗
  • 公司內部的模塊如何維護?

咱們須要一個可以讓公司內部模塊穩定維護的私有倉儲,並且這個倉儲還可以穩定的提供經過npm install獲取的安裝包,那麼cnpm來了~前端

CNPM是什麼

CNPM是一個私有的Nodejs庫,使用CNPM 有以下理由:node

  • 確保npm服務快速、穩定:對於企業來講,上線生產系統的時候,須要花半小時甚至更久等待npm模塊依賴安裝完畢,是不可接受的。部署鏡像後,能夠確保高速、穩定的npm服務。mysql

  • 發佈私有模塊:官方的npm上的模塊所有是開源的。一些與企業業務邏輯相關的模塊可能不適合開源。這部分私有的模塊放在私有NPM倉庫中,使用起來各類方便。git

  • 控制npm模塊質量和安全:npm上的模塊質量良莠不齊,搭建私有倉庫,能夠更嚴格地控制模塊的質量和安全,只有通過審覈的模塊才容許被加入私有倉庫。github

  • 使用MySQL替換了CouchDB,更容易部署。同時因爲大部分開發者更熟悉MySQL,所以架設起來更方便。web

  • 部署簡單:只須要五分鐘sql

從CNPM的架構圖中,咱們能夠看出CNPM是對NPM作的鏡像服務,CNPM會按期同步NPM的資源庫,同時CNPM支持發佈私有的庫,這樣就很是方便地集成了公有庫和私有庫,對於公司內部的開發者來講,基本感受不到兩種庫的區別。數據庫

搭建CNPM服務

從官方文檔中,咱們看到CNPM服務器環境,只須要Node(0.11.12) + MySQL(>= 0.5.0),另外咱們還須要Linux的環境,接下來就讓咱們動手本身搭建一個私有NPM的服務器npm

  • 準備:數組

    Linux 操做系統,如 Ubuntu 12.04.5 LTS
      Node: v6.0.0
      Npm: 3.8.6
      數據庫 ,如 MySQL: 5.5.40
      Git客戶端
    複製代碼
  • 從github下載項目源代碼,安裝項目依賴

    git clone https://github.com/cnpm/cnpmjs.org.git
      cd cnpmjs.org
      npm install
    複製代碼
  • 在config目錄下新建一個config.js 文件,能夠參考官方推薦的一些配置

    下面列出一些經常使用的配置說明

    • enableCluster:是否啓用 cluster-worker 模式啓動服務,默認 false,生產環節推薦爲 true;
    • registryPort:API 專用的 registry 服務端口,默認 7001;
    • webPort:Web 服務端口,默認 7002;
    • bindingHost:監聽綁定的 Host,默認爲 127.0.0.1,若是外面架了一層本地的 Nginx 反向代理或者 Apache 反向代理的話推薦不用改;
    • sessionSecret:session 用的鹽;
    • logdir:日誌目錄;
    • uploadDir:臨時上傳文件目錄;
    • viewCache:視圖模板緩存是否開啓,默認爲 false;
    • enableCompress:是否開啓 gzip 壓縮,默認爲 false;
    • admins:管理員們,這是一個 JSON Object,對應各鍵名爲各管理員的用戶名,鍵值爲其郵箱,默認爲 { fengmk2: 'fengmk2@gmail.com', admin: 'admin@cnpmjs.org', dead_horse: 'dead_horse@qq.com' };
    • logoURL:Logo 地址,不過對於我這個已經把 CNPM 前端改得面目全非的人來講已經忽略了這個配置了;
    • adBanner:廣告 Banner 的地址;
    • customReadmeFile:實際上咱們看到的 cnpmjs.org 首頁中間一大堆冗長的介紹是一個 Markdown 文件轉化而成的,你能夠設置該項來自行替換這個文件;
    • customFooter:自定義頁腳模板;
    • npmClientName:默認爲 cnpm,若是你有本身開發或者 fork 的 npm 客戶端的話請改爲本身的 CLI 命令,這個應該會在一些頁面的說明處替換成你所寫的;
    • backupFilePrefix:備份目錄;
    • database:數據庫相關配置,爲一個對象,默認若是不配置將會是一個 ~/.cnpmjs.org/data.sqlite 的 SQLite;
    • db:數據的庫名;
    • username:數據庫用戶名;
    • password:數據庫密碼;
    • dialect:數據庫適配器,可選 "mysql"、"sqlite"、"postgres"、"mariadb",默認爲 "sqlite";
    • hsot:數據庫地址;
    • port:數據庫端口;
    • pool:數據庫鏈接池相關配置,爲一個對象;
    • maxConnections:最大鏈接數,默認爲 10;
    • minConnections:最小鏈接數,默認爲 0;
    • maxIdleTime:單條連接最大空閒時間,默認爲 30000 毫秒;
    • storege:僅對 SQLite 配置有效,數據庫地址,默認爲 ~/.cnpmjs/data.sqlite;
    • nfs:包文件系統處理對象,爲一個 Node.js 對象,默認是 fs-cnpm 這個包,而且配置在 ~/.cnpmjs/nfs 目錄下,也就是說默認全部同步的包都會被放在這個目錄下;開發者可使用別的一些文件系統插件(如上傳到又拍雲等),又或者本身去按接口開發一個邏輯層,這些都是後話了;
    • registryHost:暫時還未試過,我猜是用於 Web 頁面顯示用的,默認爲 r.cnpmjs.org;
    • enablePrivate:是否開啓私有模式,默認爲 false; 若是是私有模式則只有管理員能發佈包,其它人只能從源站同步包; 若是是非私有模式則全部登陸用戶都能發佈包;
    • scopes:非管理員發佈包的時候只能用以 scopes 裏面列舉的命名空間爲前綴來發布,若是沒設置則沒法發佈,也就是說這是一個必填項,默認爲 [ '@cnpm', '@cnpmtest', '@cnpm-test' ],據蘇千大大解釋是爲了便於管理以及讓公司的員工自覺按需發佈;更多關於 NPM scope 的說明請參見 npm-scope;
    • privatePackages:就如該配置項的註釋所述,出於歷史包袱的緣由,有些已經存在的私有包(可能以前是用 Git 的方式安裝的)並無以命名空間的形式來命名,而這種包原本是沒法上傳到 CNPM 的,這個配置項數組就是用來加這些例外白名單的,默認爲一個空數組;
    • sourceNpmRegistry:更新源 NPM 的 registry 地址,默認爲 https://registry.npm.taobao.org;
    • sourceNpmRegistryIsCNpm:源 registry 是否爲 CNPM,默認爲 true,若是你使用的源是官方 NPM 源,請將其設爲 false;
    • syncByInstall:若是安裝包的時候發現包不存在,則嘗試從更新源同步,默認爲 true;
    • syncModel:更新模式(不過我以爲是個 typo),有下面幾種模式能夠選擇,默認爲 "none";
      • "none":永不一樣步,只管理私有用戶上傳的包,其它源包會直接從源站獲取;
      • "exist":定時同步已經存在於數據庫的包;
      • "all":定時同步全部源站的包;
    • syncInterval:同步間隔,默認爲 "10m" 即十分鐘;
    • syncDevDependencies:是否同步每一個包裏面的 devDependencies 包們,默認爲 false;
    • badgeSubject:包的 badge 顯示的名字,默認爲 cnpm;
    • userService:用戶驗證接口,默認爲 null,即無用戶相關功能也就是沒法有用戶去上傳包,該部分須要本身實現接口功能並配置,如與公司的 Gitlab 相對接,這也是後話了;
    • alwaysAuth:是否始終須要用戶驗證,即使是 $ cnpm install 等命令;
    • httpProxy:代理地址設置,用於你在牆內源站在牆外的狀況。

    閱讀了上面的配置,你可能會編寫一份以下的配置文件

    module.exports = {
          debug: false,
          enableCluster: true, // enable cluster mode
          mysqlServers: [
            {
              host: 'localhost',
              port: 3306,
              user: 'root',
              password: 'xxxxxx',
            }
          ],
          mysqlDatabase: 'cnpmjs',
          enablePrivate: true, // enable private mode, only admin can publish, other use just can sync package from source npm
          admins: {
            admin: 'example@example.com',
          },
          scopes:['@IModules'],
          syncModel: 'exist'// 'none', 'all', 'exist'
      };
    複製代碼
  • 建立並初始化MySQL數據庫

    $ mysql -u yourname -p
      mysql> use cnpmjs;
      mysql> source docs/db.sql
    複製代碼
  • 啓動CNPM服務器,默認會打開兩個端口,7001用於NPM的註冊服務,7002用於Web訪問。

    node --harmony_generators dispatch.js
    複製代碼

    或者 npm run start npm run dev:調試模式啓動; npm run test:跑測試; npm run start:啓動 CNPM; npm run status:查看 CNPM 啓動狀態; npm run stop:中止 CNPM。

  • 瀏覽器訪問CNPM私有倉庫

    127.0.0.1:7002
    複製代碼

終於正常了,這樣就成功搭建了私有的NPM註冊服務。

配置npm源爲公司內部倉庫

  • 配置npm 源爲公司私有倉庫

    npm config set registry http://cnpm.xxx.cn/ #這個是將上文IP映射的域名
    複製代碼
  • 查看是否操做成功

    npm config ls
    複製代碼

執行命令,來安裝一個私有庫(後面的文章會建立)

npm install --save @IModules/IUtils@0.2.0-snapshot
複製代碼

載的時候指定咱們本身的私有庫,這樣就會從咱們本身的私有庫中下載。若是私有庫沒有對應的庫,CNPM會自動同步到NPM 找到咱們要下載的庫和版本,先在CNPM中存一份,而後再傳給客戶端一份,運行原理和Maven的原理同樣。 或者使用以下命令,臨時安裝 npm install winston --registry=http://127.0.0.1:7002

工具庫

私有倉儲創建起來了,後面就開始動手創建上文中提到的IUtils庫併發布到私有倉儲

這裏我提供一份支持發佈的私有庫文件,具體的請參考這裏

相關文章
相關標籤/搜索