利用 ASDF 一键管理各种软件开发运行环境

前言

  之前介绍了高性能集群中常用的运行环境和软件版本管理工具 Modules,今天打算介绍一款适合个人或团队开发使用的通用运行环境版本管理神器 ASDF。与高性能计算任务不同,个人或团队开发项目一般来说都是使用独立的设备或环境,然后通过代码版本跟踪 git 等来进行异步协作。所以说,在每个人的单个或多个设备上都安装配置 Modules 显得有点不太现实和高效。但是项目开发所需的代码环境确实有的时候可能比较复杂,比如说同时需要 Ruby、NodeJS、Java、Python 四种环境,而且可能对于每种环境还有版本的限制。这样一来,光配置这一堆环境就要花上大半天时间了。

ASDF 简介

  ASDF 提供了全平台通用的环境配置方案,使用单个命令行工具和交互界面就可以管理超复杂的运行环境。以往针对不同运行环境,需要使用不同的配置文件来进行版本的声明。对于 ASDF,只需要一个可共享的 .tool-versions 配置文件即可。ASDF 涵盖了包括 Ruby、NodeJS、Java、PHP、.Net 在内的几百种运行环境,具体可以查看 ASDF 插件列表 了解更多。

  另外,ASDF 完全支持包括 Bash、Zsh、Fish 和 Elvish 在内的常用 shell 类型,并提供补全功能。在类似 Github Actions 等的 CI/CD 工作流中,也可以轻松使用 ASDF。值得一提的是,笔者翻译了 ASDF 文档的中文版本并被官方采纳,现在 ASDF 官网支持英语、巴西语和中文三种语言。

为何不选其他方案

Docker

  很显然,如果大家的设备上都有 Docker 环境且 CPU 架构相同的话,Docker 无疑是最省心的方案。Docker 镜像的确可以轻松涵盖所有开发环境和实际运行环境(Apache 等 HTTP 服务器、数据库以及其他)。相比笨重的 VMware 或 Virtualbox 虚拟机镜像而言,Docker 镜像也更加小巧、便捷。而且团队可以通过在内部搭建自己的 Docker 镜像仓库,来分享这些镜像给所有参与项目的开发者。唯一可能会有问题的是,设备 CPU 架构和操作系统的多样性可能会给实际操作带来了不小的问题。实际上可能会有 Windows 系统、Linux 系统、MacOS 系统以及 Intel 架构、AMD 架构、ARM 架构(如 M1、M2 等)。可行的解决方法是,尽可能地构建更多架构的镜像。

Anaconda

  Anaconda 现在可能已经完全超出了一个 Python 环境管理工具,有的时候也可以当成通用软件或环境管理器来用。但是毕竟还是以科学计算为主要目的,如果项目仅仅是 Python、R 语言可能还是比较合适的,对于实际编程所需的其他运行环境来说可能还是支持不够的。

小提示

  据笔者所知,在 conda-forge 频道里的确有 PHP 等编程语言的支持。除此之外,也有一些热心开发者在个人频道提供了 java-jdk、golang 等编程环境支持。

云开发

  云开发主要是指基于云基础设施的在线代码开发环境,主要的代表有:

  • Cloud9:笔者最早接触过的云开发,目前已被 AWS 收购,更名为 AWS Cloud9。
  • Codespaces:由 Azure 提供云服务、Github 负责运营的一站式云开发环境。
  • Gitpod:基于 VS Code 研发的优秀云开发环境,早期以“便捷、快速”著称,较先于 Codespaces 出现。
  • Cloud Studio:由腾讯云提供云服务、基于 VS Code 的国产云开发环境,能够很好地支持个人开发、招聘笔试、课堂教学、应用快捷部署等各种场景。
  • CodeArts IDE Online:由华为云提供云服务、基于 VS Code 的国产云开发环境。除了一般云开发所具备的特点,还支持华为鲲鹏原生环境,能够很好地满足跨架构应用开发的需求。
  • DevStudio:由阿里云提供云服务、基于 VS Code 的国产云开发环境。支持应用开发全流程管理,与阿里云各项基础服务紧密结合,适合大规模团队使用。

除了以上列举的云开发之外,也有一些比较传统的小型云开发实践,比如说知名的 JSFiddleCodePenReplit 等。虽然说这些云开发主要是适合较小代码库,但在实际学习过程中用处也是很大的。

  云开发不仅兼顾了传统开发过程中的协同与流程,又将资源与环境整合在云里面,自然而然是最好的解决方案。随着 VS Code 在开发者之间的流行和云服务提供商的努力,基于 VS Code 的云开发环境层出不穷。即使云开发环境本身免费,云也还是要按量按时计费的。对于还没有足够支持上云的团队或个人来说,ASDF 依然是个不错的选择。

