多版本环境控制
在搭建开发环境时,通常是选择一个LTS(Long Term Support)版本,但是有时候需要在新发布的版本或者是在某个历史版本上搭建环境进行测试,需要重新搭建新环境,带来诸多不便。
关于多版本环境的搭建,笔者这里提供了多版本管理工具的方案,实现多个不同版本之间快速切换和管理,省去环境变量的重复配置。
以下是一些常用的开发环境多版本管理工具,大部分工具支持多平台,这里笔者使用的是Archlinux,其他操作系统也可在官网寻找对应平台的安装教程。
Java 开发环境
JDK 多版本管理工具有很多种,这里主要介绍SDKMAN、JEnv、Jabba三种工具。
1.SDKMAN
1.1 安装
SDKMAN 官网安装教程,SDKMAN支持类UNIX的平台,windows系统可以使用WSL。

下载安装命令,如果使用zsh或者fish,则将下面的bash替换为你所使用的shell
由于
zsh与bash的语法兼容性问题,推荐在管道符后使用bash,它会向.bashrc和.zshrc中都写入必要的内容
1  | curl -s "https://get.sdkman.io" | bash  | 
这里安装可能会出现缺少zip的问题,参考这篇文章解决。
在Archlinux下直接用包管理器安装
1  | sudo pacman -S zip  | 
在windows操作系统下,访问sourceforge找到zip包文件列表,下载zip-3.0-bin.zip,并将下载的包解压到C:\Program Files\Git\usr\bin目录下,再次执行下载安装命令。
通过上面的命令安装后,接着执行下面的命令手动使配置生效或者开启一个新的终端
1  | source "$HOME/.sdkman/bin/sdkman-init.sh"  | 
测试SDKMAN是否安装成功
1  | sdk version  | 
输出版本信息即表示安装成功。
1.2 使用
查看可用的JDK版本列表
1  | sdk list java  | 
使用SDKMAN安装JDK
1  | sdk install java 17.0.6-tem  | 
临时使用指定版本的JDK,在当前shell生效
1  | sdk use java 17.0.6-tem  | 
指定全局JDK版本,在全局生效
1  | sdk default java 17.0.6-tem  | 
卸载JDK
1  | sdk uninstall java 17.0.6-tem  | 
1.3 卸载
SDKMAN没有自动化卸载的方法,需要手动进行卸载
备份源文件目录
1  | tar zcvf ~/sdkman-backup_$(date +%F-%kh%M).tar.gz -C ~/ .sdkman  | 
删除源文件目录
1  | rm -rf ~/.sdkman  | 
删除.bashrc,.bash_profile,.zshrc,profile文件中安装SDKMAN时写入的初始化配置信息,如果这些文件存在的话,具体要删除的代码片段如下
1  | #THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!  | 
1.4 补充说明
SDKMAN在国内存在无法下载或下载很慢的问题,可访问国内镜像站https://www.injdk.cn/下载SDKMAN不仅支持JDK的多版本管理,还支持其他的SDK,具体参考https://sdkman.io/sdks
2.jEnv
JEnv与SDKMAN不同,JEnv不能直接安装JDK,而是对不同版本JDK环境变量的配置进行管理。

