幾天狂增 1.1 萬 Star!谷歌這個(gè)腳本工具必須推薦一波
zx 是一個(gè)更方便、更友好幫助開發(fā)者寫腳本的工具。有 Google “爸爸”的光環(huán)加持,該工具短短幾天在 GitHub 上就破萬 Star 了。
簡介
Bash 很好,但是在編寫腳本的時(shí)候,人們通常會(huì)選擇一種更方便的編程語言,JavaScript 就是一個(gè)很完美的選擇。但是標(biāo)準(zhǔn)的 Node.js 庫在使用之前需要許多額外的操作,比如安裝、引入庫等,zx 提供一個(gè)包裝器 child_process,用于轉(zhuǎn)義參數(shù)并提供合并的默認(rèn)值。
- #!/usr/bin/env zx
- await $`cat package.json | grep name`
- let branch = await $`git branch --show-current`
- await $`dep deploy --branch=${branch}`
- await Promise.all([
- $`sleep 1; echo 1`,
- $`sleep 2; echo 2`,
- $`sleep 3; echo 3`,
- ])
- let name = 'foo bar'
- await $`mkdir /tmp/${name}`
項(xiàng)目地址是:
https://github.com/google/zx
安裝使用
安裝
- npm i -g zx
簡單使用。將編寫的腳本放在 .mjs 后綴的文件中,或者使用 .js 后綴,但是需要 void async function () {...}() 對腳本進(jìn)行包裝。
腳本需要包含以下文件頭:
- #!/usr/bin/env zx
運(yùn)行腳本(需要先添加執(zhí)行權(quán)限):
- chmod +x ./script.mjs
- ./script.mjs
- // 或者使用這個(gè)命令
- zx ./script.mjs
常用命令
使用child_process包中提供的exec函數(shù)可以把字符串當(dāng)做命令執(zhí)行,并返回Promise<ProcessOutput>對象。
- let count = parseInt(await $`ls -1 | wc -l`)
- console.log(`Files count: ${count}`)
例如,并行上傳文件:
- let hosts = [...]
- await Promise.all(hosts.map(host =>
- $`rsync -azP ./src ${host}:/var/www`
- ))
如果執(zhí)行腳本返回非0狀態(tài)碼,將會(huì)拋出ProcessOutput對象:
- try {
- await $`exit 1`
- } catch (p) {
- console.log(`Exit code: ${p.exitCode}`)
- console.log(`Error: ${p.stderr}`)
- }
拋出ProcessOutput對象結(jié)構(gòu)如下:
- class ProcessOutput {
- readonly exitCode: number
- readonly stdout: string
- readonly stderr: string
- toString(): string
- }
cd(),修改工作路徑:
- cd('/tmp')
- await $`pwd` // outputs /tmp
fetch(),對node-fetch包的包裝:
- let resp = await fetch('http://wttr.in')
- if (resp.ok) {
- console.log(await resp.text())
- }
question(),對readline包的包裝:
- type QuestionOptions = { choices: string[] }
- function question(query: string, options?: QuestionOptions): Promise<string>
用法:
- let username = await question('What is your username? ')
- let token = await question('Choose env variable: ', {
- choices: Object.keys(process.env)
- })
chalk包,不需要導(dǎo)入就可以直接用
- console.log(chalk.blue('Hello world!'))
fs包,需要導(dǎo)入就可以直接用
- let content = await fs.readFile('./package.json')
Promisified默認(rèn)被引入了,相當(dāng)于寫了以下代碼:
- import {promises as fs} from 'fs'
os包,需要導(dǎo)入就可以直接用
- await $`cd ${os.homedir()} && mkdir example`
zx可以從其他腳本導(dǎo)入:
- #!/usr/bin/env node
- import {$} from 'zx'
- await $`date`
傳遞環(huán)境變量:
- process.env.FOO = 'bar'
- await $`echo $FOO`
執(zhí)行遠(yuǎn)程腳本:
- zx https://medv.io/example-script.mjs