angular-cli被emacs的lock文件打断

背景

在angular开发过程中,使用 ng s 启动项目后,
发现每当emacs产生lock文件(.#xxx)时,angular工具的watch过程会被打断,报错说没有这个文件.
导致不能享受watch带来的及时修改及时见到效果的好处.
不仅angular,查找解决办法时,看到react也有同样的问题.
这或许是大厂的web开发者不用emacs的象征?

解决

目前的方案主要分两种

  1. 配置emasc不产生lock文件
  2. 配置angular忽略emacs的lock文件
  3. 针对watcher本身做修改

不产生lock文件

emacs的lock文件保证了更改文件时能够尽量不会有冲突,
因此全局关闭lock文件可能不是一个好办法.
不过可以局部关闭lock功能.

在项目根目录下新建一个 .dir-locals.el 文件,输入以下内容

1
((nil . ((create-lockfiles . nil))))

经过测试的确是只有项目目录下的文件不会产生lock文件,
而不是第一次进入项目目录后全局关闭lock功能.

angular配置

目前遇到的问题是

  1. angular没有明确说明报错的代码在哪里,做什么的过程中扫描到了这个lock文件,
    因此不知道需要在谁的配置文件里写忽略文件
  2. 网上关于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 的选项
并且问题已经默认解决.

参考

  1. emacs局部关闭lock功能
  2. angular排除某文件的讨论
  3. 自定义angular的builder的讨论