angular-cli被emacs的lock文件打断
背景
在angular开发过程中,使用 ng s
启动项目后,
发现每当emacs产生lock文件(.#xxx
)时,angular工具的watch过程会被打断,报错说没有这个文件.
导致不能享受watch带来的及时修改及时见到效果的好处.
不仅angular,查找解决办法时,看到react也有同样的问题.
这或许是大厂的web开发者不用emacs的象征?
解决
目前的方案主要分两种
- 配置emasc不产生lock文件
- 配置angular忽略emacs的lock文件
- 针对watcher本身做修改
不产生lock文件
emacs的lock文件保证了更改文件时能够尽量不会有冲突,
因此全局关闭lock文件可能不是一个好办法.
不过可以局部关闭lock功能.
在项目根目录下新建一个 .dir-locals.el
文件,输入以下内容
1 | ((nil . ((create-lockfiles . nil)))) |
经过测试的确是只有项目目录下的文件不会产生lock文件,
而不是第一次进入项目目录后全局关闭lock功能.
angular配置
目前遇到的问题是
- angular没有明确说明报错的代码在哪里,做什么的过程中扫描到了这个lock文件,
因此不知道需要在谁的配置文件里写忽略文件 - 网上关于angular排除具体文件的方法是配置
watchOptions.ignored
,
而又有地方说该配置是属于webpack
,而angular在6版本后不支持配置webpack了
(原文说的是不支持eject,不知道webpack和eject的关系是什么)
因此提供了自定义builder以使得用户能够配置watchOptions
的方法
感觉有点麻烦就不准备用了.
修改watcher本身
修改 node_modules/watchpack/lib/DirectoryWatcher.js
文件,
将其中的 followSymlinks: false
改为 true.
实测后发现的确不再报错.
猜想:
修改前: watcher不跟踪link文件,当link文件出现时,默认认为文件发生了改变,
而后通知其他部分,多了一个xxx文件,而其他部分跟踪link找到文件具体地址,
又发现emacs做的这个link指向空文件,于是报错说没有这个文件.
修改后: watcher跟踪link文件并发现其实是个空文件,
被监视的文件夹没有发生实质性的变化,于是不向后传递信号,因此不报错.
感受: 虽然也是个治标不治本的办法,但真实的angular项目中,大量使用link文件的可能性不大,
因此即使followSymlink设置为true应该也不会造成多大的性能问题.目前看来是最合理的解决方法.
唯一缺点就是这个改动不会被git记录,无法通过git给之后的开发人员传递信息.
更新
目前在angular12的配套库文件中, DirectoryWatcher.js
中已经找不到 followSymlinks
的选项
并且问题已经默认解决.