nv-context:开发者必备的上下文管理工具,提升开发效率与团队协作
1. 项目概述一个为开发者量身定制的上下文管理工具如果你是一名开发者尤其是在处理大型项目、复杂配置或者需要频繁切换工作环境时一定对“上下文”这个概念又爱又恨。爱的是它能帮你隔离环境、管理配置让项目井井有条恨的是手动管理这些上下文——比如切换不同的环境变量、配置文件、工具链——不仅繁琐还容易出错。今天要聊的这个项目johnnichev/nv-context就是瞄准这个痛点而来的。它不是一个庞大的框架而是一个精巧的命令行工具核心目标就一个让你能像切换电视频道一样轻松、快速、可靠地在不同的开发“上下文”之间切换。简单来说nv-context可以理解为一个高级的、可编程的“环境变量和配置管理器”。它允许你为不同的项目、任务或环境比如开发、测试、生产定义一套独立的配置集合然后通过一个简单的命令瞬间激活。这背后解决的远不止是敲几个export命令那么简单。它关乎开发效率、团队协作的标准化以及个人工作流的自动化。想象一下你正在开发一个微服务A需要连接测试数据库和消息队列下一秒你需要调试微服务B它需要另一套完全不同的依赖和端点。没有上下文管理你可能会手忙脚乱地修改.env文件或者开一堆终端标签页分别source不同的脚本。而nv-context旨在让你用context use service-a-test和context use service-b-dev这样的命令就完成所有底层环境的切换。这个工具的名字也很有意思nv很容易让人联想到nvm(Node Version Manager) 或pyenv(Python 环境管理器) 这类工具它们管理的是运行时版本。而nv-context管理的是更广义的“上下文”可以包含环境变量、别名alias、函数、甚至自动执行的初始化脚本。它的应用场景非常广泛从全栈开发中前后端不同环境的切换到数据科学中不同数据集和模型参数的实验管理再到运维人员管理多套云平台或Kubernetes集群的认证信息。对于任何需要与复杂、多变配置打交道的技术从业者来说这都是一件能显著提升幸福感的利器。2. 核心设计理念与架构拆解2.1 为什么需要专门的上下文管理在深入nv-context之前我们先得理清一个根本问题现有的工具如 Shell 的export、.bashrc、.env文件、direnv等不够用吗为什么还要再造一个轮子答案在于“聚合”与“编排”的能力。传统的环境变量管理是分散和手动的。你可能有项目A的.env.development项目B的.env系统级的/etc/profile还有自己杂七杂八的 Shell 别名。当你要进入一个工作状态时需要手动组合source这些资源顺序错了可能冲突遗漏了就会报错。更麻烦的是有些上下文不仅仅是环境变量还涉及特定路径的加入比如将某个项目的bin目录加入PATH。复杂别名和函数为当前上下文定制的快捷命令。依赖服务的状态检查切换上下文时自动检查所需的数据库、缓存服务是否在线。视觉提示在终端提示符PS1中明确显示当前所处的上下文避免误操作。nv-context的设计理念就是将所有这些离散的、与某个特定工作场景相关的配置和逻辑打包成一个独立的、可版本控制的“上下文定义文件”。这个文件不仅声明了“是什么”环境变量值还可以定义“怎么做”切换时的钩子脚本。这种设计带来了几个核心优势隔离性每个上下文自成一体互不干扰。切换到生产上下文时绝不会意外携带开发环境的调试标志。可复现性团队新成员拿到项目只需安装nv-context并导入对应的上下文定义就能获得一模一样的环境配置极大降低了搭建开发环境的成本。安全性敏感信息如密钥可以存储在加密的上下文文件中或者通过集成外部密钥管理服务动态获取避免明文散落在多个.env文件中。自动化通过与 Shell 深度集成可以实现进入特定目录自动切换上下文离开时自动清理实现真正的“无感”上下文切换。2.2 工具的核心工作流程与数据模型理解了“为什么”我们再来看“怎么做”。nv-context的核心工作流程可以概括为定义 - 存储 - 激活 - 生效。定义用户通过命令行或编辑配置文件创建一个上下文。一个上下文通常包含元数据名称、描述、标签。环境变量键值对集合。Shell 配置Bash/Zsh 的别名alias、函数function、Shell 选项设置。脚本钩子在上下文被激活on_activate和停用on_deactivate时自动执行的脚本。这是实现复杂初始化如启动 Docker Compose和清理逻辑的关键。依赖关系可以声明依赖其他上下文实现配置的继承和组合。存储这些上下文定义被持久化存储。nv-context通常会将它们保存在用户主目录下的一个特定文件夹中例如~/.config/nv-context/contexts/每个上下文一个文件可能是 YAML、JSON 或 TOML 格式。这种存储方式便于备份、同步通过 Git和分享。激活用户执行nv-context use context-name。此时工具会读取目标上下文的定义文件。执行on_activate钩子脚本如果有。将定义的环境变量、别名等“注入”到当前 Shell 会话中。这里的技术关键点是它必须修改当前 Shell 进程的环境而不是启动一个子 Shell。这通常通过source一个由工具动态生成的 Shell 脚本来实现。生效注入完成后当前终端窗口就处于该上下文环境中。所有在此之后启动的进程都会继承这些环境变量用户也可以直接使用新定义的别名和函数。其背后的数据模型是简洁而强大的。一个典型的上下文定义文件可能长这样以 YAML 为例name: “my-webapp-production“ description: “用于部署和调试线上 Web 应用的环境“ env: APP_ENV: “production“ DATABASE_URL: “postgresql://prod-user:***prod-db-host:5432/prod_db“ LOG_LEVEL: “warn“ AWS_PROFILE: “production-account“ shell: aliases: deploy: “./scripts/deploy.sh“ logs: “kubectl logs -f deployment/my-webapp“ functions: | connect_db() { psql “$DATABASE_URL“ } hooks: on_activate: | echo “正在切换到生产环境请谨慎操作“ # 可以在这里检查 kubectl 配置或 AWS 登录状态 on_deactivate: | echo “已离开生产环境。“ # 清理临时文件或断开连接这个模型将配置数据、Shell 扩展和行为脚本有机地结合在了一起。注意在实际使用中像DATABASE_URL这样的敏感信息绝对不应该以明文形式写在版本控制的配置文件中。成熟的上下文管理工具会提供与操作系统密钥环如 macOS Keychain、Linux Secret Service或第三方密码管理器如 HashiCorp Vault、AWS Secrets Manager集成的能力在激活时动态获取并注入为环境变量。2.3 与同类工具的差异化对比市面上已有一些优秀的上下文或环境管理工具如direnv、autoenv以及各种语言特定的.env加载库。nv-context的差异化优势在哪里vsdirenv/autoenv: 这两者都是基于目录的自动加载工具核心逻辑是“进入目录 - 加载.envrc”。它们非常轻量、直接。nv-context则更强调显式的、命令驱动的管理。你拥有一个中央仓库来管理所有上下文可以随时列表、查看、切换而不依赖于当前所在目录。这对于管理那些不局限于特定目录的全局性上下文如“公司 VPN 连接”、“云平台 A 的管理员模式”非常有用。可以说direnv是“基于位置的环境”而nv-context是“基于命名的环境集合”。vs 手动 Shell 配置这是维度的升级。手动管理在上下文数量少时可行一旦超过三五个记忆和切换成本急剧上升且容易污染全局 Shell 配置。nv-context提供了命名空间和生命周期管理。vs 容器/虚拟环境Docker 和 Python 的venv提供了极强的隔离性但代价是资源开销和启动时间。nv-context更轻量它管理的是 Shell 层的配置适用于不需要完整操作系统或解释器隔离但需要快速切换配置的场景。两者甚至可以结合使用在容器内使用nv-context管理不同的应用运行参数。nv-context的定位是填补轻量级目录自动加载和重量级容器隔离之间的空白为开发者提供一个灵活、集中、可编程的配置切换层。3. 从零开始上手安装与基础使用3.1 多种安装方式详解nv-context作为一个命令行工具通常提供多种安装方式以适应不同用户的操作系统和习惯。最常见的是通过包管理器。对于 macOS 用户使用 Homebrew这是最推荐的方式便于后续更新和管理。brew tap johnnichev/tap # 如果作者提供了自定义的 Homebrew Tap brew install nv-context或者如果项目已经进入主流仓库brew install nv-context安装完成后运行nv-context --version验证安装。对于 Linux 用户使用包管理器如果项目提供了对应发行版的包如.deb或.rpm可以直接下载安装。更通用的方式是通过脚本安装或从源码编译。# 假设提供安装脚本务必从官方渠道获取并检查脚本内容 curl -fsSL https://raw.githubusercontent.com/johnnichev/nv-context/main/install.sh | bash或者对于 Go 语言编写的工具可以直接用go installgo install github.com/johnnichev/nv-contextlatest确保$GOPATH/bin或$GOBIN在你的PATH环境变量中。对于 Windows 用户可以通过 Scoop 或 Chocolatey 这类 Windows 包管理器安装如果作者提供了相应包。否则可能需要直接从 GitHub Releases 页面下载预编译的.exe文件并将其所在目录加入系统PATH。从源码编译安装适合开发者或想使用最新特性的用户。前提是安装了 Go 工具链假设项目用 Go 编写。git clone https://github.com/johnnichev/nv-context.git cd nv-context make build # 或者直接 go build -o nv-context ./cmd/nv-context sudo cp nv-context /usr/local/bin/ # 或任何在 PATH 中的目录实操心得在生产环境或团队中推广时强烈建议统一安装方式。例如在团队内部文档中明确指定使用 Homebrew 或某个特定版本的二进制包。这能避免因安装方式不同导致的细微环境差异问题。对于通过脚本安装的方式首次运行前一定要花时间阅读脚本内容理解它做了什么比如修改了哪些配置文件这是基本的安全意识。3.2 初始化配置与第一个上下文安装完成后通常不需要复杂的初始化。但有些工具会需要一个初始化命令来创建配置目录和基础文件结构。nv-context init这个命令可能会在~/.config/nv-context下创建contexts目录和主配置文件config.yaml。现在让我们创建第一个上下文。假设你有一个名为“alpha-project”的Web项目它有一个开发环境。nv-context create alpha-dev这条命令可能会打开你默认的文本编辑器由$EDITOR环境变量定义让你编辑一个空的上下文模板。或者它可能是一个交互式命令行向导提示你输入环境变量等。更直接的方式是使用edit子命令或直接编辑上下文文件。上下文文件通常位于~/.config/nv-context/contexts/alpha-dev.yaml。你可以用任何编辑器打开它并填入内容name: alpha-dev description: Alpha项目的开发环境 env: PROJECT_NAME: “alpha“ NODE_ENV: “development“ API_BASE_URL: “http://localhost:3000“ DATABASE_URL: “postgresql://localhost:5432/alpha_dev“ shell: aliases: run-dev: “npm run dev“ test-unit: “npm test“ db-migrate: “npx knex migrate:latest“ hooks: on_activate: | echo “ 已激活 Alpha 项目开发环境“ echo “API 端点: $API_BASE_URL“ on_deactivate: | echo “ 离开 Alpha 开发环境“保存文件后这个上下文就定义好了。3.3 核心命令速览与使用模式nv-context的核心命令集通常非常简洁遵循“动词对象”的模式。列表与查看nv-context list # 列出所有已定义的上下文 nv-context show alpha-dev # 查看某个上下文的详细定义激活与切换nv-context use alpha-dev # 切换到 alpha-dev 上下文执行后你的当前 Shell 会话就会加载该上下文的所有配置。你会立刻看到on_activate钩子输出的提示信息并且可以马上使用echo $API_BASE_URL验证环境变量或者直接运行run-dev别名来启动开发服务器。停用与清除nv-context deactivate # 停用当前上下文恢复到“干净”状态 # 或者直接切换到另一个上下文也会自动停用前一个 nv-context use another-context有些设计里可能没有单独的deactivate而是用use default或use none来表示回到无上下文状态。编辑与删除nv-context edit alpha-dev # 使用 $EDITOR 打开对应文件进行编辑 nv-context delete alpha-dev --confirm # 删除上下文定义谨慎操作导入与导出nv-context export alpha-dev alpha-dev.context.yaml # 导出为文件 nv-context import --file alpha-dev.context.yaml # 从文件导入这个功能对于团队共享配置至关重要。你可以将导出的 YAML 文件放入项目仓库新成员一键导入即可。基础使用模式就是创建 - 编辑 - 使用。当你开始一天的工作打开终端首先nv-context use project-a-dev然后开始编码。中途需要处理线上问题就nv-context use project-a-prod切换后立刻拥有生产环境的全部配置kubectl context、AWS profile、数据库连接串等。这种流畅的切换体验是手动管理无法比拟的。4. 高级特性与实战应用场景4.1 上下文继承与组合构建配置层次结构当你的项目环境变得复杂时可能会出现配置冗余。比如你有“开发”、“测试”、“预发布”、“生产”四个环境它们共享大部分基础配置如项目名、区域只有少数变量不同如数据库地址、日志级别。为每个环境复制一份完整的配置是低效且容易出错的。nv-context的高级特性之一就是支持上下文的继承。你可以定义一个“基础”上下文然后让其他上下文继承它并只覆盖或添加差异部分。# base.yaml name: alpha-base env: PROJECT_NAME: “alpha“ AWS_REGION: “us-east-1“ LOG_FORMAT: “json“ shell: aliases: get-logs: “./scripts/fetch-logs.sh“# alpha-prod.yaml name: alpha-prod extends: alpha-base # 关键继承自 alpha-base env: APP_ENV: “production“ DATABASE_URL: “postgresql://prod-host/prod_db“ LOG_LEVEL: “error“ # 覆盖或新增 hooks: on_activate: | echo “⚠️ 警告你已进入生产环境“ # 可以定义自己的钩子基础钩子也可能被执行取决于工具实现当你激活alpha-prod时它会自动拥有alpha-base中定义的所有环境变量和别名同时使用自己的DATABASE_URL和LOG_LEVEL。这大大简化了配置管理提升了一致性。更进一步有些工具可能支持组合或叫“混合”即一个上下文可以“使用”多个其他上下文的配置类似于 Mixin。这在管理跨项目的通用工具配置时非常有用比如一个“监控工具”上下文和一个“数据库客户端”上下文可以被多个项目上下文组合使用。4.2 钩子脚本的威力自动化一切钩子脚本hooks是nv-context的灵魂所在它将一个静态的配置管理器变成了一个动态的环境自动化工具。on_activate和on_deactivate钩子可以执行任何 Shell 命令。实战场景1依赖服务健康检查在激活一个需要本地数据库的开发环境时自动检查数据库是否运行如果没有则尝试启动。hooks: on_activate: | if ! pg_isready -q; then echo “数据库未运行尝试使用 Docker 启动...“ docker-compose up -d db sleep 5 # 再次检查 if ! pg_isready -q; then echo “❌ 数据库启动失败请手动检查。“ exit 1 # 退出码非零可能导致上下文激活失败取决于工具实现 fi fi echo “✅ 数据库连接正常。“实战场景2动态凭证获取安全最佳实践是不存储长期有效的密钥。钩子脚本可以与云服务商的 CLI 或密钥管理服务交互获取临时凭证。hooks: on_activate: | # 假设使用 AWS CLI 获取临时会话令牌 CREDS$(aws sts assume-role --role-arn arn:aws:iam::123456789012:role/MyDevRole --role-session-name nv-context-session) export AWS_ACCESS_KEY_ID$(echo $CREDS | jq -r .Credentials.AccessKeyId) export AWS_SECRET_ACCESS_KEY$(echo $CREDS | jq -r .Credentials.SecretAccessKey) export AWS_SESSION_TOKEN$(echo $CREDS | jq -r .Credentials.SessionToken) echo “AWS 临时凭证已设置有效期1小时。“ on_deactivate: | # 停用时清除凭证避免泄漏 unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN echo “AWS 凭证已清除。“实战场景3上下文感知的终端提示符为了让当前上下文一目了然可以在钩子中修改 Shell 的PS1变量。hooks: on_activate: | OLD_PS1“$PS1“ export PS1“(alpha-dev) $PS1“ export NV_CONTEXT_OLD_PS1“$OLD_PS1“ # 保存原值 on_deactivate: | if [ -n “$NV_CONTEXT_OLD_PS1“ ]; then export PS1“$NV_CONTEXT_OLD_PS1“ unset NV_CONTEXT_OLD_PS1 fi这样当激活alpha-dev后你的命令行提示符开头就会显示(alpha-dev)时刻提醒你所在的环境。4.3 与现有开发工具链的集成nv-context的价值在于融入现有工作流而不是取代它们。与 Docker / Docker Compose 集成上下文可以定义项目所需的 Docker Compose 文件路径和常用命令。env: COMPOSE_FILE: “./docker-compose.dev.yml“ shell: aliases: dc-up: “docker-compose up -d“ dc-logs: “docker-compose logs -f“ dc-down: “docker-compose down“ hooks: on_activate: “docker-compose up -d“ # 进入上下文自动启动服务 on_deactivate: “docker-compose stop“ # 离开时停止服务可选根据习惯与 Kubernetes 集成这是杀手级应用。一个上下文可以对应一个kubectl的 context 和 namespace。env: KUBECONFIG: “$HOME/.kube/config-mycluster“ # 指定 kubeconfig 文件 shell: aliases: k: “kubectl --contextmy-cluster --namespacewebapp-dev“ # 设置默认上下文和命名空间 pods: “k get pods“ deploy: “k apply -f deployment.yaml“ hooks: on_activate: | kubectl config use-context my-cluster /dev/null # 自动切换 kubectl context echo “Kubernetes 上下文已切换到 my-cluster。“这样切换上下文的同时也切换了整个 Kubernetes 的操作目标完美避免了误操作到生产集群的风险。与 IDE / 编辑器集成虽然nv-context是命令行工具但你可以通过钩子脚本在激活上下文时设置环境变量这些变量可以被许多 IDE 的终端或插件读取。例如为特定项目设置PYTHONPATH或JAVA_HOME。与版本控制系统集成将非敏感的上下文定义文件.yaml纳入项目版本控制如 Git而将包含密钥的文件通过.gitignore排除或者使用nv-context export --no-secrets导出共享版本。团队新成员git clone后只需nv-context import即可获得标准化的开发环境配置。5. 安全、维护与团队协作最佳实践5.1 敏感信息管理与安全策略这是使用任何配置管理工具都必须严肃对待的头等大事。明文密码、API密钥、数据库连接字符串绝不能直接硬编码在上下文文件中。使用环境变量引用这是最基本的原则。在上下文文件中只引用变量名其真实值从更安全的地方获取。# 错误做法绝对禁止 # DATABASE_PASSWORD: “SuperSecret123!“ # 正确做法 # 假设密码已通过系统密钥环或 CI/CD 变量设置 # 上下文文件中只声明需要此变量 env: DB_PASS: “${SECRET_DB_PASS}“ # 期望从父Shell环境继承在激活上下文之前通过安全的方式设置SECRET_DB_PASS。利用钩子脚本从外部获取如前所述在on_activate钩子中调用安全的 CLI 工具如aws secretsmanager get-secret-value、gcloud secrets versions access、vault read来动态获取密钥并设置为临时环境变量。停用时务必在on_deactivate中清理。支持加密的上下文文件一些高级的上下文管理工具可能内置了加密功能允许你使用一个主密码或 GPG 密钥对包含敏感信息的上下文文件进行加密存储。只有在激活时工具会提示你输入密码解密。确保你了解并正确使用这些安全特性。文件权限确保上下文配置文件尤其是可能包含引用的敏感信息的文件的权限设置为仅当前用户可读 (chmod 600 ~/.config/nv-context/contexts/*.yaml)。审计与清理定期使用nv-context show检查各上下文定义清理过期或不再使用的密钥引用。在共享或导出上下文时务必使用--redact或类似选项移除敏感字段。5.2 上下文文件的版本控制与团队共享为了确保团队环境的一致性将上下文定义纳入版本控制是个好主意但必须遵循安全规范。推荐的工作流在项目根目录创建一个environments/或.nv-context/文件夹。在其中创建模板文件例如development.yaml.template或production.yaml.template。这些文件包含所有非敏感的配置项而敏感值用占位符如{{DATABASE_PASSWORD}}或明确的注释如# 请从1Password vault ‘project-db-creds‘ 获取代替。# environments/development.yaml.template name: “{{PROJECT_NAME}}-dev“ env: APP_ENV: “development“ DATABASE_HOST: “localhost“ DATABASE_NAME: “{{PROJECT_NAME}}_dev“ DATABASE_USER: “{{DATABASE_USER}}“ # 占位符 DATABASE_PASSWORD: ““ # 留空通过其他方式注入将模板文件提交到 Git。在项目的README.md或CONTRIBUTING.md中详细说明如何根据模板创建个人本地上下文文件以及如何安全地获取和设置敏感信息例如指向团队内部的安全密码管理文档。每个团队成员根据模板创建自己的本地上下文文件如development.yaml并将其添加到.gitignore中确保不会误提交。使用nv-context import --file environments/development.yaml导入配置。对于敏感信息团队应统一使用一个密码管理器如 1Password、Bitwarden Teams、HashiCorp Vault并约定一套通过 CLI 或 API 获取密钥的脚本。这个脚本可以被所有上下文的on_activate钩子调用或者作为一个独立的、安全的初始化步骤。5.3 性能考量与日常维护技巧虽然nv-context很轻量但在一些边缘情况下仍需注意性能。钩子脚本的复杂度on_activate钩子如果执行耗时操作如从网络拉取数据、启动大量服务会拖慢上下文切换速度。尽量让钩子脚本保持轻量或者将耗时操作改为异步后台启动并给出明确提示。上下文数量定义数百个上下文可能会导致nv-context list命令变慢也增加管理负担。定期清理不再使用的上下文 (nv-context delete old-context)。Shell 启动速度如果你将nv-context的初始化集成到 Shell 的启动脚本中例如在.zshrc中设置默认上下文要确保它不会明显拖慢新开终端的速度。如果工具初始化较慢可以考虑延迟加载或按需加载。日常维护技巧命名规范为上下文制定清晰的命名规范例如project-environment[-role]如billing-api-prod、frontend-dev、>问题现象可能原因排查命令/步骤命令nv-context未找到未安装或 PATH 未配置which nv-context,echo $PATH, 检查安装步骤激活上下文后提示符无变化未修改 PS1 或修改被覆盖检查上下文钩子脚本检查 Shell 配置文件中 PS1 的设置顺序别名(alias)不生效别名定义有误或 Shell 不支持alias命令查看所有别名确认 Shell 类型bash/zsh切换到上下文后命令报错“未找到”PATH 被错误覆盖或未包含所需路径echo $PATH查看路径检查上下文中的 PATH 设置上下文列表为空上下文文件存储路径错误或权限问题ls ~/.config/nv-context/contexts/检查文件权限继承的变量值不对父上下文文件有语法错误或变量被覆盖nv-context show parent-context检查 YAML 缩进钩子脚本无输出脚本执行失败或输出被丢弃在钩子脚本中加set -x和echo “start“ 2调试7. 个人使用体会与进阶技巧经过一段时间的深度使用nv-context这类工具真正改变的是我的工作习惯和思维模式。我不再需要记住“项目A的数据库端口是5433项目B是5434”也不再需要为每个项目写一个复杂的启动脚本。一切都被抽象和封装在了命名的上下文里。几个让我效率倍增的进阶技巧基于上下文的项目快速启动我为每个主要的开发项目创建了一个名为project-start的上下文。它的on_activate钩子会做一系列事情启动 Docker Compose 服务、等待数据库就绪、运行数据库迁移、启动后端开发服务器、并打开前端代码的 IDE。现在开始一天的工作我只需要打开终端输入nv-context use project-x-start然后就可以直接去泡杯咖啡回来时整个开发栈已经就绪。上下文作为“工作模式”切换器除了项目我还创建了“写作模式”、“会议模式”这样的上下文。“写作模式”会关闭所有消息通知、打开专注音乐播放列表、并设置特定的编辑器主题。“会议模式”则会静音麦克风、打开会议软件、并显示日历。这让我能更快速地在不同的心智状态间切换。与 Tmux 或 Screen 会话绑定我使用 Tmux 管理多个终端会话。我创建了一个 Tmux 脚本为每个重要的上下文自动创建一个命名窗口 (tmux new-window -n context-name)并在该窗口中自动激活对应的nv-context。这样我的 Tmux 会话本身就成为了一个可视化的上下文仪表盘。自动化上下文发现对于拥有大量微服务的仓库我写了一个小脚本扫描项目目录结构自动为每个服务生成开发、测试上下文的模板。这极大地减少了初始化配置的工作量。最后一点忠告工具的目的是服务于人而不是增加负担。刚开始使用nv-context时不要试图一下子把所有环境都迁移过来。从一个最让你头疼的、切换最频繁的场景开始比如那个数据库配置特别复杂的项目。先为它创建一个上下文体验流畅切换带来的快感。当你尝到甜头后自然会逐步将其他场景迁移过来。记住最好的工作流是那个你愿意持续使用、并且几乎感觉不到它存在的流程。nv-context的价值就在于它最终能让你忘记“环境配置”这件事从而更专注于创造本身。