实践

环境需求

  • Linux/Unix 环境(Linux、MacOS、Windows WSL)
  • git
  • bash 等(此处以 zsh 为例)

环境配置

# 下载源码到 ~/.asdf 目录
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.11.3

# 在 ~/.zshrc 文件中加入内容
tee -a ~/.zshrc << EOF
. "$HOME/.asdf/asdf.sh"
EOF

# 激活配置
source ~/.zshrc

# 验证
╰─$ asdf version
v0.11.3-0adc6c1

安装插件

  由于 ASDF 支持插件较多,这里以 Python 环境为例介绍 ASDF 安装插件。

# 添加插件
asdf plugin add python

# 查看已安装插件
╰─$ asdf plugin list
python

# 查看最新 Python 版本
╰─$ asdf latest python
3.11.2

# ASDF 安装 Python 3.11.2 (latest)
╰─$ asdf install python latest
python-build 3.11.2 /home/ubuntu/.asdf/installs/python/3.11.2
Downloading Python-3.11.2.tar.xz...
-> https://www.python.org/ftp/python/3.11.2/Python-3.11.2.tar.xz
Installing Python-3.11.2...
Installed Python-3.11.2 to /home/ubuntu/.asdf/installs/python/3.11.2

# 查看已安装 Python 版本列表
╰─$ asdf list
python
  3.11.2

使用

  ASDF 提供全局版本(Global)和本地版本(Local)两种方式定义运行环境版本。全局版本是系统级别的,类似于 PATH 变量中定义的;本地版本则是为了某个代码库或者部分代码准备的,通常在目录中的 .tool-versions 文件里定义。为了区分全局和本地的效果差别,这里再安装一个指定 Python 版本。

# 查询 Python 插件支持的所有版本
╰─$ asdf list all python
2.1.3
2.2.3
......
stackless-3.7.5

# 安装 Python 3.9.0
╰─$ asdf install python 3.9.0
python-build 3.9.0 /home/zhonger/.asdf/installs/python/3.9.0
Downloading Python-3.9.0.tar.xz...
-> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Installing Python-3.9.0...
patching file Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst
patching file configure
patching file configure.ac
Installed Python-3.9.0 to /home/zhonger/.asdf/installs/python/3.9.0

# 查看已安装 Python 版本列表
╰─$ asdf list
python
  3.11.2
  3.9.0

# 查看当前系统 Python 及 Python3 版本
╰─$ python -V
No python executable found for python system

╰─$ python3 -V
Python 3.10.6

# 更改全局版本为 3.11.2 并查看
╰─$ asdf list
python
 *3.11.2
  3.9.0

╰─$ python -V
Python 3.11.2

# 创建子目录指定本地版本并查看
mkdir py && cd py
asdf local python 3.9.0

╰─$ python -V
Python 3.9.0

# 返回父目录查看 Python 版本
╰─$ cd .. && python -V
Python 3.11.2

# 查看当前系统 Python3 版本
╰─$ python3 -V
Python 3.10.6
小提示

  这里有一点比较有趣的是:由于 ASDF 接管的 python 命令而非 python3 命令,所以 python3 命令输出的版本依然还是系统安装版本。

其他相关

  如果想要恢复到系统指定版本,可以很容易使用 asdf global python system 命令。当然,对于本地版本,可以使用 asdf local python system 来实现。除此之外,还有一些常规操作如下。

# 查看 Python 指定版本安装位置
╰─$ asdf where python 3.11.2
/home/zhonger/.asdf/installs/python/3.11.2

# 查看命令所在位置
╰─$ asdf which python
/home/zhonger/.asdf/installs/python/3.11.2/bin/python

# 查看当前 ASDF 管理的运行环境
╰─$ asdf current
python          3.11.2          /home/ubuntu/.tool-versions

# 查看全局和本地版本配置文件
╰─$ cat ~/.tool-versions
python 3.11.2

╰─$ cat ~/py/.tool-versions
python 3.9.0

参考资料

版权声明: 如无特别声明,本文版权归 仲儿的自留地 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 通用运行环境版本管理神器 ASDF 》

本文链接:https://lisz.me/tech/webmaster/asdf.html

本文最后一次更新为 天前,文章中的某些内容可能已过时!