Кроссплатформенная конвейерная команда в скрипте 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.

Другие вопросы по тегам