做开发的都有一个痛点,那就是配环境太痛苦了。
假设现在有五六种语言,每种语言有各自的包管理器,编译器版本控制工具,格式化工具,lint 工具。还有数据库。
以 rust 为例,比如 rustup cargo rustc rustfmt clippy
某些可能还有更刺激的,比如 dart + flutter,react + next
js:喜欢我更混乱的生态吗:P
您现在需要让大家来一起帮你开发。就需要把一整套开发环境全都搬到所有人的电脑上。大家电脑可能是 Windows Mac Linux。
其中
Windows 可能是不同的版本
Mac 可能有不同大版本
Linux 可能是各种发行版的版本号的排列组合
what a hell :P
学术界就有人在想,怎么做呢?
docker 用于部署没问题。
但是开发用 docker 还是太难受了。
主角:nix 登场。
nix 出身
nix 出自 Eelco Dolstra 的博士论文
https://edolstra.github.io/pubs/phd-thesis.pdf
Nix 既是一种语言,也是一种包管理(nixpkgs),更是一种系统(nixOS)
题外话,NixOS 也是 ICFP 上的论文
NixOS: A Purely Functional Linux Distribution ,ICFP 是 FP 的顶刊
这里我们用他的语言 + 包管理来考虑系统怎么处理
目前支持 nix 的 afaik 只有 idx.dev ,甚至还不是把 nix 当主力宣传。
假设我们需要开发一个 flutter + dart + rust + shell + python + js + ts + c + cpp + java 的程序
(你问哪里有这种?apache/opendal 这种多语言绑定的就是)
新手估计光配环境就需要几小时了。
但是在 nix 上:
再 rebuild 一下环境,结束了。
对应的插件安装一下也结束了。
一份写好的 nix 可以直接存在项目里,合作者在 clone 项目时,容器读取配置就自动构建了项目对应的容器。连 env 都可以移植。
而且这一坨东西都不会把屎拉在你自己的电脑上。个人电脑依然是 free of shit :P
某些项目甚至需要 PostgreSQL / Redis,在系统安装又是灾难,但是 nix services.redis.enable = true
一行就全解决了
但是不可变对于个人电脑却是很伤的。。个人用户非常喜欢随便改电脑配置。或者顺手 sudo make install 一个包。这在 nix 上行不通的,因为 nix 用 hash 做路径。
比如我至今没解决 nix 上的 wine 怎么配置的问题。。。
所以我日常个人电脑 Arch,容器开发 nix,服务器看心情用 Debian(free of Ubuntu snap)