使用 pm2 + sinopia 搭建本地 npm 私有仓库

背景

  • 每次构建,静态资源构建花费的时间基本在半个小时,搭个私有仓库是否能提升构建速度。
  • 可以将内部的公共 js lib 抽取发布出来共用。

相关准备

  • 具有不可描述权限的机器一台。
  • nodejs。
  • gcc及其相关(nodejs依赖)。
  • pm2(node app监控重启)。
  • sinopia(私有仓库app,类似 nexus)。

搭建步骤

安装 nodejs

下载 binary ,用 tar 命令解压缩,然后添加环境变量。

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

// 修改.bash_profile 
vi .bash_profile 
// 添加内容 
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: 网上说要添加软链接 ln -s /[your node path] /usr/local/bin ,实际上并不需要。

然后,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目录,然后运行configure,配置根据自己需要选择。如我的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输出版本号。

搭建私有仓库

内网需要连接代理,设置注册中心。这里连到内网代理 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 

修改现在内网客户端的 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 

验证

修改 autopackage.batcall "C:\nodejs\npm" config set registry ${sinopiaAddress},提交构建。

  • 初始:最后一个构建的项目,平均 autopackage.bat 耗时24分钟。
  • 项目构建时间提前到第一个:平均 autopackage.bat 耗时18分钟。
  • 现在:16分钟。无明显提升。

分析日志,nexus 本身自带缓存,在下载 npm lib 方面不存在提升空间。主要问题在于每次构建会删除之前构建的目录,包括 node_modules,导致 npm install 时下载时间较短,安装时间较长。

没关系,最终目的是要管理职能组内部的公共模块。

发布

首先,在 sinopia 添加用户。

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

然后找一个模块试一试,这里用我自己弄的中国行政区划代码这个公共模块来实验。步骤非常简单:

  • npm init 创建,复制,对接口修改了一下,然后 npm publish
  • 在原来的程序A设置 npm 注册中心。可以使用 nrm 进行管理,内网环境比较简单,注册中心都设置在 nexus 代理,所以简单 npm config set registry ${sinopiaAddress}
  • npm install ,即可使用。

至于该如何抽取公共模块,应该遵循什么规则,得另外起一个章节了。需要注意的点很多,比如:

  • 哪些需要发布到npm,test、coverage report、模块参考文档等都是不需要的,可以在 package.json 或者 .npmignore 配置。
  • 考虑兼容性,我们的项目基本使用了 ES6 、 ES7 等新特性,可以使用单独的目录存放编译后的兼容文件。
  • 在模块的托管代码服务上,参考服务文档,提供代码质量信息,如测试覆盖率、相关依赖更新情况、使用的npm版本、ISSUE等。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容