使用文件相对eslint可执行文件进行Flycheck


21

我从事的许多项目都将eslint作为开发人员的依赖项进行安装,并带有一组自定义的eslint插件。目前,flycheck使用的是全球安装的eslint版本,而不是随每个项目安装的eslint版本。

我想将flycheck指向node_modules / eslint / bin / eslint.js。完整路径应取决于当前缓冲区文件的路径,因此我可以使用可能不同的eslint可执行文件同时处理每个缓冲区的多个项目。

这可能吗?关于我将如何执行此操作的任何建议?

Answers:


32

您可以通过编程方式进行更改flycheck-javascript-eslint-executable,例如

(defun my/use-eslint-from-node-modules ()
  (let* ((root (locate-dominating-file
                (or (buffer-file-name) default-directory)
                "node_modules"))
         (eslint
          (and root
               (expand-file-name "node_modules/.bin/eslint"
                                 root))))
    (when (and eslint (file-executable-p eslint))
      (setq-local flycheck-javascript-eslint-executable eslint))))

(add-hook 'flycheck-mode-hook #'my/use-eslint-from-node-modules)

此代码node_modules在缓冲区目录的任何父目录中查找目录,并将Flycheck配置为使用该目录中的eslint可执行文件(如果存在)。


我希望我的emacs-fu这么好。感谢您的回答!
pcardune '16

1
如果您设置了global-flycheck-mode,那么我建议(and eslint (file-executable-p eslint)) 遇到其他错误,例如,编辑我的.emacs文件
Jason Dufair

如果需要内联挂钩(并且避免添加自定义功能),可以采取以下操作:emacs-fu.blogspot.in/2008/12/hooks.html
Shivek Khurana

安全说明:仅在受信任的文件夹/项目中打开文件;你会自动执行任何malicions eslint二进制
MAXY

2
我会使用path "node_modules/.bin/eslint",以防eslint曾经更改其目录结构。
科迪·赖希特

3

我没有足够的声誉来就接受的解决方案发表评论。但是我做了一些修改,可以与嵌套包(例如使用lerna)一起很好地工作。这是完全相同的代码,但是它node_modules递归查找父文件夹,直到找到eslint并使用二进制文件为止。这样,您就可以使一个lerna项目只有一个eslint配置,并在所有子包之间共享。

(defun my/use-eslint-from-node-modules ()
  (let ((root (locate-dominating-file
               (or (buffer-file-name) default-directory)
               (lambda (dir)
                 (let ((eslint (expand-file-name "node_modules/eslint/bin/eslint.js" dir)))
                  (and eslint (file-executable-p eslint)))))))
    (when root
      (let ((eslint (expand-file-name "node_modules/eslint/bin/eslint.js" root)))
        (setq-local flycheck-javascript-eslint-executable eslint)))))
(add-hook 'flycheck-mode-hook #'my/use-eslint-from-node-modules)

0

我在Windows上,这对我来说不起作用,我认为file-executable-p或flycheck内部没有找到正确的文件。当其工作时,它指向.cmd文件而不是.js文件。

我在flycheck-eslint中发现了一个注释,该注释未使用JavaScript项目中安装的eslint版本,并且其博客文章改用目录变量

在项目的根目录中创建一个文件 .dir-locals.el

((nil . ((eval . (progn
                   (add-to-list 'exec-path (concat (locate-dominating-file default-directory ".dir-locals.el") "node_modules/.bin/")))))))

现在,当我访问javascript文件时,flycheck-verify-setup正确找到该文件<dir>/node_modules/.bin/eslint.cmd


0

我以前的解决方案是跨不同项目工作的痛苦。

我已经修改了对硬代码窗口愚蠢的可接受答案。

(defun my/use-eslint-from-node-modules ()
  (let* ((root (locate-dominating-file
                (or (buffer-file-name) default-directory)
                "node_modules"))
         (eslint (and root
                      (expand-file-name "node_modules/.bin/eslint.cmd"
                                        root))))
    (when (and eslint (file-exists-p eslint))
      (setq-local flycheck-javascript-eslint-executable eslint))))

0

这是一个使用项目根目录(或更具体地说,是包含二进制文件所在文件夹的目录)中的文件将Baelunaryorn的答案组合在一起的解决方案。创建具有以下内容的文件。dir-locals.elnode_modules/eslintdir-locals.el

((js2-mode
   (flycheck-checker . javascript-eslint)
   (eval . (setq-local flycheck-javascript-eslint-executable
             (concat (locate-dominating-file default-directory
                       ".dir-locals.el") "node_modules/.bin/eslint")))))

在这里,我假设您正在使用js2-modeemacs主模式编辑javascript文件。如果不是这种情况,请相应地更改该行。文件的第二javascript-eslint行使语法检查器成为该项目中唯一使用的语法检查器。第三行将变量设置flycheck-javascript-eslint-executable<root-dir>/node_modules/.bin/eslint。这样,我们不会修改emacs' exec-path


0

我已经尝试了几种不同的变体,但从未找到我想要的。我终于在Emacs lisp中进行了足够的升级,可以根据自己的喜好对其进行修改。我的版本所做的是寻找本地eslint,如果找不到,则会退回到全局安装的eslint:

(defun configure-web-mode-flycheck-checkers ()
    ;; See if there is a node_modules directory
    (let* ((root (locate-dominating-file
                  (or (buffer-file-name) default-directory)
                  "node_modules"))
           (eslint (or (and root
                            ;; Try the locally installed eslint
                            (expand-file-name "node_modules/eslint/bin/eslint.js" root))

                       ;; Try the global installed eslint
                       (concat (string-trim (shell-command-to-string "npm config get prefix")) "/bin/eslint"))))

      (when (and eslint (file-executable-p eslint))
        (setq-local flycheck-javascript-eslint-executable eslint)))

    (if eslint
        (flycheck-select-checker 'javascript-eslint)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.