npm私服搭建

npm私服搭建

使用cnpm來搭建npm私服

  1. sinopia雖然也可以,安裝簡單,不過沒有cnpm功能強大。推薦使用cnpm
  2. cnpm是使用koa的框架搭建的,另外可配置成sqlite、mysql等數據庫,sequelize是一個ORM框架,有興趣可以瞭解一下相關知識

下載項目

http://github.com/cnpm/cnpm.org,

安裝項目所需的依賴包

  • 確保你裝了node,在當前項目路徑下執行 npm install
  • 這個步驟可能會出現err(之前在一臺機子上遇到過),可以不用管,確保安裝了對應的依賴就行
  • 可以試一下執行 node dispatch 開啓項目,沒報錯的話還是能用的。

配置相關信息 配置文件在config/index.js裏面

  1. 服務器相關文件的地址配置,可以不用動
    var dataDir = path.join(process.env.HOME || root, '.cnpmjs.org');
  2. 註釋掉bindingHost,這個配置是綁定訪問的ip地址爲127.0.0.1,即是隻能本地訪問。
  3. 這裏重點是dialect這裏,你可以選擇用sqlite,也可以用mysql。sqlite是一個零配置的數據庫,你可以用navicat來查看裏面的數據,sqlite文件在.cnpmjs.org/data.sqlite。

        db: 'cnpm',//數據庫名稱,自己隨便定義
        username: 'root',
        password: 'root',
    
        // the sql dialect of the database
        // - currently supported: 'mysql', 'sqlite', 'postgres', 'mariadb'
        dialect: 'mysql',//這裏改成mysql
    
        // custom host; default: 127.0.0.1
        host: '127.0.0.1',
    
        // custom port; default: 3306
        port: 3306,
  4. 修改屬性registryHost: '127.0.0.1:7001',沒深究這個屬性幹嘛的,設置成這樣不會錯。
  5. syncModel一般設置成exist,不要設置成none,不然publish個包都出問題。至於all最好不要,這個會更新網上倉庫所有的包,看了下github issues說:需要1T的空間,數據庫數據要40G~
    syncModel:'exist'
  6. enableAbbreviatedMetadata:true如果不改成true的話sync的時候提示這個要設置成true的。

數據庫相關

  1. 檢查你之前config/index.js那裏dialect的值。
    • 如果是mysql的話,就建mysql數據庫,db: 'cnpm'名稱就是設置的這個
    • 如果是sqlite的話 ,你可以執行node dispatch啓動服務器,然後在.cnpmjs.org裏面會有個data.sqlite文件,我們的sqlite的數據庫數據都在這裏文件裏面,具體可以百度一下sqlite吧
  2. 最重要的一點,你必須要初始化你的數據庫。
    你可以拷貝doc/db.sql去初始化mysql或者sqlite數據庫
    還有一種方法,打開test文件夾,你會看到有個init_db.js文件,對,執行node test/init_db也可以初始化數據庫
  3. 如果你是mysql數據庫,初始化數據庫的時候發現報錯,可能是你的mysql版本問題導致的,我遇到過的就是utfmb4和複合索引長度問題。如果對sql比較熟的話可以修改一下sql腳本來解決。
  4. 最後注意個地方,如果你用的是mysql的話,在common/sequelize加個配置database.timezone="+08:00",不然squelize會默認使用UTC時間,這樣入庫時間字段gmt_create會少8個小時。sqlite則不需要這樣。

啓動服務器

  1. 執行node dispatch,其實在linux環境下的話,可以執行npm start,這個腳本會執行bin/nodejsctl文件,可以打開看看。
  2. 這裏這個cnpm就搭建起來了,打開瀏覽器訪問127.0.0.1:7002可以看到,隨便搜索個插件例如gulp,會發現找不到,這時你可以點擊sync,來同步對應的。這裏說一點,服務器會把所有對應的插件和依賴的所有版本同步下來。剛開始的時候會等很久,synclog頁面可能會出現死掉的情況(具體不知道爲什麼),不過沒關係,服務器有在跑的,跑一兩個小時都有可能。我下載一下常用的插件到最後nfs文件夾都10多g了。

發佈你自己的包

  1. 首先npm倉庫地址設置成自己的服務器的,或者執行npm的時候加 –registry

    npm set registry http://服務器地址:7001
    
  2. 發佈包的時候不加私有域的話是要登錄管理員帳號的,可以查看config/index.js,找到admins屬性那些就是管理員了,你可以加上你喜歡的,不過查找數據庫user表會發現沒有admin等這些管理員,我是自己參考test/init_db.js來創建admin的,反正最後數據庫user表要存在對應的名稱就行。
  3. 登錄npm login根據提示即可。注意,發佈到共有域要登錄管理員
  4. cd 到你的項目目錄沒有package.json的還執行npm init,然後執行npm publish即可

注意事項

  1. window下可以搭建cnpm,不一定linux或centos
  2. sync的時候不要停掉服務器,不確定會出什麼問題,有時候會同步很久,就讓服務器掛在那裏就好,不要停掉
  3. 如果npm publish提示401或者403錯誤,請檢查你登錄的是管理員帳號,確認配置文件和數據庫user表有沒有對應名稱
  4. 包同步下來後服務器可以離線運行,我公司服務器就是離線環境。我修改了源碼做了相關的增量更新機制,這個不復雜,看了下源碼,受益良多。
  5. 服務器可以使用pm2做進程守護,這樣不怕別人關我的cmd啦~

最後如果有遺漏或者錯誤的地方可以提醒我~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章