关于Prettier的endOfLine选项

3,729 阅读2分钟

给项目配置了prettier,打算通过命令行的方式把所有文件都处理一遍单独起一个commit,避免后续每次修改老文件时会触发大面积的改动。

我用的是windows。没有配置endOfLine这个键的时候,在提交处理后的代码时,git add时会报"warning: LF will be replaced by CRLF"。

(过了几天更新)虽然但是,今天在另一台电脑上发现报错不同:LF will be replaced by CRLF the next time Git touches it,这个就清楚很多= =

git的autoCRLF

首先背景是,unix-like系统用的换行符是LF(Line Feed,\n),windows用的是CRLF(Carriage Return + Line Feed,\r\n)。在协作时,不同系统的换行符变换也会引起不必要的git diff,因此git内置了一个autoCRLF的功能,在windows上,autoCRLF为true,表示git会在checkout时把LF转成CRLF,在add时再把CRLF转回LF,这样可以保证代码库里只有LF,但在windows里也能以CRLF正常显示换行。

安装git时(windows)会有是否启用autoCRLF的选项。

image.png

而从prettier2.0开始,endOfLine这个选项默认为LF。回看这个warning就很奇怪,看起来是相反的:我明明已经是LF了,autoCRLF都不用转的,为什么warning反而要给我转成CRLF?

对warning的解释

我理解git的意思其实是:“你编辑的文件用的是LF,但由于你开了autoCRLF,在下次开始编辑的时候,我又会给你转成CRLF,所以下次你看到的还是CRLF,不要疑惑,总之你要以代码库里的为准”。

所以这里有两种解法:

  1. 关掉git的autoCRLF(设为input或false),全部用LF,就没有报错了,现在的windows编辑器(我用的是vscode)也兼容LF,其实没必要用CRLF,但其它用windows的同事也需要改。
  2. 修改prettier的配置为auto(原本是什么就是什么),我们的文件是autoCRLF处理后的CRLF,因此prettier输出的也是CRLF,git正常走autoCRLF的流程即可。

关于vscode的prettier插件

后面我又发现,只有命令行调用prettier时会遇到这个warning。即使没有配置EoL,在vscode里通过“format document”功能调用prettier插件后,文件依然是CRLF,git add也不会报warning。

试验了其它属性发现prettier插件是能正常读到.prettierrc的,检查了vscode里的prettier插件的默认值也正常是LF。

查到这应该是个feature(bug),见github issue。issue里提到了.editorConfig,由此想起prettier文档里也多次提到过它会去读取.editorConfig,但检查了.editorConfig也并没有设置EoL。只能推测prettier插件在格式化时,使用了vscode设置里的EoL,.prettierrc以及插件设置里的endOfLine都没有生效。

参考资料