这一个文件搞定了我的开发环境 (Devbox)

BBetter Stack
컴퓨터/소프트웨어창업/스타트업AI/미래기술

Transcript

00:00:00你的自述文件(README)在骗你,上面写着安装只需五分钟,结果 Node 版本不对,Python 版本也不对
00:00:07Postgres 缺失,Docker 跑得慢得要死,还没开始写代码就已经在调试环境了
00:00:13你的开发环境不该写在 README 里,而应该存在 Git 中,这就是 Devbox 的作用
00:00:20一个 devbox.json 文件,一条 devbox shell 命令,所有开发者拥有相同的环境,无需全局安装
00:00:28而且完全不需要 Nix 知识,让我演示一下
00:00:30起初,Devbox 看起来简单得过分。你创建一个 devbox.json,列出项目所需的工具
00:00:42无论是 Node、Go、Python、Postgres,还是你的技术栈实际需要的任何东西,提交这个文件
00:00:50然后别人只需要运行 devbox shell,他们就能得到和你一模一样的环境,相同的版本、工具和脚本,无需全局
00:00:58安装,也不用去管那八个必须先安装的东西,或是多年前遗留的 Homebrew 状态,你的安装
00:01:03配置不再只存在于某人的记忆里,而是存在于你的仓库中。这听起来可能微不足道,但如果你
00:01:09曾经因为本地环境崩溃而浪费了半天时间,你就知道这绝非小事。如果你喜欢
00:01:16这些能优化工作流的编程工具,请务必订阅,我们会持续更新视频
00:01:20现在让我们从头开始,创建一个空项目,新建一个文件夹
00:01:25我们命名为 devbox-demo,进入该文件夹,安装好 Devbox 后只需运行
00:01:31devbox init,Devbox 会创建一个名为 devbox.json 的文件。现在它基本上是空的,只是
00:01:39Devbox 给我们的样板代码。现在让我们添加项目实际需要的工具,要添加工具,我们可以
00:01:45运行 devbox add,我准备安装 Go、Node.js 和 Python。注意这里
00:01:52很重要的一点是:我没有进行全局安装,没有修改我的系统 Node,也没有触碰我的系统
00:02:00Python。这些工具只属于这个项目。现在当我运行 devbox shell,我就进入了一个纯净的项目
00:02:09环境。进入环境后,你可以检查版本,比如 go version,node
00:02:14version,python version,我可以检查一切以确保运行正常,这就是最大的回报
00:02:19项目需要特定工具,Devbox 就给我提供了这些工具。现在让我们添加一个脚本,在 devbox
00:02:27json 中,我们可以定义一个 test,我只是简单 echo 一下正在运行的测试,并获取 node
00:02:34和 go 的版本。当你运行 devbox run test,同样的命令对任何使用此仓库的人都有效
00:02:42相同的脚本、相同的工具、相同的环境。现在看我退出,只需运行 exit
00:02:48你就会离开那个环境,我又回到了普通的机器环境。这很简单,对吧?
00:02:53Devbox 到底在做什么呢?实际上,Devbox 底层使用的是 Nix。Nix 很棒,因为它
00:03:00是为可复现性而生的。它不会像某些东西那样默认安装最新的版本
00:03:06而是可以锁定项目实际需要的精确工具。这是好的一面,难点在于
00:03:12Nix 感觉像一个全新的世界。有很多概念很棒,但当你只想获得正确的 node 版本时
00:03:18它并不太友好。Devbox 为我们展示了另一种可能
00:03:23它说,如果我们保持这种可复现性,但让工作流感觉正常会怎样?所以与其
00:03:29编写 Nix 表达式,你可以使用像 devbox add、search、shell、run、services 等命令。所有
00:03:37这些命令简单得多,你的项目会得到两个重要文件:一个 json 文件和一个
00:03:44锁文件。把 devbox.json 看作环境的需求,把 devbox.lock 看作锁定
00:03:52你所安装确切版本的凭证。提交这两个文件,现在你的环境不再只是 README 中的一段文字
00:03:58而是项目本身的一部分。Devbox 支持 macOS、Linux 和 WSL,可以与 VS Code 集成
00:04:06可以定义脚本,可以管理数据库等服务,当你需要时,它可以导出到
00:04:12Docker、Dev Containers 和 CI 工作流中。这个工具的价值不仅仅在于炫酷,它简单到了极致。价值
00:04:19在于时间。第一个问题是 README,README 可能会写任何东西,它
00:04:26可能说安装 Node 18,但应用已经更新,实际上需要 Node 20。第二个问题
00:04:32它能真正解决的是入职流程。这是你工作的第一天,入门应该很简单
00:04:37但我们都知道事实并非如此。你不应该需要询问需要哪个 node 版本,不应该
00:04:43需要去 ping 别人问我们要用哪个 python 版本,我真的需要在本地安装 postgres 吗,为什么这东西
00:04:48只在那边的小提姆电脑上能跑?他们只需要克隆仓库,进入 shell
00:04:52然后运行项目即可。如果出了问题,至少大家是在相同的环境下排查。问题在于
00:04:58全局污染。尝试安装工具不应该搞坏你的电脑。你需要为这个仓库安装 go 1.22,你加上它,然后
00:05:06另一个地方要 node 20,也没问题。工具随项目走,你的
00:05:13系统保持整洁。有了 Devbox,你的环境定义可以在本地开发
00:05:18和自动化流程之间共享。这能解决所有 CI 问题吗?不能,但它消除了很大一类愚蠢的
00:05:26问题,而愚蠢的问题往往最伤人。它们很简单,但我们却总是在犯
00:05:32最后,关于 Docker。本地使用繁重的 Docker 工作流,尤其是如果
00:05:40你需要容器时,Docker 依然很棒。但很多团队在本地使用 Docker 是因为他们没有更好的
00:05:46方式来管理工具。现在的优势在于工作流极其简单:devbox add、shell、run,你
00:05:52不需要学习太多东西。环境变成了项目实实在在的一部分,即仓库里的
00:05:57一个真实文件。当每个人都使用相同的版本和脚本时,调试就变得更容易。这很棒,
00:06:03超级简单。唯一可能让你烦恼的是,第一次 Nix 下载可能需要一点时间,
00:06:09没关系,第一次而已。json 很简单,但我们也知道,如果添加太多东西,它会变得难看
00:06:15对于简单的脚本来说这没问题,但对于复杂的配置逻辑,不要把巨大的 shell 命令塞进 json
00:06:22只需把逻辑写在 .sh 文件里,然后从 devbox 中调用。最后,Devbox 不是一个完整的云 IDE
00:06:30如果你需要基于浏览器的编码环境、即时预览链接,你可能依然需要像 Codespaces 这样的工具
00:06:36Devbox 最擅长的是本地和 CI 的可复现性。Devbox 不会解决所有的开发
00:06:42问题,但它能解决最让我们头疼的那些,即让项目成功跑起来
00:06:46所以,如果你的项目涉及多种语言或不止一个 CLI 工具,尝试一下绝对值得
00:06:51如果你喜欢像这样的编程工具,务必订阅 Better Stack 频道,我们
00:06:56下期视频再见。

