【问题标题】:How can I write a ESLint rule for "linebreak-style", changing depending on Windows or Unix?如何根据 Windows 或 Unix 为“换行样式”编写 ESLint 规则?
【发布时间】:2016-12-31 01:34:42
【问题描述】:

众所周知,Windows 中使用的换行符(换行符)通常是回车符(CR)后跟换行符(LF)即(CRLF),而 Linux 和 Unix 使用简单的换行符(LF)

现在,就我而言,我的构建服务器使用支持 Linux 和 Unix 格式,因此,以下规则在构建服务器上完美运行:

linebreak-style: ["error", "unix"]

但我正在 Windows 上进行开发,我需要更新每个 git pull/git push 的规则,如下所示,

linebreak-style: ["error", "windows"]

那么,有没有办法编写一个通用的换行样式规则来支持Linux/Unix和Windows这两种环境?

注意:我正在使用 ECMAScript6[js]、WebStorm[ide] 进行开发

我们将不胜感激任何解决方案/建议。谢谢!

【问题讨论】:

  • 为什么不一直使用LF(对于JS文件)?浏览器和 IDE 都很好地支持它们。
  • 如果环境是 windows,ESLint 测试将失败 LF。
  • 我明白了——感谢您澄清这一点(我自己不是 JS 人)
  • 如果我同时添加 ["error", "unix", "windows"] 会发生什么,它有助于解决文本编辑器中的警告,但我不确定服务器

标签: javascript windows unix eslint line-endings


【解决方案1】:

有几个答案在玩.eslintrc,甚至有人建议完全关闭规则。

但是,我更喜欢将 VCS 设置更改为结帐LF 而不是CRLF。假设即使在 Windows 环境中,现代 IDE 也应该可以很好地处理 LF。缺点是记事本等一些 Windows 软件不会喜欢它。但是这样,如果您的换行样式不正确,您将收到警告。即使他们的 VCS 配置错误,人们也不太可能提交不正确的换行样式。只需运行git config --global core.autocrlf false 或按照How do I force git to use LF instead of CR+LF under windows? 上的说明进行操作

无论如何,一般不鼓励关闭规则,因为这会影响其他团队成员,除非您得到团队的所有同意。

