npm私服搭建
使用cnpm來搭建npm私服
- sinopia雖然也可以,安裝簡單,不過沒有cnpm功能強大。推薦使用cnpm
- cnpm是使用koa的框架搭建的,另外可配置成sqlite、mysql等數據庫,sequelize是一個ORM框架,有興趣可以瞭解一下相關知識
下載項目
http://github.com/cnpm/cnpm.org,
安裝項目所需的依賴包
- 確保你裝了node,在當前項目路徑下執行
npm install
- 這個步驟可能會出現err(之前在一臺機子上遇到過),可以不用管,確保安裝了對應的依賴就行
- 可以試一下執行
node dispatch
開啓項目,沒報錯的話還是能用的。
配置相關信息 配置文件在config/index.js
裏面
- 服務器相關文件的地址配置,可以不用動
var dataDir = path.join(process.env.HOME || root, '.cnpmjs.org');
- 註釋掉
bindingHost
,這個配置是綁定訪問的ip地址爲127.0.0.1,即是隻能本地訪問。 這裏重點是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,
- 修改屬性
registryHost: '127.0.0.1:7001',
沒深究這個屬性幹嘛的,設置成這樣不會錯。 syncModel
一般設置成exist
,不要設置成none
,不然publish個包都出問題。至於all
最好不要,這個會更新網上倉庫所有的包,看了下github issues說:需要1T的空間,數據庫數據要40G~
syncModel:'exist'
enableAbbreviatedMetadata:true
如果不改成true的話sync的時候提示這個要設置成true的。
數據庫相關
- 檢查你之前config/index.js那裏
dialect
的值。
- 如果是mysql的話,就建mysql數據庫,
db: 'cnpm'
名稱就是設置的這個 - 如果是sqlite的話 ,你可以執行
node dispatch
啓動服務器,然後在.cnpmjs.org裏面會有個data.sqlite文件,我們的sqlite的數據庫數據都在這裏文件裏面,具體可以百度一下sqlite吧
- 如果是mysql的話,就建mysql數據庫,
- 最重要的一點,你必須要初始化你的數據庫。
你可以拷貝doc/db.sql去初始化mysql或者sqlite數據庫
還有一種方法,打開test文件夾,你會看到有個init_db.js文件,對,執行node test/init_db
也可以初始化數據庫 - 如果你是mysql數據庫,初始化數據庫的時候發現報錯,可能是你的mysql版本問題導致的,我遇到過的就是utfmb4和複合索引長度問題。如果對sql比較熟的話可以修改一下sql腳本來解決。
- 最後注意個地方,如果你用的是mysql的話,在
common/sequelize
加個配置database.timezone="+08:00"
,不然squelize會默認使用UTC時間,這樣入庫時間字段gmt_create會少8個小時。sqlite則不需要這樣。
啓動服務器
- 執行
node dispatch
,其實在linux環境下的話,可以執行npm start
,這個腳本會執行bin/nodejsctl
文件,可以打開看看。 - 這裏這個cnpm就搭建起來了,打開瀏覽器訪問
127.0.0.1:7002
可以看到,隨便搜索個插件例如gulp
,會發現找不到,這時你可以點擊sync,來同步對應的。這裏說一點,服務器會把所有對應的插件和依賴的所有版本同步下來。剛開始的時候會等很久,synclog頁面可能會出現死掉的情況(具體不知道爲什麼),不過沒關係,服務器有在跑的,跑一兩個小時都有可能。我下載一下常用的插件到最後nfs文件夾都10多g了。
發佈你自己的包
首先npm倉庫地址設置成自己的服務器的,或者執行npm的時候加 –registry
npm set registry http://服務器地址:7001
- 發佈包的時候不加私有域的話是要登錄管理員帳號的,可以查看config/index.js,找到admins屬性那些就是管理員了,你可以加上你喜歡的,不過查找數據庫user表會發現沒有admin等這些管理員,我是自己參考
test/init_db.js
來創建admin的,反正最後數據庫user表要存在對應的名稱就行。 - 登錄
npm login
根據提示即可。注意,發佈到共有域要登錄管理員 - cd 到你的項目目錄沒有package.json的還執行
npm init
,然後執行npm publish
即可
注意事項
- window下可以搭建cnpm,不一定linux或centos
- sync的時候不要停掉服務器,不確定會出什麼問題,有時候會同步很久,就讓服務器掛在那裏就好,不要停掉
- 如果
npm publish
提示401或者403錯誤,請檢查你登錄的是管理員帳號,確認配置文件和數據庫user表有沒有對應名稱 - 包同步下來後服務器可以離線運行,我公司服務器就是離線環境。我修改了源碼做了相關的增量更新機制,這個不復雜,看了下源碼,受益良多。
- 服務器可以使用pm2做進程守護,這樣不怕別人關我的cmd啦~
最後如果有遺漏或者錯誤的地方可以提醒我~