2.1 安装
jEnv 官网,支持大部分类Unix系统平台。
git克隆下载
1  | git clone https://github.com/gcuisinier/jenv.git ~/.jenv  | 
在Bash中配置
1  | echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile  | 
在Zsh中配置
1  | echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc  | 
2.2 使用
首先需要去官网下载好对应的JDK源文件tar.gz,并解压到一个合适的目录下。
将已经下载好的JDK添加到jEnv中,以下是参考命令,具体的目录根据实际情况配置。
1  | jenv add /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home  | 
使用指定版本的JDK
查看管理的JDK版本,当前使用的JDK版本会在前面有一个*的标记
1  | jenv versions  | 
配置全局使用的JDK版本,版本根据实际情况选择,命令仅供参考
1  | jenv global oracle64-1.6.0.39  | 
配置本地使用的JDK版本(每个目录)
1  | jenv local oracle64-1.6.0.39  | 
配置shell使用的JDK版本
1  | jenv shell oracle64-1.6.0.39  | 
取消配置,默认会采用system的配置
1  | jenv global --unset  | 
2.3 卸载
参考SDKMAN的卸载方法
删除源文件目录
1  | rm -rf ~/.jenv  | 
删除.bashrc,.bash_profile,.zshrc,profile文件中安装SDKMAN时写入的初始化配置信息,如果这些文件存在的话,具体要删除的代码片段如下
1  | export PATH="$HOME/.jenv/bin:$PATH"  | 
3.Jabba
jabba是跨平台的Java版本管理工具,它是受Node.js的nvm启发,并且采用Go语言开发
jabba的官方仓库:https://github.com/shyiko/jabba
3.1 安装
jabba的安装参考文档:Java JDK 版本管理工具jabba的安装
安装最新版本
1  | export JABBA_GET="curl -sLk"  | 
特别地,如果在fish下安装,使用以下命令
1  | curl -sLk https://github.com/shyiko/jabba/raw/master/install.sh | bash; and . ~/.jabba/jabba.fish  | 
测试安装是否成功
1  | jabba --version  | 
3.2 使用
安装指定版本的JDK
1  | jabba install openjdk@1.14.0  | 
查看所有安装的JDK版本
1  | jabba ls  | 
卸载指定版本的JDK
1  | jabba uninstall openjdk@1.14.0  | 
查看可用的JDK版本
1  | jabba ls-remote  | 
切换JDK版本
1  | jabba use openjdk@1.11.0  | 
更多命令参考jabba的常用命令
3.3 卸载
删除源文件目录
1  | rm -rf .jabba  | 
删除.bashrc,.bash_profile,.zshrc,profile文件中安装SDKMAN时写入的初始化配置信息,如果这些文件存在的话,具体要删除的代码片段如下
1  | [ -s "/home/entropy/.jabba/jabba.sh" ] && source "/home/entropy/.jabba/jabba.sh"  | 
3.4 补充说明
jabba同样存在国内无法下载或者下载很慢的问题。
4.Archlinux-java
由Archlinux提供的java多版本管理方案,是Archlinux自带的一个脚本文件,具体可参考Arch Wiki。
Python 开发环境
Pyenv
Pyenv 官方仓库,Pyenv是一个管理多版本Python的工具
安装
1  | curl https://pyenv.run | bash  | 
在.bashrc或.zshrc中添加以下内容
1  | export PYENV_ROOT="$HOME/.pyenv"  | 
重启终端或执行以下命令使配置生效
1  | source ~/.bashrc  | 
使用
安装指定版本的python
1  | pyenv install 3.10.4  | 
切换到指定版本的python
1  | pyenv global 3.10.4  | 
切换回系统级的python
1  | pyenv global system  | 
在当前目录中锁定python版本(只影响当前目录及其子目录)
1  | pyenv local 3.10.4  | 
仅在当前会话临时使用指定版本的python
1  | pyenv shell 3.10.4  | 
优先级 shell > local > global
查看当前使用的python
1  | pyenv version  | 
查看当前所有已下载的python
1  | pyenv versions  | 
查看所有可安装的python版本
1  | pyenv install -l  | 
卸载指定版本的python
1  | pyenv uninstall 3.10.4  | 
配合虚拟环境使用
配置pyenv-virtualenv 插件,在前面的配置中已经将对应的配置写入了.bashrc或.zshrc
创建基于特定python版本的虚拟环境
和另一个比较成熟的老项目virtualenv不同,该命令不会在当前目录下生成文件,而是在
.pyenv的版本目录下生成一个名为example的软连接,并指向特定python版本的目录。相当于把虚拟环境也作为一个“独立的版本”进行管理
1  | pyenv virtualenv 3.10.4 example  | 
查看虚拟环境列表
1  | pyenv virtualenvs  | 
激活虚拟环境
1  | pyenv active example  | 
退出虚拟环境
1  | pyenv deactive  | 
删除虚拟环境
1  | pyenv uninstall example  | 
补充
Pyenv 没有 windows 版本,但有一个对应的Pyenv-win项目,提供了适用于 windows 的 Pyenv。
Python 虚拟环境有多种创建工具。
最开始的有 virtualenv,然后在 python3.3 引入了 venv 模块,它们都专注于虚拟环境的管理。virtualenv 作为比较老牌的第三方库提供了更多的功能和对老版本的兼容性,而 venv 作为标准内置库对于 python3.3 之后的版本提供了更简单快捷的虚拟环境管理方案。
后面出现了非单一用途的 pipenv 和 poetry,它们不止用于虚拟环境的管理,还用于包管理等方面。pipenv 主要是结合了 pip 与 virtualenv 的功能,能够执行虚拟环境管理和包管理,而 poetry 拥有除了 python 多版本环境管理以外几乎所有的功能。
Go 开发环境
GVM
GVM 官方仓库,GVM是Go语言版本管理器,支持安装和管理多个Go版本
安装
如果使用zsh或者fish,则将下面的bash替换为你所使用的shell
1  | bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)  | 
执行下面的命令手动使配置生效或者打开一个新的终端
1  | source $HOME/.gvm/scripts/gvm  | 
使用
先安装Go1.4的版本,之后再安装Go1.5及之后的版本,避免出现引导问题(由于Go在1.5版本实现了自举,因此安装高版本的Go还需要准备一个低版本的Go提供编译环境)
1  | gvm install go1.4 -B  | 
临时使用指定的Go版本,加上--default参数指定,就可以默认使用该版本
1  | gvm use go1.4  | 
列出已安装的Go版本,在当前正在使用的版本前面会有=>的前缀
1  | gvm list  | 
列出所有可供下载的Go版本
1  | gvm listall  | 
卸载Go1.5
1  | gvm uninstall go1.5  | 
卸载
GVM提供了完全删除GVM自身和所有已安装的Go版本和软件包的命令
1  | gvm implode  | 
Node.js 开发环境
NVM
NVM 官方仓库,nvm就是node.js的版本管理工具,在开发中可以通过它来安装和切换不同的node.js版本
安装
如果使用zsh或者fish,则将下面的bash替换为你所使用的shell
1  | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash  | 
测试安装是否成功,关闭终端打开一个新的终端执行以下命令,输出nvm则表示安装成功
1  | command -v nvm  | 
使用
列出所以可下载安装的Nodejs版本
1  | nvm ls-remote  | 
列出已安装的Nodejs版本,在当前正在使用的版本前面会有->的前缀
1  | nvm list  | 
安装指定版本的Nodejs
1  | nvm install v18.15.0  | 
临时使用指定版本的Nodejs
1  | nvm use v18.15.0  | 
默认使用指定版本的Nodejs
1  | nvm alias default v18.15.0  | 
卸载指定版本的Nodejs
1  | nvm uninstall v18.15.0  | 
从低版本切换到高版本时一并安装全局包 (只能在未安装高版本的前提下安装高版本时一并安装全局包,降级迁移可能会有兼容性问题)
1  | nvm install v20.14.0 --reinstall-packages-from=v18.15.0  | 
卸载
删除源文件目录
1  | rm -rf ~/.nvm  | 
删除.bashrc,.bash_profile,.zshrc,profile文件中安装SDKMAN时写入的初始化配置信息,如果这些文件存在的话,具体要删除的代码片段如下
1  | source /usr/share/nvm/init-nvm.sh  | 
补充说明
NVM在国内可能存在无法下载或者下载很慢的问题,可在.bashrc,.bash_profile,.zshrc中选择bash或zsh对应的配置文件里添加以下配置
1  | export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node  | 
PNPM
PNPM 原本是为了解决 npm 包管理器磁盘空间占用问题而诞生的新一代包管理器,全称为 performant npm (“高性能的 npm”)。PNPM 集成了管理 nodejs 版本的功能,可以通过 pnpm env 设置。
安装
1  | curl -fsSL https://get.pnpm.io/install.sh | sh -  | 
使配置生效,如果使用zsh或者fish,则将下面的bash替换为你所使用的shell
1  | source ~/.bashrc  | 
使用
这里主要说明用于管理 nodejs 版本的相关命令
列出本地或远程可用的 nodejs 版本
1  | pnpm env list  | 
安装 nodejs 的 tls 版本
1  | pnpm env use --global lts  | 
安装 nodejs 指定版本 v16
1  | pnpm env use --global 16  | 
切换 nodejs 版本的命令和安装的命令一致
移除指定版本的 nodejs
1  | pnpm env remove --global 14.0.0  | 
参考资料
Java 多版本管理工具(自由切换Java版本)Jenv使用(支持Linux Mac Windows)
- 标题: 多版本环境控制
 - 作者: Entropy Tree
 - 创建于 : 2023-03-12 16:05:02
 - 更新于 : 2024-06-20 17:02:31
 - 链接: https://www.entropy-tree.top/2023/03/12/more-env-control/
 - 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。