《Npm Debug Series》是我们课程laravel实战实战系列课程的扩展阅读篇,虽然视频中我们已经将npm install过程中的常见问题及解决方案都说了,但是鉴于npm的问题相对频繁,有随时查阅之需,故有此系列文章。如果你只想赶紧找到解决问题的方法,可以直接观看Laravel&Vue实战:任务管理系统二中的免费视频《课时5 npm debug》

npm install过程中,最常见的错误恐怕就是syscall symlink错误,报错一般是这样的:

npm ERR! Linux 3.19.0-25-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! node v4.1.1
npm ERR! npm v2.14.4
npm ERR! path ../user-home/cli.js
npm ERR! code EPROTO
npm ERR! errno -71
npm ERR! syscall symlink

npm ERR! EPROTO: protocol error, symlink '../user-home/cli.js' -> '/home/vagrant/Sites/laravel/node_modules/gulp/node_modules/v8flags/node_modules/.bin/user-home'

为什么会这样呢?

原因是npm默认会使用symbolic links来安装组件,也即我们在linux系统里经常用的软链接(ln -s)或硬链接(ln),但是有些文件系统不支持文件链接,比如Windows(或者说出于安全原因禁用了,愿意捣腾的同学可以自行研究怎样开启),有时候linux系统运行在有windows分区的硬盘上也不支持链接,比如virtualbox在windows主机上默认禁止在共享文件夹里使用symbolic links,当然也是出于安全考虑(同样,喜欢折腾的同学可以自行设置开启)。

那么npm install默认需要使用symbolic link,而且这也本身也是npm比较重要的一个特性,但如果我们的系统不支持这一属性的话,就会报上面的错误了。

那么解决办法呢,就是在npm install的时候加上一个参数,就是--no-bin-links,也即npm install --no-bin-links:

The --no-bin-links argument will prevent npm from creating symlinks for any binaries the package might contain.

也即是说,为了防止syscall symlink错误,如果你是在windows使用npm,或者即使在homestead里,但主机是windows,那么每次你执行npm安装或更新组件相关的命令时,都要在后面加上--no-bin-links,比如你要npm update --no-bin-links,你也要npm rebuild node-sass -no-bin-links,确实挺麻烦的,无奈。

当然,你也可以整体设置一下npm,让它默认不再使用文件链接功能了,执行:

npm config set bin-links false

这样了以后,再执行相关命令就可以不用带--no-bin-links了。

话说回来,这也只是无奈之举,使用了--no-bin-links会导致npm安装变慢,有时候甚至会因此而引起其它错误,比如另一个我们常见的Maximum call stack size exceeded错误,没办法喽,谁让我们大多是“微软党”呢~

npm和windows还有一个过不去的地方就是,npm里的很多包,路径都特别地长,特别特别地长,当然这其实没什么错,但是在windows上,默认最长的路径不能超过260个字符,所以有时候遇到复杂的依赖路径,尤其是比如说你想直接在windows上拷贝你的node_modules文件夹到其他地方时,那么是肯定不成功的,即使压缩解压,windows上流行的很多压缩软件都也同样不支持太长的路径,也会报错中止,而只有像7-zip这种有跨平台背景的开源压缩软件才行,所以之前大家在使用群内压缩好的node_modules文件夹时,经常要让你用7-zip来解压,而且要直接一次性解压到目的地,否则你临时解压到了别的地方,只要一复制移动,又会遇到路径太长的报错。

当然,咱也不能完全抱怨windows的不好,其实windows上也能使用文件链接,但条件是,必须是拥有管理员权限才行,如果你在执行vagrant up前,打开你的命令行的时候,使用了管理员权限来打开,那么其实npm install不加--no-bin-links也不会报错,但这么个小细节,估计很多大老爷们不会在意的~而且为了这些个毛病,还得去研究windows的特性,去找办法更改,回头系统重装了又得再来一遍,着实划不来~

Windows is FAR behind the mark when it comes to real web & server development.

讲真,要进行真正的网络或服务器开发,windows已经太不入流