跳转至

环境管理器

基本概念

我对 环境管理器 的定义是提供了多种环境,或能对环境进行操作的工具。

分类

操作环境

  • Conda 可用于配置多种语言的运行环境,可以激活、修改、创建、删除环境
  • Mise 可用于管理开发环境,有切换工具链版本、设置环境变量、运行任务等功能

提供环境

  • MSYS 提供了符合 POSIX 标准的编程环境
  • WSL 提供了原生而非移植的 Linux 环境
  • Docker 容器把应用程序及其依赖打包在一起,是一种非常现代的环境解决方案

选择

环境管理是一个很麻烦的事情,因此有了很多很多的工具。而工具多了又会出现新的问题:该选择哪个工具呢?我目前遵循着这样的实践

  • 科学计算 使用 Conda 管理环境。科学计算项目是 混合栈 的典型。一个 Python 的库底层通常要用 C++ 加速,并且可能依赖特定 CUDA 版本的运行时。早期 Conda 对于这种多语言混合环境是处理的最好的。尽管目前 pip 等工具已经有所改善,但使用 Conda 成为了这个领域的惯性。
  • 应用开发 使用 Mise 管理环境。实际的应用项目往往 多运行时并列依赖相对独立,这非常契合 Mise 的理念。Mise 有一个清单文件用来说明项目需要的运行时版本,并且可以根据这个文件自动修改环境以避免出错。
  • 系统编程 使用 MSYS/WSL 管理环境。由于 C/C++ 历史包袱太严重,系统包管理器在某些时候充当了语言包管理器,因此像 MSYS/WSL 这样的环境在某些时候是很方便的。而对于 Rust/Zig 等更现代的语言,由于有更合理的工具链,因此通常不需要这么麻烦。
  • 特殊情况 对于一些特殊情况,比如没有好的工具可选,或者该语言生态高度一体化(比如 .NET),我通常会使用官方的工具。

目前还没有提到以 Docker 为代表的容器工具。上述所有环境配置都可以只使用容器完成,不过前提是有人提供了能满足你所有需要的容器镜像。毕竟 复杂度不会消失,只能转移,如果没有人帮你解决环境配置的问题,那么你仍要自己面对这个恐怖的东西。

因此,尽管容器大概率就是环境管理的终极武器,但我还是会学习并使用各种环境管理工具。