乐趣区

关于ide:几天狂增-11-万-Star谷歌这个脚本工具必须推荐一波

【导语】: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  

开源前哨 日常分享热门、乏味和实用的开源我的项目。参加保护 10 万 + Star 的开源技术资源库,包含:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。

退出移动版