Скрипты без оболочки с Execa 7
Хотя сценарии оболочки очень удобны, многим разработчикам нравится гибкость, выразительность и экосистема, которые предоставляются такими языками программирования, как JavaScript. zx, недавний популярный проект от Google, сочетающий в себе лучшее из обоих миров.
const branch = await $`git branch --show-current`
await $`deploy --branch=${branch}`
import { $ } from 'execa'
const branch = await $`git branch --show-current`
await $`deploy --branch=${branch}`
Зачем использовать и Node, и Bash? В Execa нет необходимости запоминать синтаксис оболочки: все это обычный JavaScript. Почти все специфичные для оболочки функции могут быть выражены в JavaScript. Для остальных крайних случаев доступна shellопция .
Это больше:
- Безопасность : инъекции оболочки технически невозможны.
- Кроссплатформенность : не на всех компьютерах с Windows доступен Bash.
- Производительность : создание оболочки для каждой команды имеет свою цену. Даже
npxможно пропустить, поскольку Execa может напрямую запускать локально установленные двоичные файлы.
# In Bash
API_KEY="secret" npx deploy "$cluster" &> logs.txt && echo "done"
// In JavaScript
import { $ } from 'execa'
const options = { env: { API_KEY: 'secret' } }
await $(options)`deploy ${cluster}`.pipeAll(’logs.txt’)
console.log('done')
import { $ } from 'execa'
import pRetry from 'p-retry'
await pRetry(
async () => await $`deploy dev_cluster`,
{ retries: 5 },
)
Основной child_processмодуль Node включает в себя множество полезных функций: тайм-аут, отмена, фоновые процессы , IPC , PID , UID/GID, слабые ссылки и многое другое. Execa добавляет несколько дополнительных : изящное завершение , очистка , чередующийся вывод и т. д. Их можно установить $(options)с помощью одной или нескольких команд.
import { $ } from 'execa'
const $$ = $({ timeout: 5000, all: true })
// `all` retrieves both stdout and stderr
const { all } = $$`deploy dev_cluster`
Дочерние процессы могут быть трудны для отладки. Вот почему Execa:
- Включает
verboseпараметр , который можно установить с помощьюNODE_DEBUG=execa. - Сообщает подробные сообщения об ошибках и свойства.
- Полностью не имеет состояния, что упрощает определение текущего каталога или любого другого параметра.
> NODE_DEBUG=execa node deploy.js
[16:50:03.305] deploy dev_cluster
........dev_cluster successfully deployed.
[16:53:06.378] deploy prod_cluster
.............prod_cluster successfully deployed.
import { $ } from 'execa'
// Pipe input from a string or buffer, like <<< in Bash
await $({ input: 'dev_cluster' })`deploy`
// Pipe input from a file, like < in Bash
await $({ inputFile: 'clusters.txt' })`deploy`
// Pipe output to a file, like >, 2> and &> in Bash
await $`deploy dev_cluster`.pipeStdout('stdout.txt')
await $`deploy dev_cluster`.pipeStderr('stderr.txt')
await $({ all: true })`deploy dev_cluster`.pipeAll('logs.txt')
// Pipe output to another command, like | and |& in Bash
await $`deploy dev_cluster`.pipeStdout($`grep done`)
// Pipe output to a stream, like 2>&1 in Bash
const { stdout } = await $`deploy dev_cluster`.pipeStderr(process.stdout)

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































