Laravel npm install 报错syscall symlink的原因及解决办法

在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:
也即是说,为了防止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了。
执行 gulp 命令时报错:

ENOENT:没有这样的文件或目录,scandir'/ home / vagrant / Code / sample / node_modules / node-sass / vendor'

解决方案:

使用 npm 重新生成 node-saaa

npm rebuild node-sass --no-bin-links

在windows host中的vagrant box Linux中使用npm install时,由于host os不支持linux的symbol link,所以必须使用 --no-bin-links 命令

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

推荐阅读更多精彩内容