Dosya göreli eslint yürütülebilir dosyası ile Flycheck


21

Kurulum eslint'i devl bağımlılığı olarak özel bir eslint eklentileri seti ile çalıştığım birçok proje. Şu anda, flycheck her projede kurulu olan eslint sürümü yerine global olarak kurulmuş eslint sürümünü kullanmaktadır.

Bunun yerine node_modules / eslint / bin / eslint.js'yi işaretlemek istiyorum. Tam yol, geçerli arabellek dosyasının yoluna bağlı olmalıdır, böylece potansiyel olarak farklı bir eslint yürütülebilir dosyası kullanarak her arabellek ile aynı anda birden çok proje üzerinde çalışabilirim.

Mümkün mü? Bunu nasıl yapacağım konusunda herhangi bir öneriniz var mı?

Yanıtlar:


32

Programlı olarak değiştirebilirsiniz flycheck-javascript-eslint-executable, örn.

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

Bu kod node_modules, arabellek dizininin herhangi bir üst öğesinde bir dizin arar ve Flycheck'i varsa bu dizinden bir eslint yürütülebilir dosyası kullanacak şekilde yapılandırır.


Keşke emacs-fu'm bu kadar iyi olsaydı. Cevap için teşekkürler!
pcardune

1
Global flycheck-mode ayarlıysanız, (and eslint (file-executable-p eslint)) başka bir şekilde, yani .emacs
dosyamı

Satır içi bir kancaya ihtiyacınız varsa (ve özel işlevler eklemekten kaçınırsanız
Shivek Khurana 6:17

güvenlik notu: yalnızca güvenilir klasörler / projelerdeki dosyaları açar; herhangi bir malicion ikili
esxy

2
"node_modules/.bin/eslint"Sadece eslint dizin yapısını değiştirirse , yolu kullanırdım .
Cody Reichert

3

Kabul edilen çözüm hakkında yorum yapmak için yeterli itibarım yok. Ama iç içe paketlerle iyi çalışan bir varyasyon yaptım (örneğin lerna kullanarak ). Bu aynı koddur, ancak node_modulesbir eslintikili dosya bulana ve onu kullanana kadar üst klasörü özyinelemeli olarak arar . Bu şekilde, bir lerna projesinin tüm alt paketler arasında paylaşılan tek bir eslint yapılandırmasına sahip olmasını sağlayabilirsiniz.

(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'tayım ve bu benim için çalışmıyor, bence file-executable-p ya da flycheck internals doğru dosyayı bulamadı. Çalışırken olduğu gibi .cmddosyayı değil dosyayı işaret ediyor .js.

Flycheck-eslint bir yorum buldum JavaScript projesinde yüklü eslint sürümünü ve bunun yerine dizin değişkenleri kullanmak için onların blog yazı .

Projenin kök dizininde bir dosya oluşturun .dir-locals.el

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

Javascript dosyasını ziyaret ettiğimde şimdi dosyayı flycheck-verify-setupdoğru buluyor<dir>/node_modules/.bin/eslint.cmd


0

Önceki çözümüm, farklı projelerde çalışmak için bir acıydı.

Sabit kod windows aptallık kabul edilen cevap değiştirdim.

(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

İşte Bae ve lunaryorn'un cevaplarını dir-locals.elprojenin kök dizinindeki (veya daha özel node_modules/olarak eslintikili ikilinin bulunduğu klasörü içeren dizindeki) bir dosyayı kullanarak birleştiren bir çözüm . Söz konusu dir-locals.eldosyayı aşağıdaki içerikle oluşturun.

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

Burada, js2-modejavascript dosyalarını düzenlemek için emacs ana modunu kullandığınızı varsayıyorum . Durum böyle değilse, bu satırı uygun şekilde değiştirin. Dosyanın ikinci satırı javascript-eslintsözdizimi denetleyicisini bu proje içinde kullanılacak tek satır yapar . Üçüncü satır, değişkeni flycheck-javascript-eslint-executableolarak ayarlar <root-dir>/node_modules/.bin/eslint. Bu şekilde emacları değiştirmiyoruz ' exec-path.


0

Bunun birkaç farklı varyasyonunu denedim ve tam olarak istediğimi bulamadım. Sonunda Emacs lisp'de benim zevkime göre değiştirecek kadar seviye atladım. Benim sürümüm ne yerel bir eslint aramak olduğunu ve biri bulunmazsa küresel olarak yüklü bir geri düşer:

(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)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.