Ошибка eslint no-extraneous-dependencies с рабочими пространствами npm

Я настроил монорепозиторий с использованием рабочих пространств NPM со следующей структурой высокого уровня:

      root
  common      // Shared package, named @company/common
    src
      ...
    package.json
    tsconfig.json
  web         // ReactJS package, named @company/web
    config
      ...
    public
      ...
    src
      ...
    package.json
    tsconfig.json
  mobile      // React Native package, named @company/mobile
    ...
    package.json
    tsconfig.json
  .eslintrc.json
  .prettierrc
  package.json
  tsconfig.json
  tsconfig.base.json

Все мои пакеты должны быть частными и отмечены как таковые в соответствующих package.json файлы.

Мне удалось все настроить так, чтобы я мог писать такой код в веб-приложениях и мобильных рабочих областях:

import { ITestInterface } from '@company/common';

С моей текущей настройкой я получаю предупреждение eslint в моей IDE (VS Code) всякий раз, когда я открываю любой файл, который импортирует что-либо из @company/common: '@company/common' should be listed in the project's dependencies. Run 'npm i -S @company/common' to add it

Я бы предпочел не отключать это предупреждение полностью, если это вообще возможно. Есть ли способ настроить eslint, чтобы он понимал монорепозиторий, чтобы он не выдавал мне предупреждения, когда я пытаюсь импортировать что-то из пакета (рабочей области) в моем монорепозитории?

2 ответа

У нас была аналогичная проблема в нашем монорепозитории с использованием аналогичной настройки (один файл eslintrc в корне), для которой потребовалось довольно много времени, чтобы найти подходящее решение.

В нашем eslintrc у нас было это:

      module.exports = {
    ...
    settings: {
                'import/resolver': {
                    typescript: {
                        extensions: ['.ts', '.tsx'],
                        project: ['**/tsconfig.json'],
                    },
                },
    ...
}

Что сработало очень хорошо, за исключением тонны no-extraneous-dependency . В итоге нам пришлось создать дополнительный файл eslintrc для каждого проекта, например:

         root
       team-one
          team-one-frontend
                .eslintrc.js
                tsconfig.json
          team-one-frontend2
                .eslintrc.js
                tsconfig.json
       team-two
          team-two-frontend
                .eslintrc.js
                tsconfig.json
          team-two-frontend2
                .eslintrc.js
                tsconfig.json
   .eslintrc.js
   .eslintignore

Каждый файл eslintrc для конкретного проекта будет переопределять только то, где искать файлы tsconfig, при этом используя все правила и другую конфигурацию от root. Так, например,.eslintrc.js.в team-one-frontend будет содержать это:

      module.exports = {
    settings: {
        'import/resolver': {
            typescript: {
                project: ['team-one/team-one-frontend'],
            },
        },
    },
};

Тот же контент с тремя другими путями в трех других проектах.

Может быть, перемещение .eslintrc.jsonк каждому отдельному пакету? Вы пытались запустить npm installопять в корень?

У меня такая установка, и у меня нет этой проблемы.

      root
  back-end
    src/
    .eslintrc.js
    tsconfig.json
    tsconfig.ref.json
    package.json
  front-end
    src/
    .eslintrc.js
    tsconfig.json
    tsconfig.ref.json
    package.json
  shared
    // some .ts files
    package.json
package.json
tsconfig.json

Если вас интересует tsconfig.ref.json, вот пример его настройки: https://2ality.com/2021/07/simple-monorepos.html .

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