Список аргументов слишком длинный - lint-staged -> tslint - PullRequest
0 голосов
/ 14 октября 2018

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

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

После запуска prettier мы закончилис 400+ файлами для фиксации.Итак, при запуске git commit lint-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 закончилась с ошибкойна стадии линтинга.В выводе не было дано описания ошибок.Затем мы попытались скопировать все пути к файлам, которые 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 пропал и linting начал работать без ошибок - независимо от того, сколько файлов было передано в качестве аргументов.

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

1 Ответ

0 голосов
/ 15 октября 2018

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

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

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

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

...