Список аргументов слишком длинный - lint-staged -> tslint

В нашем проекте мы столкнулись со странной проблемой после интеграции lint-staged вместе с prettier и tslint. Идея заключалась в том, чтобы применить prettier а потом tslint ко всем файлам в коммите, используя husky предварительно зафиксировать git hook.

Чтобы весь проект соответствовал новому стилю кода, описанному prettierмы решили сначала запустить prettier для всего проекта, а затем зафиксируйте все эти файлы с помощью git hook, описанного выше.

После запуска prettier мы получили 400+ файлов для фиксации. Итак, при запуске git commitlint-staged передал все эти 400+ файлов в качестве аргументов prettier а также tslint скрипты.

Первоначально мы имели tslint как сценарий внутри package.json который выглядел следующим образом:

"lint": "tslint -c tslint.json --project src/tsconfig.json"

И lint-staged конфиг выглядел следующим образом:

{
  "linters": {
     "*.ts": ["prettier --write", "npm run lint", "git add"]
  },
  "ignore": ["**/*.spec.ts"]
}

Когда мы побежали git commit npm закончился с ошибкой на этапе linting. В выводе не было дано описания ошибок. Затем мы попытались скопировать все пути к файлам, которые lint-staged дал нам в терминал, и запустили npm run lint со всеми этими путями файлов вручную.

Ошибка, которую мы сказали, что Argument list too long,

sh: /path-to-app/node_modules/.bin/tslint: Argument list too long
npm ERR! code ELIFECYCLE
npm ERR! errno 126

В ходе дальнейших испытаний мы выяснили, что максимальное количество путей к файлам, которые могут быть приняты без каких-либо ошибок, составляет 357. Итак, когда мы запускали скрипт linting через npm run lint мы могли передать только 357 путей к файлам в качестве аргументов максимум.

Тем не менее, интересно то, что если мы изменим lint staged скрипт для использования tslint сразу (без npm run lint):

{
   "linters": {
      "*.ts": ["prettier --write", "tslint -c tslint.json --project src/tsconfig.json", "git add"]
   },
   "ignore": ["**/*.spec.ts"]
}

Эта ошибка с Argument list too long пропал, и линтинг начал работать без ошибок - независимо от того, сколько файлов было передано в качестве аргументов.

Таким образом, сама проблема была решена. Но остается вопрос - в чем причина такого поведения? В основном, при запуске сценариев с npm run в противном случае мы можем передать ограниченное количество аргументов - никаких проблем не возникает, независимо от количества аргументов.

1 ответ

Решение

Существуют ограничения на количество параметров и переменных среды, которые вы можете передать новому процессу. Эти ограничения исходят из самого ядра.

Однако, если вы используете современный Linux x86_64 (скорее всего), это не должно быть проблемой; конечно не только с 357 параметрами.

Теперь один параметр не может быть длиннее 128 КиБ. Если бы вы передавали все параметры в одной строке (которая считается одним аргументом), вы могли бы достичь предела, если бы каждый из путей был действительно большим (около 350 символов каждый).

Если это не так, то, возможно, ваша оболочка (или какой-либо другой инструмент в цепочке) имеет некоторые искусственные, более строгие ограничения.

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