Список аргументов слишком длинный - lint-staged -> tslint
В нашем проекте мы столкнулись со странной проблемой после интеграции lint-staged вместе с prettier и tslint. Идея заключалась в том, чтобы применить prettier
а потом tslint
ко всем файлам в коммите, используя husky
предварительно зафиксировать git hook.
Чтобы весь проект соответствовал новому стилю кода, описанному prettier
мы решили сначала запустить prettier
для всего проекта, а затем зафиксируйте все эти файлы с помощью git hook, описанного выше.
После запуска 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 закончился с ошибкой на этапе 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 символов каждый).
Если это не так, то, возможно, ваша оболочка (или какой-либо другой инструмент в цепочке) имеет некоторые искусственные, более строгие ограничения.