Key Takeaway

通过在 Git 仓库中通过 devbox.json 文件锁定项目所需的精确工具版本,Devbox 消除了 README 配置带来的不一致性,实现了跨开发环境的可复现性。

Highlights

  • Devbox 使用 devbox.json 文件和 devbox.lock 文件,在 Git 仓库中直接定义项目所需的所有环境配置。

  • devbox add 命令在不修改全局系统配置的情况下,为特定项目安装工具,实现了环境隔离。

  • 所有团队成员只需运行 devbox shell,即可获得版本、工具和脚本完全一致的开发环境。

  • Devbox 底层基于 Nix,能够锁定确切的工具版本,确保环境的可复现性。

  • 该工具支持 macOS、Linux、WSL,并能导出配置供 Docker、Dev Containers 及 CI 流水线使用。

Timeline

开发环境不一致的问题

  • README 文件中的安装说明经常与实际项目环境脱节。
  • 不同开发者之间的全局安装导致版本冲突与调试困难。
  • 将环境配置纳入 Git 仓库可确保团队环境一致性。

README 中的安装指南往往过时或存在缺失,导致开发者在开始编码前需耗费大量时间调试环境。Devbox 通过将开发环境定义直接写入 Git 仓库,确保所有协作者使用相同的工具版本和配置,避免了因全局安装导致的混乱。

使用 Devbox 管理项目依赖

  • devbox init 创建环境配置文件,devbox add 安装项目特定工具。
  • 环境通过 devbox shell 命令激活,工具不影响系统全局配置。
  • 脚本可定义在 devbox.json 中,确保跨环境执行的一致性。

通过 devbox init 命令初始化后,开发者可以使用 devbox add 添加 Node.js、Go、Python 等工具,这些工具仅在项目目录下生效,不会污染宿主机系统。进入环境后,项目定义的脚本可通过 devbox run 命令统一执行,保证了无论是测试还是开发,流程完全一致。

Devbox 的工作机制与优势

  • 底层采用 Nix 技术实现环境的高度可复现性。
  • 通过简单的 CLI 命令替代复杂的 Nix 表达式编写。
  • 环境配置可导出至 Docker 和 CI 流水线中。

Devbox 封装了 Nix 的强大功能,通过 devbox.json 定义需求,devbox.lock 锁定具体版本,简化了开发工作流。它解决了由于版本碎片化导致的环境冲突,并能与现有工作流如 Docker 或 CI 无缝集成,从而大幅提升了团队协作和入职流程的效率。

Community Posts

No posts yet. Be the first to write about this video!

Write about this video