API 参考
$.sync
Zx 提供同步和异步的命令执行,分别返回 ProcessOutput 或 ProcessPromise。
const list = await $`ls -la`
const dir = $.sync`pwd`$({...})
$ 对象持有默认的 zx 配置,用于所有执行。要指定自定义预设,请将 $ 用作工厂
const $$ = $({
verbose: false,
env: {NODE_ENV: 'production'},
})
const env = await $$`node -e 'console.log(process.env.NODE_ENV)'`
const pwd = $$.sync`pwd`
const hello = $({quiet: true})`echo "Hello!"`此外,预设是可链接的
const $1 = $({ nothrow: true })
assert.equal((await $1`exit 1`).exitCode, 1)
const $2 = $1({ sync: true }) // Both {nothrow: true, sync: true} are applied
assert.equal($2`exit 2`.exitCode, 2)
const $3 = $({ sync: true })({ nothrow: true })
assert.equal($3`exit 3`.exitCode, 3)$({input})
input 选项将指定的 stdin 传递给命令。
const p1 = $({ input: 'foo' })`cat`
const p2 = $({ input: Readable.from('bar') })`cat`
const p3 = $({ input: Buffer.from('baz') })`cat`
const p4 = $({ input: p3 })`cat`
const p5 = $({ input: await p3 })`cat`$({signal})
signal 选项使进程可中止。
const {signal} = new AbortController()
const p = $({ signal })`sleep 9999`
setTimeout(() => signal.abort('reason'), 1000)$({timeout})
timeout 选项使进程在指定的延迟后自动终止。
const p = $({timeout: '1s'})`sleep 999`$({nothrow})
nothrow 选项抑制错误并返回带有详细信息的 ProcessOutput。
const o1 = await $({nothrow: true})`exit 1`
o1.ok // false
o1.exitCode // 1
o1.message // exit code: 1 ...
const o2 = await $({nothrow: true, spawn() { throw new Error('BrokenSpawn') }})`echo foo`
o2.ok // false
o2.exitCode // null
o2.message // BrokenSpawn ...完整的选项列表
interface Options {
cwd: string
ac: AbortController
signal: AbortSignal
input: string | Buffer | Readable | ProcessOutput | ProcessPromise
timeout: Duration
timeoutSignal: NodeJS.Signals
stdio: StdioOptions
verbose: boolean
sync: boolean
env: NodeJS.ProcessEnv
shell: string | true
nothrow: boolean
prefix: string
postfix: string
quote: typeof quote
quiet: boolean
detached: boolean
preferLocal: boolean | string | string[]
spawn: typeof spawn
spawnSync: typeof spawnSync
store: TSpawnStore
log: typeof log
kill: typeof kill
killSignal: NodeJS.Signals
halt: boolean
}另请参见 配置。
cd()
更改当前工作目录。
cd('/tmp')
await $`pwd` // => /tmp与 echo 类似,除了 string 参数之外,cd 接受并修剪 ProcessOutput 中的尾随换行符,从而实现常见的用法,例如
cd(await $`mktemp -d`)⚠️
cd在内部调用process.chdir(),因此它会影响全局上下文。 要使process.cwd()与单独的$调用同步,请启用 syncProcessCwd() 钩子。
fetch()
围绕 node-fetch-native 包的包装器。
const resp = await fetch('https://medv.io')
const json = await resp.json()在某些情况下,text() 或 json() 可能会产生非常大的输出,超过字符串大小限制。流就是为此而生的,因此我们对 fetch API 进行了微小的调整,使其更易于管道操作。
const p1 = fetch('https://example.com').pipe($`cat`)
const p2 = fetch('https://example.com').pipe`cat`question()
围绕 readline API 的包装器。
const bear = await question('What kind of bear is best? ')
const selected = await question('Select an option:', {
choices: ['A', 'B', 'C'],
})sleep()
围绕 setTimeout 函数的包装器。
await sleep(1000)echo()
console.log() 的替代方案,可以接受 ProcessOutput。
const branch = await $`git branch --show-current`
echo`Current branch is ${branch}.`
// or
echo('Current branch is', branch)stdin()
将 stdin 作为字符串返回。
const content = JSON.parse(await stdin())within()
创建一个新的异步上下文。
await $`pwd` // => /home/path
$.foo = 'bar'
within(async () => {
$.cwd = '/tmp'
$.foo = 'baz'
setTimeout(async () => {
await $`pwd` // => /tmp
$.foo // baz
}, 1000)
})
await $`pwd` // => /home/path
$.foo // still 'bar'await $`node --version` // => v20.2.0
const version = await within(async () => {
$.prefix += 'export NVM_DIR=$HOME/.nvm; source $NVM_DIR/nvm.sh; nvm use 16;'
return $`node --version`
})
echo(version) // => v16.20.0syncProcessCwd()
如果通过 cd() 更改了内部 $ 的当前工作目录,则使 process.cwd() 与之同步。
import {syncProcessCwd} from 'zx'
syncProcessCwd()
syncProcessCwd(false) // pass false to disable the hook由于性能开销,默认情况下禁用此功能。
retry()
重试一个回调函数几次。在第一次尝试成功后返回,或在指定的尝试次数后抛出异常。
const p = await retry(10, () => $`curl https://medv.io`)
// With a specified delay between attempts.
const p = await retry(20, '1s', () => $`curl https://medv.io`)
// With an exponential backoff.
const p = await retry(30, expBackoff(), () => $`curl https://medv.io`)spinner()
启动一个简单的 CLI spinner。
await spinner(() => $`long-running command`)
// With a message.
await spinner('working...', () => $`sleep 99`)默认情况下,对于 CI 禁用它。
glob()
globby 包。
const packages = await glob(['package.json', 'packages/*/package.json'])
const markdowns = glob.sync('*.md') // sync API shortcutwhich()
which 包。
const node = await which('node')如果使用了 nothrow 选项,则在找不到时返回 null。
const pathOrNull = await which('node', { nothrow: true })ps
@webpod/ps 包,提供一种跨平台列出进程的方式。
const all = await ps.lookup()
const nodejs = await ps.lookup({ command: 'node' })
const children = await ps.tree({ pid: 123 })
const fulltree = await ps.tree({ pid: 123, recursive: true })kill()
一个进程杀手。
await kill(123)
await kill(123, 'SIGKILL')tmpdir()
创建一个临时目录。
t1 = tmpdir() // /os/based/tmp/zx-1ra1iofojgg/
t2 = tmpdir('foo') // /os/based/tmp/zx-1ra1iofojgg/foo/tmpfile()
临时文件工厂。
f1 = tmpfile() // /os/based/tmp/zx-1ra1iofojgg
f2 = tmpfile('f2.txt') // /os/based/tmp/zx-1ra1iofojgg/foo.txt
f3 = tmpfile('f3.txt', 'string or buffer')
f4 = tmpfile('f4.sh', 'echo "foo"', 0o744) // executableminimist
minimist 包。
const argv = minimist(process.argv.slice(2), {})argv
作为 argv 的 process.argv 的 minimist 解析版本。
if (argv.someFlag) {
echo('yes')
}使用 minimist 选项来自定义解析
const myCustomArgv = minimist(process.argv.slice(2), {
boolean: [
'force',
'help',
],
alias: {
h: 'help',
},
})chalk
chalk 包。
console.log(chalk.blue('Hello world!'))fs
fs-extra 包。
const {version} = await fs.readJson('./package.json')os
os 包。
await $`cd ${os.homedir()} && mkdir example`path
path 包。
await $`mkdir ${path.join(basedir, 'output')}`yaml
yaml 包。
console.log(YAML.parse('foo: bar').foo)dotenv
envapi 包。
一个与 dotenv 格式的环境变量交互的 API。
// parse
const raw = 'FOO=BAR\nBAZ=QUX'
const data = dotenv.parse(raw) // {FOO: 'BAR', BAZ: 'QUX'}
await fs.writeFile('.env', raw)
// load
const env = dotenv.load('.env')
await $({ env })`echo $FOO`.stdout // BAR
// config
dotenv.config('.env')
process.env.FOO // BARquote()
默认 bash 引用函数。
quote("$FOO") // "$'$FOO'"quotePowerShell()
PowerShell 特定的引用。
quotePowerShell("$FOO") // "'$FOO'"useBash()
启用 bash 预设:设置 $.shell 为 bash,$.quote 为 quote。
useBash()usePowerShell()
切换到 PowerShell。应用 quotePowerShell 进行引用。
usePowerShell()usePwsh()
设置 pwsh (PowerShell v7+) 作为 $.shell 默认值。
usePwsh()