当我在Ubuntu下运行gulp.watch的时候,提示一个非常诡异的错误信息,因为在windows下都没有这个问题,具体体现信息如下:
ttang@morningstar:~/dev/componer $ gulp watch --name=browser-logger [10:05:43] Requiring external module babel-register [10:05:44] Using gulpfile ~/dev/componer/gulpfile.babel.js [10:05:44] Starting 'watch'... [10:05:44] 'watch' errored after 14 ms [10:05:44] Error: watch /home/ttang/dev/componer/components/browser-logger/src/js ENOSPC at exports._errnoException (util.js:1026:11) at FSWatcher.start (fs.js:1429:19) at Object.fs.watch (fs.js:1456:11) at Gaze._watchDir (/home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:289:30) at /home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:358:10 at iterate (/home/ttang/dev/componer/node_modules/gaze/lib/helper.js:52:5) at Object.forEachSeries (/home/ttang/dev/componer/node_modules/gaze/lib/helper.js:66:3) at Gaze._initWatched (/home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:354:10) at Gaze.add (/home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:177:8) at new Gaze (/home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:74:10)
这是在公司的虚拟机里面跑,只有内网可以访问,所以暴露一下路径也无所谓。
这个问题是怎么产生的呢?这是因为在一个系统里,能够被监听的文件数量上限是一定的,node的监听其实是调用了fs.watch,从上面的错误信息也可以看到相关提示,fs.watch的监听数量在不同的系统里面不一样,所以有可能我的windows下面这个值很大,而在虚拟机里面很小(在家里的Ubuntu下也比较大,应该是跟虚拟机有关),所以我们应该想办法增加这个监听数量值。在终端运行下面的代码:
echo fs.inotify.max_user_watches=582222 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
这样就增加了fs.watch是文件数量上限。这样无论是gulp的watch,还是其他基于fs.watch写的模块,都可以正常运行了。
这个issue已经在gulp的官方github上得到回复,具体链接。
更新:而且这个问题还会引起sublime左侧文件目录不会随着更改自动更新,比如你重命名了文件,或者删除文件夹,左侧目录都不更新。解决sublime这个问题可以使用一个替代方案:打开preferences->key bindings,添加如下内容:
{ "keys": ["f5"], "command": "refresh_folder_list"
}
这样当你发现左侧目录没有实时更新时,可以通过按F5键来刷新。