Кроссплатформенная конвейерная команда в скрипте NPM
Учитывая, что у нас есть скрипт NPM с каналом, аналогично тому, что предлагается в документации Стамбула:
"coveralls": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"
Это, очевидно, не принимает во внимание Windows.
Как сделать такую команду с конвейером кроссплатформенной в пакете Node.js?
Вопрос специфичен для Coveralls, но не ограничивается этим; это может быть любая команда с каналом.
2 ответа
И в Bash, и в командной строке Windows (например, cmd.exe и PowerShell) есть оператор канала (|
) так что это не должно быть проблемой в отношении кросс-платформенной совместимости.
Учитывая ваш пример npm-скрипта, основная несовместимость в отношении кроссплатформенной поддержки - это использование Bash. cat
команда. Использованиеcat
произойдет сбой через Windowscmd.exe, однако cat
поддерживается через WindowsPowerShell.
Обойти вышеупомянутую кроссплатформенную проблему, касающуюсяcat
рассмотрите возможность использования служебного скриптаnodejs следующим образом. Давайте назовем файл cat.js
:
cat.js
const fs = require('fs');
fs.readFile(process.argv[2], function(err, data) {
process.stdout.write(data);
});
Как видите, он использует встроенные узлы:
fs.readFile
читать содержимое файла.- Путь к файлу для чтения будет предоставлен в качестве аргумента сценария и записан с использованием
process.argv
, - Содержимое файла записано в
process.stdout
Примечание: для краткостиcat.js
не включает в себя захват / обработку ошибок, поэтому вы можете добавить их.
скрипт npm
Тогда в вашемscripts
раздел вашегоpackage.json мы вызываемcat.js
и передать путь к файлу (т.е../coverage/lcov.info
) в качестве аргумента. Например:
"scripts": {
"coveralls": "node cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"
},
Примечание. Приведенный выше скрипт npm предполагаетcat.js
находится в том же каталоге и уровне, что иpackage.json. Если вы решите найти его в другом месте, путь к нему нужно будет переопределить.Например"node path/to/cat ./coverage/lcov.info | ..."
До тех пор, пока файлnodejs указан справа от канала (|
) используетprocess.stdin
читать с stdin
т.е. файловый дескриптор 0
, (как делает coveralls.js) с использованием кроссплатформенности трубы будет в порядке.
Около
Мы сделали пакет именно для этого:https://github.com/cpuabuse/cross-cat
Кросс-платформа cat
команда, ведущая себя точно так же, как в Linux cat
команда. Вы можете назвать это какcat
или cross-cat
из сценария. Работает с окнамиcmd
а также coveralls
также.
Установить
npm install cross-cat --save-dev
Использовать
"scripts": {
"coveralls": "cross-cat coverage/lcov.info | coveralls"
}
Хотя я некоторое время не использовал Windows, ее процессор командной строки CMD.EXE поддерживает перенаправление команд, а также "передает" вывод одной программы на вход другой.
Посмотрите Синтаксическое Перенаправление для получения дополнительной информации.
Информацию о программном обеспечении трубопроводов можно найти в модуле NPM pipe-operator для реализации трубопровода оболочки в Node/JavaScript.