Flycheck với tập tin thực thi eslint tương đối


21

Rất nhiều dự án tôi làm việc trên cài đặt eslint như là một phụ thuộc dev, với một bộ plugin eslint tùy chỉnh. Ngay bây giờ, flycheck sử dụng phiên bản eslint được cài đặt toàn cầu thay vì phiên bản eslint được cài đặt với mỗi dự án.

Thay vào đó, tôi muốn tạo flycheck trỏ tới node_modules / eslint / bin / eslint.js. Đường dẫn đầy đủ phải phụ thuộc vào đường dẫn của tệp bộ đệm hiện tại để tôi có thể làm việc trên nhiều dự án cùng một lúc với mỗi bộ đệm bằng cách sử dụng một tệp thực thi eslint có khả năng khác nhau.

Điều này có thể không? Bất kỳ đề xuất cho làm thế nào tôi sẽ đi về làm điều này?

Câu trả lời:


32

Bạn có thể thay đổi theo chương trình flycheck-javascript-eslint-executable, vd

(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)

Mã này tìm kiếm một node_modulesthư mục trong bất kỳ cha mẹ nào của thư mục bộ đệm và cấu hình Flycheck để sử dụng một thực thi eslint từ thư mục đó nếu có.


Tôi ước emacs-fu của tôi là tốt này. Cảm ơn câu trả lời!
pcardune

1
Nếu bạn có cài đặt chế độ flycheck toàn cầu, thì tôi khuyên tôi nên (and eslint (file-executable-p eslint)) gặp lỗi nếu không, cố gắng chỉnh sửa tệp .emacs của tôi
Jason Dufair

Đây là những gì bạn có thể làm nếu bạn cần một hook nội tuyến (và tránh thêm các chức năng tùy chỉnh): emacs-fu.blogspot.in/2008/12/hooks.html
Shivek Khurana

lưu ý bảo mật: chỉ mở các tệp trong các thư mục / dự án đáng tin cậy; bạn sẽ tự động thực hiện bất kỳ malicions eslint nhị phân
MAXY

2
Tôi sẽ sử dụng đường dẫn "node_modules/.bin/eslint", chỉ trong trường hợp eslint thay đổi cấu trúc thư mục của họ.
Cody Re Richt

3

Tôi không có đủ danh tiếng để bình luận về giải pháp được chấp nhận. Nhưng tôi đã thực hiện một biến thể của nó, nó hoạt động tốt với các gói lồng nhau (ví dụ sử dụng lerna ). Đây là cùng một mã chính xác, tuy nhiên, nó sẽ tra cứu node_modulesthư mục mẹ theo cách đệ quy cho đến khi tìm thấy eslinttệp nhị phân và sử dụng nó. Bằng cách này, bạn có thể có một dự án lerna chỉ có một cấu hình eslint, được chia sẻ giữa tất cả các gói phụ.

(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

Tôi đang ở trên windows và điều này không hiệu quả với tôi, tôi nghĩ rằng tệp thực thi-p hoặc có lẽ các phần bên trong flycheck không thể xác định đúng tệp. Như khi nó hoạt động, nó chỉ vào .cmdtệp chứ không phải .jstệp.

Tôi đã tìm thấy một nhận xét trong flycheck-eslint không sử dụng phiên bản eslint được cài đặt trong dự án JavaScriptbài đăng trên blog của họ để sử dụng các biến thư mục thay thế.

Trong thư mục gốc của dự án tạo một tệp .dir-locals.el

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

Bây giờ khi tôi truy cập tệp javascript flycheck-verify-setupchính xác tìm thấy tệp<dir>/node_modules/.bin/eslint.cmd


0

Giải pháp trước đây của tôi là một nỗi đau để làm việc trên các dự án khác nhau.

Tôi đã sửa đổi câu trả lời được chấp nhận cho sự ngu ngốc của cửa sổ mã cứng.

(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

Đây là một giải pháp kết hợp câu trả lời của Baelunaryorn bằng cách sử dụng một dir-locals.eltệp trong thư mục gốc của dự án (hoặc cụ thể hơn là trong node_modules/thư mục chứa thư mục chứa eslintnhị phân sống). Tạo dir-locals.eltập tin nói với nội dung sau.

((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")))))

Ở đây tôi giả sử bạn đang sử dụng js2-modechế độ chính của emacs để chỉnh sửa các tệp javascript. Nếu đó không phải là trường hợp, thay đổi dòng đó cho phù hợp. Dòng thứ hai của tệp làm cho javascript-eslinttrình kiểm tra cú pháp là cái duy nhất được sử dụng trong dự án này. Dòng thứ ba đặt biến flycheck-javascript-eslint-executablethành <root-dir>/node_modules/.bin/eslint. Theo cách này, chúng tôi không sửa đổi emacs ' exec-path.


0

Tôi đã thử một vài biến thể khác nhau của điều này và không bao giờ tìm thấy chính xác những gì tôi muốn. Cuối cùng tôi đã lên cấp đủ trong Emacs lisp để sửa đổi nó theo ý thích của tôi. Những gì phiên bản của tôi làm là tìm kiếm một eslint cục bộ và nếu không tìm thấy nó sẽ rơi trở lại cài đặt toàn cầu:

(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)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.