今天在尝试把写了一周的项目用laravel-mix中的 mix.version() 命令生成版本化文件时,遇到了一个报错,大概长这样:
fs.js:675 return binding.read(fd, buffer, offset, length, postion); ^ Error: EISDIR: illegal operation on a directory, read at Object.fs.readSync (fs.js:675:18) at .....
一开始还以为哪里写错了,前后检查了几遍无果,配合错误提示分段排查,发现只要这句代码:
mix.copy(‘resources/assets/js/lib/editor.md‘,‘public/lib/editor.md‘);
存在就会导致报错。
有趣的是:
1.前一句mix.copy还跑得好好的。
2.版本化的代码压缩和生成mix-manifest.json都被正确地执行了,但在那句copy未被执行。
3.如果不执行版本化 mix.version() ,那句代码就跑得毫无问题。
按照文档的说法,mix.copy仅仅是把一处资源文件复制到另一处,怎么会和mix.version扯上关系呢。
虽然手动复制也能解决问题,但就它这么特殊总是令人不爽。
Google给出的答案也很迷,有人提出是version的过程与copy的过程同时进行了导致的问题【https://github.com/JeffreyWay/laravel-mix/issues/852】,建议 mix.then( ()=>{ ...COPY CODE ... }) 解决,然而我试了并没有什么卵用。 mix在执行结束后,then内再对mix进行的操作就已经无效了。
随后又在文档中发现一句 “The mix.version()
will automatically version any compiled javascript, Sass/Less, or combined files. ” 。emmmm,似乎copy过去的内容哪怕没在html中被以{{ mix()}}的方式引用,也会被mix.version()盯上呢。
最后,我决定把editor.md目录下的全部内容挨个审批,结果令人意外,哪怕editor.md是个空目录,它TM也会报错。这倒提醒了我,于是我试着修改了一下文件名到 “editor-md” --- >通过了。
经过测试,似乎只有mix.copy()的源文件目录中不能出现 “ . ”,更深入的研究大概要翻version()源码了。