Кроссплатформенная конвейерная команда в сценарии NPM - PullRequest
0 голосов
/ 17 сентября 2018

Учитывая, что у нас есть сценарий NPM с каналом, аналогично тому, что предложено в Стамбульская документация :

"coveralls": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"

Очевидно, что Windows не принимает во внимание.

Как сделать такую ​​команду с конвейером кроссплатформенной в пакете Node.js?

Вопрос специфичен для Coveralls, но не ограничивается этим;это может быть любая команда с каналом.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Как в Bash, так и в командной строке Windows (например, cmd.exe и PowerShell ) есть оператор канала (|), поэтому не следует беспокоиться о перекрестном совместимость платформы.

Учитывая ваш пример npm-скрипта, основная несовместимость в отношении кроссплатформенной поддержки - это использование команды Bash cat. Использование cat не удастся выполнить через Windows cmd.exe , однако cat поддерживается через Windows PowerShell .

Чтобы обойти вышеупомянутую кроссплатформенную проблему, касающуюся 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 ) с использованием кроссплатформенности трубы будет в порядке.

0 голосов
/ 18 сентября 2018

Хотя я некоторое время не использовал Windows, ее процессор командной строки CMD.EXE поддерживает перенаправление команд, а также «передает» выходные данные одной программы на вход другой.

Подробнее см. Перенаправление синтаксиса .

Информацию о программном обеспечении трубопроводов см. В модуле NPM pipe-operator , в котором реализована реализация оболочки трубопровода Node / JavaScript.

...