Скрипт npm игнорирует аргументы команды grep - PullRequest
1 голос
/ 25 марта 2019

У меня есть удобная команда для поиска заметок TODO в моих файлах. Работает нормально прямо из командной строки (ubuntu).

Это простая команда CLI:

grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'

И это его появление в package.json

{
    "private": true,
    …
    "scripts": {
        "css:dev": "node tasks/postcss.js --mode development",
        "css:build": "node tasks/postcss.js --mode production",
        "js:dev": "webpack --mode development",
        "js:build": "webpack --mode production",
        "lint:css": "npx stylelint assets/css",
        "lint:js": "npx eslint assets/js",
        "images": "node tasks/images.js",
        "sprite": "node tasks/svgsprite.js",
        "todo": "grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'"
    }
}

При работе с npm или yarn игнорирует параметр exlude и запускается через папку node_modules.

Понятия не имею, как это исправить.

1 Ответ

3 голосов
/ 26 марта 2019

Исходное выполнение командной строки работает, потому что оболочка bash расширяет выражение --exclude-dir={node_modules,libs} до --exclude-dir=node_modules --exclude-dir=libs перед вызовом grep. grep рад принять несколько --exclude-dir аргументов и исключит каталоги, которые соответствуют любому из указанных имен.

Проблема с командой в package.json возникает из-за того, что npm не использует bash для запуска команды. Для запуска команды используется старый sh.

В некоторых системах sh - это просто другое имя для bash, и в этих системах ввод оригинальной команды в package.json будет работать. Предположительно система Ахмеда - одна из таких.

Однако в других системах (особенно в Debian и его потомках) sh - это , а не - то же самое, что bash В этих системах sh - намного более простая оболочка, и она не расширяет выражение --exclude-dir={node_modules,libs}. Так что grep видит нерасширенный аргумент и думает, что ему говорят об исключении каталога, имя которого буквально {node_modules,libs}. Очевидно, что это не даст желаемого результата.

Есть два очевидных способа исправить это. Один из них состоит в том, чтобы npm сказать sh, чтобы запустить bash оболочку для выполнения оригинальной команды:

  "todo": "bash -c \"grep -lir --color --exclude-dir={node_modules,libs} --exclude=package.json 'todo'\""

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

  "todo": "grep -lir --color --exclude-dir=node_modules --exclude-dir=libs --exclude=package.json 'todo'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...