3步解锁自动化脚本开发从繁琐配置到高效交付【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx在现代开发流程中脚本编写往往是连接各个环节的关键纽带。无论是环境搭建、代码构建还是部署发布都离不开脚本的支持。然而传统脚本开发却常常让开发者陷入困境Bash脚本难以处理复杂逻辑Node.js原生脚本又需要大量样板代码来实现系统交互。zx工具的出现彻底改变了这一局面它将JavaScript的灵活性与系统命令的强大功能完美结合让自动化脚本开发变得前所未有的简单高效。一、脚本开发的三大痛点你是否也曾深陷其中当你需要在不同操作系统上运行同一个部署脚本时是否为了兼容各种shell语法而焦头烂额当你需要在脚本中嵌套执行多个命令并处理它们之间的依赖关系时是否曾被复杂的管道和重定向搞得晕头转向当你需要并行执行多个耗时任务并在全部完成后进行下一步操作时是否曾陷入回调地狱或 Promise 链的泥潭这些问题正是传统脚本开发中普遍存在的痛点。痛点一环境兼容性的挑战跨平台脚本开发一直是开发者面临的一大难题。不同操作系统的shell语法差异、命令行工具的实现不同都可能导致脚本在一个环境中正常运行在另一个环境中却报错。为了兼容各种环境开发者往往需要编写大量的条件判断代码大大增加了脚本的复杂度和维护成本。痛点二命令嵌套与结果处理的复杂性在实际开发中我们经常需要根据一个命令的输出结果来决定下一步执行什么命令。传统的shell脚本中这通常需要使用管道、重定向和命令替换等技术代码可读性差出错率高。当命令嵌套层次较深时脚本的逻辑会变得非常晦涩难以理解和维护。痛点三异步控制的困境随着应用复杂度的提升脚本也需要处理越来越多的异步任务。例如并行下载多个文件、同时启动多个服务等。在Bash中实现异步控制非常困难而在Node.js中虽然可以使用Promise和async/await但原生的child_process模块使用起来并不直观需要编写大量的样板代码来处理错误和输出。二、zx工具的创新方案重新定义脚本开发面对上述痛点zx工具提供了一套全面而优雅的解决方案。它基于Node.js允许开发者使用JavaScript编写脚本同时提供了一系列强大的API来简化系统命令的执行、文件操作和异步控制。解决方案一统一的跨平台执行环境zx工具内部处理了不同操作系统之间的差异使得开发者可以使用统一的JavaScript语法来编写脚本无需担心环境兼容性问题。无论是Linux、macOS还是Windowszx脚本都能保持一致的行为。#!/usr/bin/env zx // 在任何支持Node.js的环境中都能正常工作 try { await $docker --version console.log(chalk.green(Docker已安装)) } catch (p) { console.log(chalk.red(Docker未安装请先安装Docker)) process.exit(1) } 适用场景需要在多环境运行的通用脚本如项目初始化脚本、跨平台部署脚本等。解决方案二直观的命令执行与结果处理zx引入了$函数使得执行系统命令变得像在Bash中一样简单直观同时又保留了JavaScript的灵活性。$函数返回一个ProcessPromise对象可以使用await来获取命令执行结果包括 stdout、stderr 和 exitCode。#!/usr/bin/env zx // 获取当前Git分支并处理结果 const branchOutput await $git branch --show-current const currentBranch branchOutput.stdout.trim() if (currentBranch ! main) { console.log(chalk.yellow(警告当前分支是 ${currentBranch}不是主分支)) // 询问用户是否继续 const answer await question(是否继续执行(y/n) ) if (answer.toLowerCase() ! y) { process.exit(0) } } // 执行构建命令并检查结果 try { await $npm run build console.log(chalk.green(构建成功)) } catch (p) { console.log(chalk.red(构建失败退出码${p.exitCode})) console.log(chalk.red(错误信息${p.stderr})) process.exit(1) } 适用场景需要根据命令执行结果进行条件判断的场景如代码质量检查、版本控制操作等。解决方案三强大的异步控制能力zx充分利用了JavaScript的异步特性提供了简洁的API来处理并行和串行任务。通过Promise.all可以轻松实现命令的并行执行而for...of循环结合await则可以实现顺序执行。#!/usr/bin/env zx // 并行执行多个耗时任务 console.log(开始并行处理任务...) const results await Promise.all([ $sleep 2; echo 任务1完成, $sleep 3; echo 任务2完成, $sleep 1; echo 任务3完成 ]) // 处理并行任务的结果 results.forEach((result, index) { console.log(任务${index 1}输出${result.stdout.trim()}) }) // 顺序执行任务 console.log(\n开始顺序处理任务...) const tasks [task1, task2, task3] for (const task of tasks) { console.log(开始处理${task}...) await $sleep 1; echo ${task}处理完成 } 适用场景需要优化执行效率的脚本如多文件并行处理、多服务启动等。三、实战案例从文件处理到CI/CD集成案例一自动化文件批量处理工具假设我们需要开发一个脚本用于批量处理目录中的图片文件重命名、压缩并生成一个HTML预览页面。使用zx我们可以轻松实现这一需求。#!/usr/bin/env zx import { glob } from zx // 配置参数 const inputDir ./images const outputDir ./processed-images const previewFile preview.html // 创建输出目录 await fs.mkdirp(outputDir) // 获取所有图片文件 const imageFiles await glob([${inputDir}/*.jpg, ${inputDir}/*.png]) if (imageFiles.length 0) { console.log(chalk.yellow(未找到图片文件)) process.exit(0) } // 并行处理图片 console.log(开始处理 ${imageFiles.length} 张图片...) await Promise.all(imageFiles.map(async (file, index) { const ext path.extname(file) const baseName image-${index 1}${ext} const outputPath path.join(outputDir, baseName) // 使用convert命令压缩图片 await $convert ${file} -quality 80 ${outputPath} console.log(chalk.green(处理完成: ${baseName})) return { original: path.basename(file), processed: baseName } })) // 生成预览HTML console.log(生成预览页面...) const previewContent !DOCTYPE html html head title图片处理预览/title style .image-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; padding: 10px; } .image-item { border: 1px solid #ddd; padding: 5px; border-radius: 4px; } .image-item img { width: 100%; height: auto; } /style /head body h1图片处理结果/h1 div classimage-grid ${(await glob(${outputDir}/*)).map(file div classimage-item img src${path.basename(file)} alt处理后的图片 p${path.basename(file)}/p /div ).join()} /div /body /html await fs.writeFile(previewFile, previewContent) console.log(chalk.green(预览页面已生成: ${previewFile}))这个脚本展示了zx在文件处理方面的强大能力。通过结合glob进行文件查找、fs模块进行文件操作、$函数执行系统命令ImageMagick的convert我们可以轻松实现复杂的文件处理任务。JavaScript系统交互的便利性在这里得到了充分体现。案例二CI/CD自动化部署脚本下面我们来看一个更复杂的案例一个完整的CI/CD部署脚本包括代码检查、测试、构建和部署等步骤。#!/usr/bin/env zx // 配置 const deployEnv process.argv[2] || staging const config { staging: { server: staging.example.com, path: /var/www/staging-app }, production: { server: prod.example.com, path: /var/www/production-app } }[deployEnv] if (!config) { console.log(chalk.red(无效的环境: ${deployEnv})) console.log(chalk.yellow(可用环境: staging, production)) process.exit(1) } console.log(chalk.blue(开始部署到 ${deployEnv} 环境...)) // 步骤1: 检查代码质量 console.log(chalk.cyan(步骤1/5: 检查代码质量)) try { await $npm run lint console.log(chalk.green(代码质量检查通过)) } catch (p) { console.log(chalk.red(代码质量检查失败)) process.exit(1) } // 步骤2: 运行测试 console.log(chalk.cyan(步骤2/5: 运行测试)) try { await $npm test console.log(chalk.green(测试通过)) } catch (p) { console.log(chalk.red(测试失败)) process.exit(1) } // 步骤3: 构建项目 console.log(chalk.cyan(步骤3/5: 构建项目)) try { await $npm run build:${deployEnv} console.log(chalk.green(项目构建成功)) } catch (p) { console.log(chalk.red(项目构建失败)) process.exit(1) } // 步骤4: 部署到服务器 console.log(chalk.cyan(步骤4/5: 部署到服务器)) try { // 压缩构建产物 await $tar -czf build.tar.gz dist // 传输到服务器 await $scp build.tar.gz ${config.server}:${config.path} // 远程解压并重启服务 await $ssh ${config.server} cd ${config.path} tar -xzf build.tar.gz rm build.tar.gz pm2 restart app console.log(chalk.green(部署成功)) } catch (p) { console.log(chalk.red(部署失败)) process.exit(1) } // 步骤5: 健康检查 console.log(chalk.cyan(步骤5/5: 健康检查)) try { const response await fetch(https://${config.server}/health) if (response.ok) { console.log(chalk.green(服务健康检查通过)) console.log(chalk.blue(成功部署到 ${deployEnv} 环境)) } else { throw new Error(健康检查失败状态码: ${response.status}) } } catch (p) { console.log(chalk.red(健康检查失败: ${p.message})) process.exit(1) }这个案例展示了zx在自动化部署方面的应用。脚本涵盖了从代码检查到最终健康检查的完整部署流程充分利用了zx的各种特性命令执行、错误处理、文件操作、HTTP请求等。通过这个脚本我们可以将复杂的部署流程自动化大大提高开发效率和部署可靠性。四、避坑指南zx脚本开发常见错误及解决方案错误场景一命令执行结果处理不当问题描述直接使用$函数的返回值作为字符串没有处理stdout的换行符。错误示例const branch await $git branch --show-current if (branch main) { // 这里比较的是包含换行符的完整输出 console.log(在主分支) }解决方案使用trim()方法去除首尾空白字符。正确示例const branch (await $git branch --show-current).stdout.trim() if (branch main) { console.log(在主分支) }错误场景二忽略命令执行错误问题描述没有处理命令执行失败的情况导致脚本在遇到错误时继续执行。错误示例await $npm install await $npm run build // 如果npm install失败这里仍会执行解决方案使用try/catch捕获错误或检查exitCode。正确示例try { await $npm install } catch (p) { console.log(chalk.red(安装依赖失败: ${p.stderr})) process.exit(1) } await $npm run build错误场景三并行执行中的资源竞争问题描述在并行执行多个命令时可能会出现文件或资源竞争的问题。错误示例// 可能导致文件写入冲突 await Promise.all([ $echo 内容1 output.txt, $echo 内容2 output.txt ])解决方案使用临时文件或确保资源访问的互斥性。正确示例// 使用临时文件避免冲突 const tempFiles await Promise.all([ $mktemp, $mktemp ]).then(results results.map(r r.stdout.trim())) await Promise.all([ $echo 内容1 ${tempFiles[0]}, $echo 内容2 ${tempFiles[1]} ]) // 合并结果 await $cat ${tempFiles[0]} ${tempFiles[1]} output.txt // 清理临时文件 await Promise.all(tempFiles.map(f $rm ${f}))五、官方资源与学习路径要深入学习和掌握zx工具可以参考以下官方资源官方文档项目中的docs/目录包含了详细的文档包括API参考、架构说明和常见问题解答。示例脚本examples/目录提供了多个实用示例展示了zx的各种用法从简单的命令执行到复杂的异步控制。源代码src/目录下的TypeScript文件提供了完整的类型定义和实现细节有助于理解zx的内部工作原理。如果你对zx项目感兴趣并希望贡献自己的力量可以参考contribution.md文档了解如何提交issue、贡献代码或改进文档。六、思考题如何使用zx实现一个带有进度条的文件传输脚本显示文件传输的进度百分比如何利用zx的并行执行能力优化一个包含多个独立步骤的CI/CD流程减少整体执行时间在处理敏感信息如API密钥、密码时如何使用zx安全地管理这些数据避免硬编码到脚本中通过思考和解决这些问题你将能够更深入地理解和应用zx工具编写出更加高效、可靠的自动化脚本。自动化脚本开发是现代开发流程中不可或缺的一环而zx工具则为这一环节提供了强大而优雅的解决方案。无论你是需要简化日常开发任务还是构建复杂的部署管道zx都能帮助你提高效率、减少错误让脚本开发变得更加愉悦和高效。现在就开始尝试使用zx体验自动化脚本开发的新方式吧【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
3步解锁自动化脚本开发:从繁琐配置到高效交付
3步解锁自动化脚本开发从繁琐配置到高效交付【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx在现代开发流程中脚本编写往往是连接各个环节的关键纽带。无论是环境搭建、代码构建还是部署发布都离不开脚本的支持。然而传统脚本开发却常常让开发者陷入困境Bash脚本难以处理复杂逻辑Node.js原生脚本又需要大量样板代码来实现系统交互。zx工具的出现彻底改变了这一局面它将JavaScript的灵活性与系统命令的强大功能完美结合让自动化脚本开发变得前所未有的简单高效。一、脚本开发的三大痛点你是否也曾深陷其中当你需要在不同操作系统上运行同一个部署脚本时是否为了兼容各种shell语法而焦头烂额当你需要在脚本中嵌套执行多个命令并处理它们之间的依赖关系时是否曾被复杂的管道和重定向搞得晕头转向当你需要并行执行多个耗时任务并在全部完成后进行下一步操作时是否曾陷入回调地狱或 Promise 链的泥潭这些问题正是传统脚本开发中普遍存在的痛点。痛点一环境兼容性的挑战跨平台脚本开发一直是开发者面临的一大难题。不同操作系统的shell语法差异、命令行工具的实现不同都可能导致脚本在一个环境中正常运行在另一个环境中却报错。为了兼容各种环境开发者往往需要编写大量的条件判断代码大大增加了脚本的复杂度和维护成本。痛点二命令嵌套与结果处理的复杂性在实际开发中我们经常需要根据一个命令的输出结果来决定下一步执行什么命令。传统的shell脚本中这通常需要使用管道、重定向和命令替换等技术代码可读性差出错率高。当命令嵌套层次较深时脚本的逻辑会变得非常晦涩难以理解和维护。痛点三异步控制的困境随着应用复杂度的提升脚本也需要处理越来越多的异步任务。例如并行下载多个文件、同时启动多个服务等。在Bash中实现异步控制非常困难而在Node.js中虽然可以使用Promise和async/await但原生的child_process模块使用起来并不直观需要编写大量的样板代码来处理错误和输出。二、zx工具的创新方案重新定义脚本开发面对上述痛点zx工具提供了一套全面而优雅的解决方案。它基于Node.js允许开发者使用JavaScript编写脚本同时提供了一系列强大的API来简化系统命令的执行、文件操作和异步控制。解决方案一统一的跨平台执行环境zx工具内部处理了不同操作系统之间的差异使得开发者可以使用统一的JavaScript语法来编写脚本无需担心环境兼容性问题。无论是Linux、macOS还是Windowszx脚本都能保持一致的行为。#!/usr/bin/env zx // 在任何支持Node.js的环境中都能正常工作 try { await $docker --version console.log(chalk.green(Docker已安装)) } catch (p) { console.log(chalk.red(Docker未安装请先安装Docker)) process.exit(1) } 适用场景需要在多环境运行的通用脚本如项目初始化脚本、跨平台部署脚本等。解决方案二直观的命令执行与结果处理zx引入了$函数使得执行系统命令变得像在Bash中一样简单直观同时又保留了JavaScript的灵活性。$函数返回一个ProcessPromise对象可以使用await来获取命令执行结果包括 stdout、stderr 和 exitCode。#!/usr/bin/env zx // 获取当前Git分支并处理结果 const branchOutput await $git branch --show-current const currentBranch branchOutput.stdout.trim() if (currentBranch ! main) { console.log(chalk.yellow(警告当前分支是 ${currentBranch}不是主分支)) // 询问用户是否继续 const answer await question(是否继续执行(y/n) ) if (answer.toLowerCase() ! y) { process.exit(0) } } // 执行构建命令并检查结果 try { await $npm run build console.log(chalk.green(构建成功)) } catch (p) { console.log(chalk.red(构建失败退出码${p.exitCode})) console.log(chalk.red(错误信息${p.stderr})) process.exit(1) } 适用场景需要根据命令执行结果进行条件判断的场景如代码质量检查、版本控制操作等。解决方案三强大的异步控制能力zx充分利用了JavaScript的异步特性提供了简洁的API来处理并行和串行任务。通过Promise.all可以轻松实现命令的并行执行而for...of循环结合await则可以实现顺序执行。#!/usr/bin/env zx // 并行执行多个耗时任务 console.log(开始并行处理任务...) const results await Promise.all([ $sleep 2; echo 任务1完成, $sleep 3; echo 任务2完成, $sleep 1; echo 任务3完成 ]) // 处理并行任务的结果 results.forEach((result, index) { console.log(任务${index 1}输出${result.stdout.trim()}) }) // 顺序执行任务 console.log(\n开始顺序处理任务...) const tasks [task1, task2, task3] for (const task of tasks) { console.log(开始处理${task}...) await $sleep 1; echo ${task}处理完成 } 适用场景需要优化执行效率的脚本如多文件并行处理、多服务启动等。三、实战案例从文件处理到CI/CD集成案例一自动化文件批量处理工具假设我们需要开发一个脚本用于批量处理目录中的图片文件重命名、压缩并生成一个HTML预览页面。使用zx我们可以轻松实现这一需求。#!/usr/bin/env zx import { glob } from zx // 配置参数 const inputDir ./images const outputDir ./processed-images const previewFile preview.html // 创建输出目录 await fs.mkdirp(outputDir) // 获取所有图片文件 const imageFiles await glob([${inputDir}/*.jpg, ${inputDir}/*.png]) if (imageFiles.length 0) { console.log(chalk.yellow(未找到图片文件)) process.exit(0) } // 并行处理图片 console.log(开始处理 ${imageFiles.length} 张图片...) await Promise.all(imageFiles.map(async (file, index) { const ext path.extname(file) const baseName image-${index 1}${ext} const outputPath path.join(outputDir, baseName) // 使用convert命令压缩图片 await $convert ${file} -quality 80 ${outputPath} console.log(chalk.green(处理完成: ${baseName})) return { original: path.basename(file), processed: baseName } })) // 生成预览HTML console.log(生成预览页面...) const previewContent !DOCTYPE html html head title图片处理预览/title style .image-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; padding: 10px; } .image-item { border: 1px solid #ddd; padding: 5px; border-radius: 4px; } .image-item img { width: 100%; height: auto; } /style /head body h1图片处理结果/h1 div classimage-grid ${(await glob(${outputDir}/*)).map(file div classimage-item img src${path.basename(file)} alt处理后的图片 p${path.basename(file)}/p /div ).join()} /div /body /html await fs.writeFile(previewFile, previewContent) console.log(chalk.green(预览页面已生成: ${previewFile}))这个脚本展示了zx在文件处理方面的强大能力。通过结合glob进行文件查找、fs模块进行文件操作、$函数执行系统命令ImageMagick的convert我们可以轻松实现复杂的文件处理任务。JavaScript系统交互的便利性在这里得到了充分体现。案例二CI/CD自动化部署脚本下面我们来看一个更复杂的案例一个完整的CI/CD部署脚本包括代码检查、测试、构建和部署等步骤。#!/usr/bin/env zx // 配置 const deployEnv process.argv[2] || staging const config { staging: { server: staging.example.com, path: /var/www/staging-app }, production: { server: prod.example.com, path: /var/www/production-app } }[deployEnv] if (!config) { console.log(chalk.red(无效的环境: ${deployEnv})) console.log(chalk.yellow(可用环境: staging, production)) process.exit(1) } console.log(chalk.blue(开始部署到 ${deployEnv} 环境...)) // 步骤1: 检查代码质量 console.log(chalk.cyan(步骤1/5: 检查代码质量)) try { await $npm run lint console.log(chalk.green(代码质量检查通过)) } catch (p) { console.log(chalk.red(代码质量检查失败)) process.exit(1) } // 步骤2: 运行测试 console.log(chalk.cyan(步骤2/5: 运行测试)) try { await $npm test console.log(chalk.green(测试通过)) } catch (p) { console.log(chalk.red(测试失败)) process.exit(1) } // 步骤3: 构建项目 console.log(chalk.cyan(步骤3/5: 构建项目)) try { await $npm run build:${deployEnv} console.log(chalk.green(项目构建成功)) } catch (p) { console.log(chalk.red(项目构建失败)) process.exit(1) } // 步骤4: 部署到服务器 console.log(chalk.cyan(步骤4/5: 部署到服务器)) try { // 压缩构建产物 await $tar -czf build.tar.gz dist // 传输到服务器 await $scp build.tar.gz ${config.server}:${config.path} // 远程解压并重启服务 await $ssh ${config.server} cd ${config.path} tar -xzf build.tar.gz rm build.tar.gz pm2 restart app console.log(chalk.green(部署成功)) } catch (p) { console.log(chalk.red(部署失败)) process.exit(1) } // 步骤5: 健康检查 console.log(chalk.cyan(步骤5/5: 健康检查)) try { const response await fetch(https://${config.server}/health) if (response.ok) { console.log(chalk.green(服务健康检查通过)) console.log(chalk.blue(成功部署到 ${deployEnv} 环境)) } else { throw new Error(健康检查失败状态码: ${response.status}) } } catch (p) { console.log(chalk.red(健康检查失败: ${p.message})) process.exit(1) }这个案例展示了zx在自动化部署方面的应用。脚本涵盖了从代码检查到最终健康检查的完整部署流程充分利用了zx的各种特性命令执行、错误处理、文件操作、HTTP请求等。通过这个脚本我们可以将复杂的部署流程自动化大大提高开发效率和部署可靠性。四、避坑指南zx脚本开发常见错误及解决方案错误场景一命令执行结果处理不当问题描述直接使用$函数的返回值作为字符串没有处理stdout的换行符。错误示例const branch await $git branch --show-current if (branch main) { // 这里比较的是包含换行符的完整输出 console.log(在主分支) }解决方案使用trim()方法去除首尾空白字符。正确示例const branch (await $git branch --show-current).stdout.trim() if (branch main) { console.log(在主分支) }错误场景二忽略命令执行错误问题描述没有处理命令执行失败的情况导致脚本在遇到错误时继续执行。错误示例await $npm install await $npm run build // 如果npm install失败这里仍会执行解决方案使用try/catch捕获错误或检查exitCode。正确示例try { await $npm install } catch (p) { console.log(chalk.red(安装依赖失败: ${p.stderr})) process.exit(1) } await $npm run build错误场景三并行执行中的资源竞争问题描述在并行执行多个命令时可能会出现文件或资源竞争的问题。错误示例// 可能导致文件写入冲突 await Promise.all([ $echo 内容1 output.txt, $echo 内容2 output.txt ])解决方案使用临时文件或确保资源访问的互斥性。正确示例// 使用临时文件避免冲突 const tempFiles await Promise.all([ $mktemp, $mktemp ]).then(results results.map(r r.stdout.trim())) await Promise.all([ $echo 内容1 ${tempFiles[0]}, $echo 内容2 ${tempFiles[1]} ]) // 合并结果 await $cat ${tempFiles[0]} ${tempFiles[1]} output.txt // 清理临时文件 await Promise.all(tempFiles.map(f $rm ${f}))五、官方资源与学习路径要深入学习和掌握zx工具可以参考以下官方资源官方文档项目中的docs/目录包含了详细的文档包括API参考、架构说明和常见问题解答。示例脚本examples/目录提供了多个实用示例展示了zx的各种用法从简单的命令执行到复杂的异步控制。源代码src/目录下的TypeScript文件提供了完整的类型定义和实现细节有助于理解zx的内部工作原理。如果你对zx项目感兴趣并希望贡献自己的力量可以参考contribution.md文档了解如何提交issue、贡献代码或改进文档。六、思考题如何使用zx实现一个带有进度条的文件传输脚本显示文件传输的进度百分比如何利用zx的并行执行能力优化一个包含多个独立步骤的CI/CD流程减少整体执行时间在处理敏感信息如API密钥、密码时如何使用zx安全地管理这些数据避免硬编码到脚本中通过思考和解决这些问题你将能够更深入地理解和应用zx工具编写出更加高效、可靠的自动化脚本。自动化脚本开发是现代开发流程中不可或缺的一环而zx工具则为这一环节提供了强大而优雅的解决方案。无论你是需要简化日常开发任务还是构建复杂的部署管道zx都能帮助你提高效率、减少错误让脚本开发变得更加愉悦和高效。现在就开始尝试使用zx体验自动化脚本开发的新方式吧【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考