【导语】:zx 是一个更不便、更敌对帮忙开发者写脚本的工具。有 Google “爸爸”的光环加持,该工具短短几天在 GitHub 上就破万 Star 了。
简介
Bash 很好,然而在编写脚本的时候,人们通常会抉择一种更不便的编程语言,JavaScript 就是一个很完满的抉择。然而规范的 Node.js 库在应用之前须要许多额定的操作,比方装置、引入库等,zx 提供一个包装器 child\_process,用于本义参数并提供合并的默认值。
#!/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}`
我的项目地址是:https://github.com/google/zx
装置应用
- 装置
npm i -g zx
简略应用。将编写的脚本放在 .mjs 后缀的文件中,或者应用 .js 后缀,然而须要 void async function () {...}() 对脚本进行包装。
- 脚本须要蕴含以下文件头:
#!/usr/bin/env zx
- 运行脚本(须要先增加执行权限):
chmod +x ./script.mjs ./script.mjs // 或者应用这个命令 zx ./script.mjs
常用命令
应用child\_process包中提供的exec函数能够把字符串当做命令执行,并返回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` ))
如果执行脚本返回非0状态码,将会抛出ProcessOutput对象:
try { await $`exit 1` } catch (p) { console.log(`Exit code: ${p.exitCode}`) console.log(`Error: ${p.stderr}`) }
抛出ProcessOutput对象构造如下:
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包,不须要导入就能够间接用
console.log(chalk.blue('Hello world!'))
- fs包,须要导入就能够间接用
let content = await fs.readFile('./package.json')
Promisified默认被引入了,相当于写了以下代码:
import {promises as fs} from 'fs'
- os包,须要导入就能够间接用
await $`cd ${os.homedir()} && mkdir example`
- zx能够从其余脚本导入:
#!/usr/bin/env node import {$} from 'zx' await $`date`
- 传递环境变量:
process.env.FOO = 'bar' await $`echo $FOO`
- 执行近程脚本:
zx https://medv.io/example-script.mjs
开源前哨
日常分享热门、乏味和实用的开源我的项目。参加保护 10万+ Star 的开源技术资源库,包含:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。