查看原文
其他

几天狂增 1.1 万 Star!谷歌这个脚本工具必须推荐一波

小秋 开源前哨 2021-09-23

【导语】: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 () {...}() 对脚本进行包装。
  1. 脚本需要包含以下文件头:
#!/usr/bin/env zx
  1. 运行脚本(需要先添加执行权限):
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



- EOF - 


更多优秀开源项目(点击下方图片可跳转)




开源前哨

日常分享热门、有趣和实用的开源项目。参与维护10万+star 的开源技术资源库,包括:Python, Java, C/C++, Go, JS, CSS, Node.js, PHP, .NET 等

关注后获取

回复 资源 获取 10万+ star 开源资源



分享、点赞和在看

支持我们分享更多优秀开源项目,谢谢!

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存