恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

如何用 zx within() 隔离配置变更的作用域?

  • 首页
  • 资讯中心
  • /
  • 如何用 zx within() 隔离配置变更的作用域?

相关资讯

TVBoxOSC:给电视盒子装一个每天自动更新的 TVBox 播放器 2026/9/10 10:30:40
如何把 ZLMediaKit 接入你的 Spring Boot 系统:从搭建流媒体服务器到跑通直播的完整指南 2026/9/10 10:30:40
CANN/GE内存管理模型加载API 2026/9/10 10:25:40

最新资讯

Kilo 仓库 Changesets 变更管理指南:从 changeset 文件到 GitHub Release Notes 的完整工作流
TradingAgents-CN 多智能体投资计划深度解读:以贵州茅台(600519)买入决策为例
curl_easy_escape 全面解析:libcurl 的 URL 编码函数原理与实战
PixWit:轻量高效的开发者截图录屏工具解析
Continue 项目 VS Code 扩展架构解析:VSCodeIDE 抽象、协议通信与 AI 增强功能实现
CANN/ge编译图API文档

今日推荐

AI搜索重构内容生态:企业从“流量争夺”转向“答案共建”
AI搜索的信任缺口:企业内容如何在答案时代自证可信
Spring Boot+Vue+Node.js售后服务系统开发实战

本周热门

超人会飞不算本事:系统稳定依赖清晰规则与边界设计
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
基于CNN的调制信号识别:MATLAB实现时频图分类实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

如何用 zx within() 隔离配置变更的作用域?

发布时间:2026/9/10 10:30:40
如何用 zx within() 隔离配置变更的作用域? 如何用 zx within() 隔离配置变更的作用域【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx用 zx 写脚本时$对象保存着 zx 的全部默认配置$.cwd、$.env、$.prefix、$.verbose等所有$命令都使用这份配置。直接给$.foo baz或$.cwd /tmp赋值会改变全局上下文脚本后续所有命令都会受到影响。很多任务只需要临时改配置比如让某几条命令在/tmp下执行、让单条命令跑在另一个 Node 版本上执行完希望配置自动恢复原状。zx 的within()就是为这个场景提供的 API它创建一个新异步上下文回调内部对配置的修改只在该上下文中生效回调结束后外部配置保持原样。本文基于官方 API 文档给出写法、运行方式和验证手段。准备环境按安装文档的要求操作系统Linux、macOS 或 WindowsJavaScript 运行时Node.js 12.17.0或 Bun 1.0.0、Deno 1.x/2.x、GraalVM Node.js某种 bash 或 PowerShell在项目目录安装 zxnpm install zx按快速上手文档的约定把脚本写成.mjs文件这样可以在顶层用await文件开头加 shebang然后直接用zxCLI 运行// script.mjs #!/usr/bin/env zx // ... 本文中的示例代码zx ./script.mjswithin() 如何隔离上下文API 文档对within()的定义是一句话Creates a new async context创建一个新的异步上下文。其实现位于 src/core.tsexport function withinR(callback: () R): R { return storage.run({ ...getStore() }, callback) }架构文档解释了背后的机制$工厂通过Proxy和AsyncLocalStorage把每次调用绑定到快照snapshot上下文上within()执行时把当前配置复制一份{ ...getStore() }再在这份拷贝上运行回调。因此回调内部对$的修改只落在拷贝上不会写回外部上下文。两个直接影响写法的特点均有文档依据回调既可以是同步的也可以是异步的隔离行为一致within()返回回调的返回值可以把上下文内命令的输出如ProcessPromise带出来继续用。实战一临时切换工作目录与自定义配置下面是 api.md 中的原始示例代码可直接运行注释中的输出为文档示例输出实际路径取决于你脚本启动时所在的目录await $pwd // /home/path $.foo bar within(async () { $.cwd /tmp $.foo baz setTimeout(async () { await $pwd // /tmp $.foo // baz }, 1000) }) await $pwd // /home/path $.foo // still bar各行的作用与判断依据第 2 行在外部上下文设置$.foo bar这是全局修改会持续生效within回调内的$.cwd /tmp让回调中所有$进程的工作目录变成/tmp回调内的$.foo也变成baz注意setTimeout延迟 1 秒后触发的回调仍然读到/tmp和baz说明隔离是按异步上下文维持的不是回调同步执行完就失效最后一行within结束后await $pwd 回到原目录$.foo仍是bar——这就是隔离成功的判定依据。实战二让单条命令运行在另一个 Node 版本下api.md 的第二个示例演示用$.prefix临时加载 nvm 环境、把 Node 切到 16只影响within内的那一条命令await $node --version // v20.2.0 const version await within(async () { $.prefix export NVM_DIR$HOME/.nvm; source $NVM_DIR/nvm.sh; nvm use 16; return $node --version }) echo(version) // v16.20.0要点$.prefix是拼接到每条命令开头的命令片段configuration 文档说明其默认值是set -euo pipefail;。示例用追加 nvm 加载语句所以默认 prefix 仍然保留回调return $node --version 把上下文内的命令输出带出来赋值给version用echo(version)打印注释中的v20.2.0/v16.20.0是文档示例输出实际取决于你本机的 Node 与 nvm 环境判断成功的标准是version与外部node --version不同且外部后续执行node时版本不受影响。嵌套 within()多个within()可以嵌套每一层各自隔离内层的修改不会渗透到外层。以下用例摘自 test/core.test.js 的isolates nested context and returns cb resultwithin(async () { const res await within(async () { $.verbose true return within(async () { assert.equal($.verbose, true) $.verbose false return foo }) }) assert.equal($.verbose, false) assert.equal(res, foo) })它同时验证了两件事外层修改$.verbose true对下一层可见但下一层再改成false后回到上一层时$.verbose仍是false这一层自己的值每层within都原样返回其回调的返回值foo。运行后如何验证完整脚本跑完后可以按文档给出的现象逐项核对within结束后的await $pwd 输出与脚本开头一致原工作目录外部上下文中设置的属性示例里的$.foo保持原值未被回调内的赋值覆盖通过return带出的结果可用echo()打印且与外部直接执行同一命令的结果不同如两个 Node 版本在 test/core.test.js 的just works用例中官方用assert.equal($.verbose, false)断言within结束后外部$.verbose未被回调内的$.verbose true污染——这是项目自带的验证方式。边界与注意事项cd()与$.cwd不是一回事。api.md 提示cd()内部调用process.chdir()会影响全局进程上下文而within对上下文内的$调用保留自己的工作目录引用——test/core.test.js 的keeps the cwd ref for internal $ calls用例中within内cd(/tmp)后即使外部process.chdir(/)within上下文中后续$命令仍然在/tmp执行。隔离针对的是配置$选项不是 shell 会话。within不启动子 shell它隔离的是AsyncLocalStorage中的选项上下文这与$.prefix里执行的 shell 语句是两回事。同步回调同样可用within(() { ... })不带async也能隔离见 test/core.test.js回调返回值同样会原样返回。如果只是想给单条命令传配置而不需要一块连续的作用域也可以按 api.md 的$({...})工厂用法写$({cwd: /tmp})cmd它只对那一次调用生效within() 适合一段流程内多条命令共用临时配置的场景。【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号