多版本环境控制

Entropy Tree Lv4

在搭建开发环境时,通常是选择一个LTS(Long Term Support)版本,但是有时候需要在新发布的版本或者是在某个历史版本上搭建环境进行测试,需要重新搭建新环境,带来诸多不便。

关于多版本环境的搭建,笔者这里提供了多版本管理工具的方案,实现多个不同版本之间快速切换和管理,省去环境变量的重复配置。

以下是一些常用的开发环境多版本管理工具,大部分工具支持多平台,这里笔者使用的是Archlinux,其他操作系统也可在官网寻找对应平台的安装教程。

Java 开发环境

JDK 多版本管理工具有很多种,这里主要介绍SDKMANJEnvJabba三种工具。

1.SDKMAN

1.1 安装

SDKMAN 官网安装教程 SDKMAN支持类UNIX的平台,windows系统可以使用WSL

下载安装命令,如果使用zsh或者fish,则将下面的bash替换为你所使用的shell

由于zshbash的语法兼容性问题,推荐在管道符后使用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.zshrcprofile文件中安装SDKMAN时写入的初始化配置信息,如果这些文件存在的话,具体要删除的代码片段如下

1
2
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
[[ -s "/home/dudette/.sdkman/bin/sdkman-init.sh" ]] && source "/home/dudette/.sdkman/bin/sdkman-init.sh"

1.4 补充说明

2.jEnv

JEnvSDKMAN不同,JEnv不能直接安装JDK,而是对不同版本JDK环境变量的配置进行管理。

2.1 安装

jEnv 官网 ,支持大部分类Unix系统平台。

git克隆下载

1
git clone https://github.com/gcuisinier/jenv.git ~/.jenv

Bash中配置

1
2
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile

Zsh中配置

1
2
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(jenv init -)"' >> ~/.zshrc

2.2 使用

首先需要去官网下载好对应的JDK源文件tar.gz,并解压到一个合适的目录下。

将已经下载好的JDK添加到jEnv中,以下是参考命令,具体的目录根据实际情况配置。

1
2
jenv add /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/jdk17011.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
2
3
jenv global --unset
jenv local --unset
jenv shell --unset

2.3 卸载

参考SDKMAN的卸载方法

删除源文件目录

1
rm -rf ~/.jenv

删除.bashrc.bash_profile.zshrcprofile文件中安装SDKMAN时写入的初始化配置信息,如果这些文件存在的话,具体要删除的代码片段如下

1
2
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"

3.Jabba

jabba是跨平台的Java版本管理工具,它是受Node.jsnvm启发,并且采用Go语言开发

jabba的官方仓库:https://github.com/shyiko/jabba

3.1 安装

jabba的安装参考文档:Java JDK 版本管理工具jabba的安装

安装最新版本

1
2
export JABBA_GET="curl -sLk"
curl -sLk https://github.com/shyiko/jabba/raw/master/install.sh | bash && . ~/.jabba/jabba.sh

特别地,如果在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.zshrcprofile文件中安装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
2
3
4
5
6
7
8
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# Load pyenv-virtualenv automatically by adding
# the following to ~/.bashrc:

eval "$(pyenv virtualenv-init -)"

重启终端或执行以下命令使配置生效

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 官方仓库 GVMGo语言版本管理器,支持安装和管理多个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及之后的版本,避免出现引导问题(由于Go1.5版本实现了自举,因此安装高版本的Go还需要准备一个低版本的Go提供编译环境)

1
2
3
4
gvm install go1.4 -B
gvm use go1.4 [--default]
export GOROOT_BOOTSTRAP=$GOROOT
gvm install go1.5

临时使用指定的Go版本,加上--default参数指定,就可以默认使用该版本

1
2
gvm use go1.4
gvm use go1.4 --default

列出已安装的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.zshrcprofile文件中安装SDKMAN时写入的初始化配置信息,如果这些文件存在的话,具体要删除的代码片段如下

1
source /usr/share/nvm/init-nvm.sh

补充说明

NVM在国内可能存在无法下载或者下载很慢的问题,可在.bashrc.bash_profile.zshrc中选择bashzsh对应的配置文件里添加以下配置

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
2
pnpm env list
pnpm env list --remote

安装 nodejs 的 tls 版本

1
pnpm env use --global lts

安装 nodejs 指定版本 v16

1
pnpm env use --global 16

切换 nodejs 版本的命令和安装的命令一致

移除指定版本的 nodejs

1
2
pnpm env remove --global 14.0.0
pnpm env remove --global 14.0.0 16.2.3

参考资料

SDK管理利器:SDKMAN!

Java 多版本管理工具(自由切换Java版本)Jenv使用(支持Linux Mac Windows)

Java JDK使用SDKMAN、JEnv和Jabba安装配置及版本切换

Python多环境管理神器(pyenv)

【翻译】客观评价与对比Python所有的依赖环境管理工具

如何灵活地进行 Go 版本管理

Golang 多版本管理

nvm安装-linux篇

pnpm env

  • 标题: 多版本环境控制
  • 作者: 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 进行许可。
评论