换台电脑就跑不起来,环境怎么统一
今年上半年我换过一次开发机。新机器装完编辑器、拉下代码、敲下启动命令,报了个依赖找不到的错。查了两个小时才想起来,那个依赖是我在两年前手动装到系统目录里的,从来没写进任何一份说明。本地开发环境怎么保持统一,问题就从这里开始。
直接给答案:环境统一不是靠同步系统,是靠让「从零到跑起来」这件事有一条可执行的路径。下面是我现在用的五步。
一、前提:先接受环境不会完全一致
先说清楚适用范围。你的目标是「换机器能跑起来」,不是「两台机器的每个字节都一样」。
追求后者会掉进一个坑:把所有东西都锁死,结果每次升级都要花很大力气同步。系统版本、内核、驱动这些底层差异,我现在的做法是允许不同,只要求上面那一层一致。
二、第一步:把所有依赖写进一份清单
第一步,把从零到跑起来需要的所有东西列出来。
不是列「安装某语言」,而是列具体的版本和来源。我当时漏掉的就是这一步——清单里写了主语言,没写那个手动装的依赖。
具体动作:拿一台从来没配过的机器,或者在干净的环境里,照着清单走一遍,走不通的地方就是清单缺的地方。
三、第二步:把命令写成可重复执行的脚本
第二步,把清单里的命令变成一个能直接跑的东西。
零散的说明文档迟早会过期,能执行的脚本不会——它跑不通就是跑不通,立刻会告诉你。我现在的项目里有一个初始化脚本,负责装依赖、生成默认配置、准备数据目录。
具体动作:把启动命令收敛成一条,不要让人记住三四个前置操作。
四、第三步:配置分成两份,一份入库一份不入库
第三步,处理配置。
属于环境相关的值走环境变量,属于业务规则的写进文件。这个分法我在Go 配置放文件还是环境变量,我踩坑后定了里写得比较细。
关键是:入库的那份是模板,不入库的那份是本地实际值,两边的字段名必须完全一致。字段名不一致,就会出现「本地能跑线上不能跑」。
五、第四步:数据目录和代码分开
第四步,别把运行产生的数据放在代码目录里。
我以前把数据库文件、日志、生成的产物都放在项目目录下,结果是每次清理目录都提心吊胆,而且这些东西还会被误提交。
具体动作:所有会变的数据统一指到一个不在仓库里的目录,用配置告诉程序它在哪。
六、第五步:验证方式是「删掉重来」
第五步,也是唯一有效的验证方式:把本地环境整个删掉,照着流程重做一遍。
跑得通,说明这条路径是真的。跑不通,你会在自己还有耐心的时候发现问题,而不是在急着交付的时候。
我现在的做法是每季度做一次这样的重建。听起来麻烦,但比重装机器那天手忙脚乱要轻松得多。
容易卡住的三个点
第一个是隐式依赖:某个命令能用,是因为你以前手动装过东西,而不是因为脚本装了。这类问题只有干净环境才暴露得出来。
第二个是版本漂移:主语言或者关键库的小版本差异导致的怪异报错。清单里要写到具体版本。
第三个是平台差异:路径分隔符、大小写敏感、行尾符。写脚本的时候统一处理一次,别靠每次手动改。
这三点里,第一个最难查,因为报错信息通常指向别的地方。做到这一步,本地开发环境怎么统一这件事就变成了一个可以重复执行的流程,而不是一门靠记忆的手艺。
常见问题
Q:本地开发环境怎么保持统一,最少要做哪几件事?
A:写一份带具体版本的依赖清单、把命令写成脚本、配置分成入库模板和不入库实际值、验证方式是从零重建一遍。四件事做完基本就稳了。
Q:要不要用容器来统一环境?
A:看你的项目复杂度。本地跑一两个进程、依赖不多的项目,脚本加清单就够了;依赖多、需要多人复现时再考虑容器,它本身也有维护成本。
Q:换机器时最容易漏的是什么?
A:手动装过、但没写进清单的依赖。排查办法是在干净环境里跑一遍初始化流程,报错的地方就是清单缺的地方。
相关阅读
本文作者西米,37 岁程序员,一个人加五个 AI 员工在跑一家公司。踩过的坑和真实账本都写在公众号「西米分享」。
完整代码、踩坑清单与最新进展,都在公众号。
📱 关注公众号「西米分享」