Запустите глобальный ESLint с помощью плагина eslint-plugin-jsx-a11y

Я пытаюсь запустить глобальную установку ESLint для одного файла, используя указанный путь к файлу конфигурации:

eslint FileToCheck.jsx --config "../path/to/config/.eslintrc.js"

но я получаю ошибку

ESLint не смог найти плагин "eslint-plugin-jsx-a11y". Это может произойти по нескольким причинам:

  1. Если ESLint установлен глобально, убедитесь, что eslint-plugin-jsx-a11y также установлен глобально. Глобально установленный ESLint не может найти локально установленный плагин.

  2. Если ESLint установлен локально, вероятно, плагин установлен неправильно. Попробуйте переустановить, выполнив следующее:

    npm я eslint-plugin-jsx-a11y@ последний --save-dev

Таким образом, кажется, что #1 применимо, и мне нужно установить https://github.com/evcohen/eslint-plugin-jsx-a11y глобально. Я пытаюсь сделать это с

yarn global add eslint-plugin-jsx-a11y

и повторно запустите исходную команду ESLint, но она завершается с той же ошибкой. Я заметил во время yarn global add что некоторые из выходных сказали

"eslint-plugin-jsx-a11y@6.0.2" не имеет двоичных файлов

Действительно, когда я проверяю ~/AppData/Local/Yarn/bin, я не нахожу никаких двоичных файлов для этого плагина (хотя я делаю для ESLint).

Как я могу заставить ESLint работать глобально с этим плагином? Хороший ответ не скажет мне просто установить его локально, но на самом деле ответит на заданный вопрос - как этого можно добиться с помощью глобально установленного ESLint и плагинов.

Пакеты, которые я установил глобально с пряжей:

  • eslint
  • столпотворение-жильный
  • столпотворение-eslint
  • eslint-плагин-импорт
  • eslint-плагин реагировать
  • eslint-плагин-JSX-a11y
  • eslint-конфиг-Airbnb

Вот мой.eslintrc.js, который может иметь или не иметь отношение:

module.exports = {
  'extends': 'airbnb',
  'plugins': [
    'react',
    'jsx-a11y',
    'import'
  ],

  'env': {
    'browser': true
  },

  'parser': 'babel-eslint',

  'rules': {
    'prefer-template': 'error',
    'comma-dangle': ['error', 'always-multiline'],
    'import/no-extraneous-dependencies': 'off',
    'react/prop-types': 'off',
    'react/jsx-no-bind': 'off',
    'jsx-a11y/no-static-element-interactions': 'off',
    'jsx-a11y/no-noninteractive-element-interactions': 'off',
    'jsx-a11y/alt-text': 'off',
    'jsx-a11y/no-autofocus': 'off',
    'eqeqeq': ['error', 'always', { 'null': 'ignore' }],
    'no-use-before-define': ['error', { 'functions': false }],
    'func-style': ['error', 'declaration', { 'allowArrowFunctions': true }],
    'no-console': 'off',
    'no-alert': 'off',
    'no-continue': 'off',
    'no-param-reassign': ['error', { 'props': false }],
    'no-plusplus': ['error', { 'allowForLoopAfterthoughts': true }],
    'one-var-declaration-per-line': ['error', 'initializations'],
    'one-var': 'off', // Not needed because of one-var-declaration-per-line
    'indent': ['error', 2, {
      'FunctionDeclaration': { 'parameters': 'first' },
      'SwitchCase': 1
    }],
    'no-restricted-syntax': [
      'error',
      {
        selector: 'ForInStatement',
        message: 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.',
      },
      {
        selector: 'LabeledStatement',
        message: 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.',
      },
      {
        selector: 'WithStatement',
        message: '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.',
      },
    ],
  }
};

if (process.env.FEATURE_FLAGS) {
  const flags = Object.keys(JSON.parse(process.env.FEATURE_FLAGS));

  module.exports.globals = flags.reduce(function (flagConfig, flag) {
    flagConfig[flag] = false;
    return flagConfig;
  }, {});
}

0 ответов

Эта проблема вызвана изменениями в способе загрузки пакетов ESLint между версиями 5 и 6. Подробнее см. Здесь.

Плагины и общие конфигурации больше не зависят от местоположения ESLint

Раньше ESLint загружал плагины относительно местоположения самого пакета ESLint. В результате мы предложили пользователям с глобальными установками ESLint также устанавливать плагины глобально, а пользователям с локальными установками ESLint следует устанавливать плагины локально. Однако из-за ошибки дизайна эта стратегия привела к тому, что ESLint случайно не смог загрузить плагины и общие конфигурации при определенных обстоятельствах, особенно при использовании инструментов управления пакетами, таких как lerna и Yarn Plug n 'Play.

Практическое правило: с ESLint v6 плагины всегда должны устанавливаться локально, даже если ESLint был установлен глобально. Точнее, ESLint v6 разрешает плагины относительно проекта конечного пользователя по умолчанию и всегда разрешает совместно используемые конфигурации и парсеры относительно расположения файла конфигурации, который их импортирует.

Для адреса: Если вы используете глобальную установку ESLint (например, установленную с npm install eslint --global) вместе с плагинами, вы должны установить эти плагины локально в проектах, в которых вы запускаете ESLint. Если ваш файл конфигурации расширяет общие конфигурации и / или парсеры, вы должны убедиться, что эти пакеты установлены как зависимости проекта, содержащего файл конфигурации.

Если вы используете файл конфигурации, расположенный за пределами локального проекта (с --config flag), рассмотрите возможность установки подключаемых модулей как зависимостей этого файла конфигурации и установки --resolve-plugins-relative-to в расположение файла конфигурации.

По этому поводу ведется немало дискуссий, но текущее положение дел (конец 2019 г.), похоже, таково, что на данный момент нет хороших решений, кроме отката к eslint@5.x:(Смотрите этот выпуск, чтобы узнать больше.

Другие вопросы по тегам