使用 pm2 + sinopia 搭建本地 npm 私有倉庫

背景

  • 每次構(gòu)建,靜態(tài)資源構(gòu)建花費(fèi)的時間基本在半個小時,搭個私有倉庫是否能提升構(gòu)建速度。
  • 可以將內(nèi)部的公共 js lib 抽取發(fā)布出來共用。

相關(guān)準(zhǔn)備

  • 具有不可描述權(quán)限的機(jī)器一臺。
  • nodejs。
  • gcc及其相關(guān)(nodejs依賴)。
  • pm2(node app監(jiān)控重啟)。
  • sinopia(私有倉庫app,類似 nexus)。

搭建步驟

安裝 nodejs

下載 binary ,用 tar 命令解壓縮,然后添加環(huán)境變量。

tar -Jxvf node-v8.9.3-linux-x64.tar.xz 

// 修改.bash_profile 
vi .bash_profile 
// 添加內(nèi)容 
export NODE_HOME=/opt/ibank/node-v8.9.3-linux-x64 
export PATH=$PATH:$NODE_HOME/bin 
export NODE_PATH=$NODE_HOME/lib/node_modules 

// 更新 
source .bash_profile 

ISSUE: 網(wǎng)上說要添加軟鏈接 ln -s /[your node path] /usr/local/bin ,實(shí)際上并不需要。

然后,node -v。

  • 分支1:GLIBCXX_3.4.11 not found,升級gcc。
  • 分支2:輸出版本號。

升級gcc(備選)

下載gcc,解壓,查看依賴。這里下的4.9.4,畢竟之前大版本是4,免得跨大版本扯到蛋。

tar -zxvf gcc-4.9.4.tar.gz 
vi ./gcc-4.9.4/contrib/download_prerequisites 

下載依賴庫 mpfr,gmp,isl,cloog,mpc并解壓,按照download_prerequisites腳本跑一遍命令添加軟鏈接,如:

MPFR=mpfr-2.4.2 
GMP=gmp-4.3.2 
MPC=mpc-0.8.1 
#下載 
wget [ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPFR.tar.bz2](ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPFR.tar.bz2) || exit 1 
#解壓 
tar xjf $MPFR.tar.bz2 || exit 1 
#軟鏈接 
ln -sf $MPFR mpfr || exit 1 

在gcc源碼目錄外建立自己的gcc-build目錄,然后運(yùn)行configure,配置根據(jù)自己需要選擇。如我的gcc-buildgcc-4.9.4是同級目錄。

../gcc-4.9.4/configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.3 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.3 --enable-linux-futex --without-system-libunwind --with-cpu=generic --build=x86_64-suse-linuxgeneric --build=x86_64-suse-linux 

然后make && make install。

ISSUE: 安裝過程中缺少zlib,自行下載、解壓、./configuremake && make install即可。

備份之前的 libstdc++.so.6

mv libstdc++.so.6 libstdc++.so.6.bak 

更新軟鏈接。

ln -s /usr/lib64/gcc-4.9.4/libstdc++.so.6.20  /usr/lib64/libstdc++.so.6 

此時node -v輸出版本號。

搭建私有倉庫

內(nèi)網(wǎng)需要連接代理,設(shè)置注冊中心。這里連到內(nèi)網(wǎng)代理 nexus 。

npm set proxy [http://$](https://outlook.live.com/mail/){your nodejs proxy address} 
npm set registry [http://$](https://outlook.live.com/mail/){your nodejs registry} 

安裝 pm2、sinopia 和 sinopia-pm2-starter 。

npm install -g pm2 
npm install -g sinopia 
npm install -g sinopia-pm2-starter 

使用方式:

sinopia-pm2-starter --help 
sinopia-pm2-starter config:host '0.0.0.0' 
sinopia-pm2-starter config:post ${port} 
sinopia-pm2-starter start 

修改現(xiàn)在內(nèi)網(wǎng)客戶端的 npm 配置。

npm set proxy null 
npm set registry [http://$](https://outlook.live.com/mail/){address}:${port}/ 

ISSUE: '@storybook/cli' is not in the npm registry,需要修改 sinopia 配置,增加proxy。

vi .config/sinopia/config.yaml 
packages: 
  '@*/*': 
    # scoped packages 
    access: $all 
    publish: $authenticated 
    proxy: npmjs #<====add this 
sinopia-pm2-starter restart 

驗(yàn)證

修改 autopackage.batcall "C:\nodejs\npm" config set registry ${sinopiaAddress},提交構(gòu)建。

  • 初始:最后一個構(gòu)建的項(xiàng)目,平均 autopackage.bat 耗時24分鐘。
  • 項(xiàng)目構(gòu)建時間提前到第一個:平均 autopackage.bat 耗時18分鐘。
  • 現(xiàn)在:16分鐘。無明顯提升。

分析日志,nexus 本身自帶緩存,在下載 npm lib 方面不存在提升空間。主要問題在于每次構(gòu)建會刪除之前構(gòu)建的目錄,包括 node_modules,導(dǎo)致 npm install 時下載時間較短,安裝時間較長。

沒關(guān)系,最終目的是要管理職能組內(nèi)部的公共模塊。

發(fā)布

首先,在 sinopia 添加用戶。

:~> npm adduser --registry ${sinopiaAddress} 
Username: ${username} 
Password: ${password} 

然后找一個模塊試一試,這里用我自己弄的中國行政區(qū)劃代碼這個公共模塊來實(shí)驗(yàn)。步驟非常簡單:

  • npm init 創(chuàng)建,復(fù)制,對接口修改了一下,然后 npm publish。
  • 在原來的程序A設(shè)置 npm 注冊中心??梢允褂?nrm 進(jìn)行管理,內(nèi)網(wǎng)環(huán)境比較簡單,注冊中心都設(shè)置在 nexus 代理,所以簡單 npm config set registry ${sinopiaAddress}。
  • npm install ,即可使用。

至于該如何抽取公共模塊,應(yīng)該遵循什么規(guī)則,得另外起一個章節(jié)了。需要注意的點(diǎn)很多,比如:

  • 哪些需要發(fā)布到npm,test、coverage report、模塊參考文檔等都是不需要的,可以在 package.json 或者 .npmignore 配置。
  • 考慮兼容性,我們的項(xiàng)目基本使用了 ES6 、 ES7 等新特性,可以使用單獨(dú)的目錄存放編譯后的兼容文件。
  • 在模塊的托管代碼服務(wù)上,參考服務(wù)文檔,提供代碼質(zhì)量信息,如測試覆蓋率、相關(guān)依賴更新情況、使用的npm版本、ISSUE等。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容