Sinopia貌似早就停止更新了,而且对5.0以上版本的npm兼容很差,最新的本地镜像工具是Verdaccio,用法、结构,甚至配置文件都几乎一样,不知道这两个软件之间是什么关系,总之Verdaccio对于当前
9.11.1版本的Node及其对应版本的npm支持的都非常好。
最近这小一年时间,真是折腾了不少东西,要说始终没空更新博客,那真是牵强附会的理由,就连Typecho都升级版本了,我的博客内容却始终没变化,实在有些说不过去,就算权当记录自己的成长历程,也该码点儿字啊。
最近一段时间,因为工作需要,实在没有办法,硬着头皮开始折腾前端方面的东西。要说方便的话,JS的东西,基本可以拿来就用,涉及到的知识点也就HTML5/ES5-6/服务器一类的内容,只要与现有体系(技术)结合的好,django+bootstrap也就分分钟的事儿,可为什么说叫“硬着头皮”呢?
不管是正打算窥探前端世界的雏鸟们,还是已经到了没事儿写个插件模块的高手,我觉得大家至少在下面这一点上有一个共识:前端技术体系,是一个由一堆极客构建出来的庞大、松散、版本迭代速度奇快的,供重度代码强迫症患者放肆发泄的神奇世界。
说回这些天来我自己的感受,怎么说呢……正事儿没怎么干,光“搭环境”就让我乐此不疲的废寝忘食了无数个花好月圆……这里套用加西亚的叙事风格:“一个月之后,拿着自己用echarts拼凑出来的图表准备交差的时候,怎么也不会想到,原来当年直接被我忽略掉了的normalize.css和一堆.min.js,才应该是整个项目的起点。说白了,就是在前端技术的世界门前,我又一次迷了路。
这也是今晚突然来了情绪,说什么也要写这么一篇小短文的其中一个原因,目的就是想让对前端技术感兴趣的童鞋们,别像我一样迷路。本文想要达到的效果,就像标题所说的那样,通过简单的几个步骤,构建起灵活可用的本地Node.js工具链环境。
因为,构建好工具链(俗称搭环境),才是迈向前段世界的正确的第一步!
至于另外一个原因,其实也是本文最想分享给大家的,是怎么在没有互联网的内网环境中,继续用你自己搭好的工具链环境!
怎么样,上面写的全是废话吧?好吧,让我们赶快开始!
先跑个题儿
我喜欢用emacs,因为emacs是我的信仰!但不管是deb世界还是rpm世界,版本更新都不怎么及时,真烦!于是搜贴,用下面的几行命令,可以在ubuntu或者apt的世界里,用上最新版的emacs。
1 | sudo add-apt-repository ppa:kelleyk/emacs |
如果你之前用源码编译安装的,并且当时的源码包还在(千万别轻易删除任何源码包),那么大多数用make方式进行编译安装的源码包,都支持:
1 | sudo make uninstall |
跑题结束,正文开始!
整体架构
对于前端世界而言,大的包管理架构林林总总好多个,但最有名的还是node.js中的npm(虽然yarn作为后起之秀也相当不错),而node本身的多版本管理,也经常让人头痛,并且,如果你没办法连接互联网,那一切都可以拜拜了!
所以,本文所分享给大家的应用场景是:
- 你的日常开发工作,均需要在
内网环境中进行,绝对连不了互联网! - 你至少有一台电脑可以连互联网,且从这台电脑上下载的东西,不管是刻盘也好优盘也好网闸也好,总之能拷贝到你内网中那台连不了互联网的可怜电脑上(比如我这儿)。
- 两台电脑都跑着Linux(推荐Ubuntu或者CentOS),因为我不用Windows,所以如果你用的Windows,抱歉我没法教你……
如果符合上面三个条件,你可以放心的继续阅读本文了。
阅读前注意!
请一步步的按顺序仔细阅读,因为每一个小节中即包含了
怎么回事,也包含了该怎么干。
对于Linux新手,也是最容易犯的错误,请记住一句话:在没让你
sudo的时候,就别乱用root!特别是这条,因为你很可能把什么东西给搞成系统级安装,你自己用着还不知道!
nvm
这东西很神奇!很方便!很强大!它是用来管理本地node版本的工具,怎么说呢?有点类似python的virtualenv,你可以用这东西在node的若干个版本之间无缝切换,而且安装配置全自动,最重要的,这东西可以带着node,以及用npm install -g全局安装的所有东西,一起搬家!
本节操作,在互联网电脑上进行。
首先,如果你当前系统中有node和npm,请统统删了!
然后,装上git!
1 | sudo apt install git |
随后,安装nvm:
1 | curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash |
或者
1 | wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash |
官网说的很清楚,上面的脚本,会从github上克隆nvm到~/.nvm中,并且在你的profile中加两句变量定义和脚本引用,就算装完了!是不是很简单?
看到没,nvm不是系统级的安装,它自己本身就是可以搬家的!
验证一下nvm的安装结果:
1 | command -v nvm |
如果屏幕有信息返回(应该就三个字母:nvm),就表示安装成功了,如果没有,请exit当前的Terminal,重新开一个,再试试,应该就好了。
本节终极知识点:
~/.nvm包含了所有东西,并且不是系统级安装,是可以直接考走的!
用nvm安装node
弄好了nvm,在互联网电脑上的剩下操作,就更简单了!
1 | nvm install --lts |
上面的命令,会自动安装node的LTS版本,LTS版本是最新的长期支持稳定运行版本,截至本文发布时,node的LTS版本是v8.9.1
然后
1 | nvm install node |
上面只指定node,不指定版本号,默认就是安装node的最新(稳定)版本,注意这个版本一般不是长期支持版本。截至本文发布,最新版本是v9.2.0
这里,推荐你把将来可能用到的所有node版本,统统装上!
1 | nvm ls 查看本地Node.js版本 |
nvm会自动将你install的最近一个版本,作为node的默认运行版本,你可以使用下面的命令在本地已经安装的版本(用nvm ls查看)中自由切换:
1 | nvm use node |
这里只需要注意一点,代表LTS版本的标签,前面要带上--.
本节需要掌握的知识点:
nvm会把所有已经安装的版本统一放在.nvm/versions/node/nvm在安装node的时候,如果可执行文件包下载失败,会自动切换到源码包下载,并自动编译安装到.nvm对应目录中,基本可以做到万无一失的全自动安装!nvm在安装node之后,会自动安装该版本能够支持的最高版本的对应npm(或者说node自带的npm)
用npm安装sinopia
那啥,你不知道npm是啥?天呢……npm是node用来管理包的工具,这么说吧:
nvm用来管理不同版本的node,对于每个已经安装的node来说,都是相互独立的,从node内部来看,LTS版本的node并不知道还有另外一个9.2.0版本的node在它隔壁。
npm是node管理自己的模块(或是包、插件等等)的工具,每个用nvm安装的node版本,都有它自己的npm包管理工具,虽然不正确,但你可以把npm看作是每个版本的node都会自带的东西。
好了,基本概念解释清楚了之后,我们来看看这个真正实现本地化的神器:sinopia.
sinopia简单的理解,就是Node世界中众多模块中的一个,它的功能很简单也很强大!
简单,就是全自动的维护运行一个本地的node模块仓库(node的仓库叫做registry)。
强大,是在npm告诉sinopia想要什么模块之后,sinopia先看看它自己这儿有没有,如果有,就直接提供给npm,如果没有,会先自动从npm的官方仓库中下载回来,保存到自己这儿,然后再提供给npm,这一切均自动完成。当然,sinopia还支持多用户上传分享模块等等功能,它就是在替你维护一个全功能的Registry!
1 | nvm use node |
这里我们先指挥nvm激活node的最新版本,然后用npm将sinopia全局安装(-g)到node的全局模块库中。这里跟上一节不同,你完全没必要每个node版本都装一个sinopia,用最新的node装最新的sinopia就好啦。
在上面装sinopia的最后,编译器[有可能]会报两个依赖包编译失败的错误,一个是fs-ext,一个是crypt3,出现这种情况,我也不知道是怎么回事,node的LTS和最新版在Ubuntu 16.04 LTS中都会出现这两个错误,但没关系,从sinopia的依赖包文件中可以看到,fs-ext和crypt3这两个包是可选依赖,简单讲就是“没它们也行”的意思,但毕竟是编译错误,我们需要手动删除关于这两个包的一些多余文件:
1 | rm -fr ~/.nvm/versions/node/v9.2.0/lib/node_modules/fs-ext/ |
上面四个位置中的v9.2.0是用来安装sinopia的node版本号,请修改为自己的。且上面四个路径不一定都存在,保险起见,挨个都删一下吧,不然在用npm指定用户登录sinopia维护的Registry的时候,htpasswd组件会报错。
有经验的童鞋,在看了上面四个路径之后,是不是有所收获?没错,nvm真的很强大,完全把每个版本的node都独立封在了各自的目录中,真的挺像python世界的虚拟环境的。
配置sinopia
sinopia就这点最贴合我的审美:号称零配置!装上就能用!
1 | cd ~/ |
直接输入sinopia,它就开始工作了!
第一次运行的时候,sinopia会在~/.config/sinopia/中生成一个config.yaml,这是它默认的配置文件,为了给将来的搬家工作做铺垫,我们先ctrl-c结束sinopia的运行,然后新建个目录,将配置文件丢进去:
1 | cd |
然后用编辑器打开这个配置文件:
1 | nano ~/sinopia/config.yaml |
将第一行的storage变量内容修改为相对路径:
1 | storage: ./storage |
这一行的意思是,告诉sinopia,用来存储所有模块的地方,是与这个config.yaml配置文件在一起的storage目录。
然后,我们带着参数再次运行sinopia:
1 | cd ~/sinopia |
1 | warn --- config file - /home/wyao/sinopia/config.yaml |
如果屏幕输出了类似上面的内容,OK,这次sinopia在使用我们修改好的config.yaml运行了,它所维护的所有包,都放在指定地方(这里是~/sinopia/storage)
这里先别结束sinopia,就让它这么运行着,下一节我们会用它继续工作!
指挥npm连上sinopia
本节比较简单,因为在npm看来,sinopia给的地址就是一个正常的Registry。我们这么来做,保持上一节打开的sinopia不便,新开一个Terminal(终端),然后:
1 | nvm use node |
第一条命令是指定nvm激活最新版本的node,这样做是为了举个例子,你完全可以激活任何一个版本的node,设定registry到sinopia的服务地址,并且用向导注册一个新用户(注册完会提示自动登录到了registry)。
这里其实还隐藏着一点,就是使用nvm管理的node,对于每一个Terminal(终端)来说,都是独立的,就算一个终端中运行着最新版本node的sinopia,另一个终端完全可以nvm use --lts,互相没有干扰(我又想说python的venv了,真的是天才设计)。
注册完用户(其实也可以不注册),新建一个临时文件夹,用npm通过sinopia把将来可能会用到的模块,统统装一遍,这一步不为别的,只是让sinopia把那些模块从官方仓库中下载回来并保存到它自己的storage目录中:
1 | cd /tmp |
看着另一个终端中的sinopia正在替你做着所有事情,心情是不是很好?等装完想装的,结束sinopia,exit所有终端窗口,我们准备最后一个大环节:打包搬家!
搬家准备
在这一节中,我们主要打包两样东西:
1 | cd |
就这两样!只有这两样!简单不?
刻盘、优盘、网闸,随你便,让我们暂时离开互联网,搬到内网机器上。
落户内网
你已经成功把上面两个包弄到内网来了,并且内网的这台机器也是Linux(理由请看本文开始部分),假设这两个包拷贝在~/Downloads/中,我们解压它们:
1 | cd ~/Downloads |
然后移动.nvm目录到~/中:
1 | mv ~/Downloads/.nvm ~/ |
至于sinopia目录,把它放在服务一类的程序目录中就好,比如:
1 | mv ~/Downloads/sinopia ~/running/ |
然后我们编辑当前系统用户的profile(Ubuntu的文件在~/.bashrc),在最后加上几行:
1 | export NVM_DIR="$HOME/.nvm" |
然后source .bashrc或者关了重开一个Terminal,测试一下我们的nvm激活了没有:
1 | nvm ls |
如果测试用的命令有用,恭喜你,nvm落户成功了!
接下来,我们继续操作sinopia:
1 | cd ~/running/sinopia |
如果一切正常,sinopia会顺利起来,和互联网那台机器一样开始提供服务!
这里需要注意,第二行命令是激活某一个版本的node,这里你需要激活那个在互联网机器上安装sinopia的版本,因为别的版本中没有安装sinopia(当然,如果你多个node版本全装了,算你狠……)
再提醒一点,什么npm set registry,npm add user之类的操作,只要是在之前互联网机器上做过的,现在都不需要再做了,还记得吗?所有东西,都保存在.nvm目录中,配置也一样,我们全搬过来了!
日后维护
按照上面的操作进行到这里,我们已经把nvm,多个版本的node,对应的npm,以及sinopia统统搬进了内网。
如果以后想要安装其他node模块,只需要回到那台互联网机器上运行sinopia,找个临时文件夹npm install想要的模块,然后把sinopia的storage文件夹替换内网机器上的storage文件夹即可。
如果想要更新node版本,在互联网机器上操作完nvm之后,直接打包.nvm目录回到内网,替换原来目录即可。
上面两个操作建议替换,因为我不确定合并目录会带来什么隐患,还是删了旧的,直接用新目录保险!
后记
好久不写文章,确实写的废话连篇,但至少至此,你应该能够很牛逼的对你的团队成员讲:“老子新建了一个registry,都把npm set到我这里,自己注册用户,我们用私有仓库共享模块!
希望本文能够帮助到你!