【讨论】:

    【解决方案2】:

    更好的选择

    .editorconfig end_of_line

    .editorconfig 文件中添加end_of_line 规则:

    [*]
    end_of_line= lf
    

    EditorConfig 是当今大多数代码编辑器的扩展,它更改您刚刚保存的文件的内容。此规则强制每次开发人员保存文件时所有行结尾始终unix 一致 (\n)(注意:MacOs no longer uses \r => cr)。 要强制执行 windows 行尾 (\r\n),请使用 crlf

    此选项更可取,因为它避免了将所有行尾更改记录在项目的存储库中(版本控制)。

    不是那么理想的选择...

    EditorConfig note 提到:

    如果您想在不同的操作系统之间使用本地行尾,最好不要设置此选项并将该任务留给 VCS!将来我们可能会为此场景添加一个类似于 native 的值(参见 #226)。

    这将替代accepted answer 的解决方案:

    "linebreak-style": process.env.NODE_ENV === 'prod' ? "unix" : "windows"
    

    这仍然比完全禁用规则更好 ("linebreak-style": 0):开发人员/贡献者可能会不一致地在同一个文件中使用他们喜欢的行结尾...

    【讨论】:

      【解决方案3】:

      如果您在 Windows 上使用 Vs Code,请转到“.eslintrc.json”文件(或“.js”,具体取决于您在设置 ESLint 时选择的选项);该文件通常位于项目的根文件夹中;并在规则下添加换行选项以使用 Windows CRLF,如下所示:

      "rules": {
          "linebreak-style": ["error", "windows"]
      }
      

      保存文件,当您返回 JavaScript 文件时,所有那些讨厌的红线都会消失。

      【讨论】:

        【解决方案4】:

        我花了一些时间试图找到如何关闭链接中断样式并由于还原我的一些代码而丢失了它,我认为其他人也喜欢使用它。

        .eslintrc 文件中,您还可以将linebreak-style 设置为0,从而关闭linebreak 功能:

        module.exports = {
          extends: 'google',
          quotes: [2, 'single'],
          globals: {
            SwaggerEditor: false
          },
          env: {
            browser: true
          },
          rules:{
            "linebreak-style": 0   // <----------
          }
        };
        

        【讨论】:

        • 你不应该做的事情,尤其是当你不是唯一的开发者时;)
        • 不是解决方案,只是隐藏痛苦。
        • 我必须输入“换行样式”,对于所有可用的选项,是否有任何扩展或其他信息?
        【解决方案5】:

        在你的.eslintrc.js

        "rules": {
          "linebreak-style": ["error", (process.platform === "win32" ? "windows" : "unix")], // https://stackoverflow.com/q/39114446/2771889
        }
        

        另请参阅:How do I determine the current operating system with Node.js

        【讨论】:

          【解决方案6】:

          为换行样式更改 ESLint 规则所需的配置文件的位置可能会根据您是否要更改本地、项目或全局设置而改变,它会首先搜索本地,这会覆盖树上更远的那些,因此更改为树的顶部向下传播以进行全局

          我使用了 airbnb 样式,我的全局设置位于此处:node_modules/eslint-config-airbnb-base/rules/style.js:

          如果您不确定文件的位置,您可以随时搜索包含与设置相关的文本的文件列表,在 Linux 上查找所有具有换行设置的文件,导航到安装 ESLint 的文件夹并使用:

          grep -r linebreak
          

          【讨论】:

            【解决方案7】:

            .eslintc 用于 Windows visualstudio 代码

            {
              "env": {
                "node": true
              },
              "rules":{
                "linebreak-style": 0
              }
            }

            【讨论】:

            • 这并不能回答问题,它只是关闭了有价值的功能。现在你将得到一个混乱的代码库。
            【解决方案8】:

            eslint 配置文件可以是常规的.js 文件(即,不是 JSON,而是带有逻辑的完整 JS),用于导出配置对象。

            这意味着您可以根据当前环境(或您能想到的任何其他 JS 逻辑)更改 linebreak-style 规则的配置。

            例如,当您的节点环境为“prod”时,要使用不同的linebreak-style 配置:

            module.exports = {
                "root": true,
                "parserOptions": {
                    "sourceType": "module",
                    "ecmaVersion": 6
                },
                "rules": {
                    // windows linebreaks when not in production environment
                    "linebreak-style": ["error", process.env.NODE_ENV === 'prod' ? "unix" : "windows"]
                }
            };
            

            示例用法:

            $ NODE_ENV=prod node_modules/.bin/eslint src/test.js
            
            src/test.js
              1:25  error  Expected linebreaks to be 'CRLF' but found 'LF'  linebreak-style
              2:30  error  Expected linebreaks to be 'CRLF' but found 'LF'  linebreak-style
              3:36  error  Expected linebreaks to be 'CRLF' but found 'LF'  linebreak-style
              4:26  error  Expected linebreaks to be 'CRLF' but found 'LF'  linebreak-style
              5:17  error  Expected linebreaks to be 'CRLF' but found 'LF'  linebreak-style
              6:50  error  Expected linebreaks to be 'CRLF' but found 'LF'  linebreak-style
              7:62  error  Expected linebreaks to be 'CRLF' but found 'LF'  linebreak-style
              8:21  error  Expected linebreaks to be 'CRLF' but found 'LF'  linebreak-style
            
            ✖ 8 problems (8 errors, 0 warnings)
            
            $ NODE_ENV=dev node_modules/.bin/eslint src/test.js
            $ # no errors
            

            【讨论】:

            • 在这个答案的基础上,我切换到检测平台的正常行结束,而不必指定环境,所以:"linebreak-style": ["error", (require("os").EOL === "\r\n" ? "windows" : "unix")]
            • 呃,如果开发环境是windows,你不能在开发环境上这样设置变量,所以这样设置NODE_ENV=dev的例子是无效的。你能改正吗?
            猜你喜欢
            • 2019-02-28
            • 2021-12-11
            • 2020-07-22
            • 1970-01-01
            • 2021-08-20
            • 1970-01-01
            • 2020-04-17
            • 1970-01-01
            相关资源
            最近更新 更多