Цели действия Node-gyp (или gyp), содержащие =, & в Linux
Я использую node-gyp в Linux и мне нужно использовать действия для определения пользовательских шагов сборки (обратите внимание на то, является ли это проблемой node-gyp или общей проблемой gyp).
Документация, кажется, предлагает, чтобы вы указали команду для шагов сборки в виде массива строк, которые должны быть объединены вместе в какой-то момент для формирования команды:
'action': ['python', 'tools/js2c.py', '<@(_outputs)', 'CORE', '<@(core_library_files)'],
Так как это Linux, node-gyp собирается сгенерировать make-файл для каждой цели в файле binding.gyp, и для действий в этом make-файле появится пользовательская команда.
Проблема, с которой я сталкиваюсь, состоит в том, что команда должна содержать знак =, чтобы установить переменную среды как часть команды, и мне нужно объединить команды с помощью &&, например:
export FOO=BAR && do-something-else --option
Если я попытаюсь указать это в качестве шага действия, я столкнусь с различными проблемами. Я попытался добавить каждое слово в команду как отдельный элемент массива.
'action': ['export', 'FOO=BAR', '&&', 'do-something-else', '--option'],
Это не работает, gyp (или, скорее, оболочка, в которую передается команда) жалуется, что '&&' не является допустимым идентификатором.
Посмотрев в сгенерированный make-файл, команда была расширена до этого, что объясняет ошибку оболочки:
export "FOO=BAR" "&&" do-something-else --option
Кавычки оставлены вокруг присваивания переменной и символа &&. Непонятно почему. Я пробовал много вариантов, чтобы остановить это безрезультатно. Все, что содержит = или &, заканчивается кавычками, оставленными вокруг него, что в большинстве случаев делает синтаксис команды недействительным.
Предложения приветствуются.
0 ответов
Причина, по которой это происходит, заключается в том, что Gyp считает все после первого слова аргументом команды, указанной в первом слове, поэтому он цитирует эти и другие специальные символы, чтобы оболочка их не интерпретировала. Я не думаю, что есть какой-либо способ предотвратить это, что, как вы обнаружили, делает создание пользовательской команды с использованием конвейера команд оболочки практически невозможным.