파일 상대 eslint 실행 파일을 사용한 Flycheck


21

eslint 플러그인을 사용자 정의하여 eslint를 dev 종속성으로 설치하는 많은 프로젝트가 있습니다. 현재 flycheck는 각 프로젝트와 함께 설치된 eslint 버전이 아니라 전 세계적으로 설치된 eslint 버전을 사용합니다.

flycheck가 node_modules / eslint / bin / eslint.js를 대신 가리 키도록하고 싶습니다. 전체 경로는 현재 버퍼 파일의 경로에 의존해야하므로 잠재적으로 다른 eslint 실행 파일을 사용하여 각 버퍼로 동시에 여러 프로젝트에서 작업 할 수 있습니다.

이것이 가능한가? 이 작업을 수행하는 방법에 대한 제안 사항이 있습니까?

답변:


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버퍼 디렉토리의 부모에서 디렉토리를 찾고 해당 디렉토리에서 eslint 실행 파일이있는 경우이를 사용하도록 Flycheck를 구성합니다.


내 이맥스가 좋았 으면 좋겠다. 답변 해주셔서 감사합니다!
pcardune

1
글로벌 플라이 체크 모드를 설정 한 (and eslint (file-executable-p eslint)) 경우 다른 방법으로 오류를 겪는 것이 좋습니다 . 즉, .emacs 파일 편집
Jason Dufair

다음은 인라인 후크가 필요합니다 (및 사용자 정의 기능을 추가하지) 경우 당신이 할 수있는 작업은 다음과 같습니다 emacs-fu.blogspot.in/2008/12/hooks.html
Shivek Khurana

보안 정보 : 신뢰할 수있는 폴더 / 프로젝트의 파일 만 엽니 다. 당신은 어떤 malicions eslint 바이너리 자동으로 실행됩니다
MAXY

2
"node_modules/.bin/eslint"eslint가 디렉토리 구조를 변경하는 경우를 대비 하여 경로를 사용합니다 .
코디 Reichert

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

나는 창문에 있고 이것이 나를 위해 작동하지 않았다. 파일 실행 가능 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/")))))))

이제 자바 스크립트 파일을 방문하면 파일을 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.el프로젝트의 루트 디렉토리에 있는 파일을 사용하여 (또는 이진 파일 이있는 node_modules/폴더 가 들어있는 디렉토리에 있는) 솔루션을 결합한 솔루션이 있습니다 eslint. dir-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-eslint구문 검사기를이 프로젝트 내에서 사용할 수있는 유일한 것입니다. 세 번째 줄은 변수 flycheck-javascript-eslint-executable를로 설정합니다 <root-dir>/node_modules/.bin/eslint. 이런 식으로 emacs '를 수정하지 않습니다 exec-path.


0

나는 이것에 대한 몇 가지 변형을 시도했지만 내가 원하는 것을 정확하게 찾지 못했습니다. 마침내 이맥스 리스프에서 원하는대로 수정하기에 충분한 레벨을 올렸습니다. 내 버전의 기능은 로컬 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)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.