В нашем проекте мы столкнулись со странной проблемой после интеграции 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
мы можем передать ограниченное количество аргументов, в противном случае - никаких проблем не возникает, независимо от количества аргументов.