使用asdf管理Node.js版本

2,917 阅读6分钟

当同时处理几个项目时,你可能需要不同版本的编程语言,你正在编写。这就导致了卸载和重新安装每种语言的正确版本,这就浪费了大量的时间。

幸运的是,通过版本管理器,如Node版本管理器、Ruby的Rbenv或Python的yenv,在不同版本之间切换可以很容易。

这些都是很大的帮助,但现在你需要为你的多语言项目管理和安装多个工具,这可能是很麻烦的。相反,你可以使用asdf来管理多个运行时版本,用一个CLI工具来管理你所使用的所有语言版本。

Asdf是一个可扩展的版本管理器,支持多种语言,如Ruby、Node.js、Elixir、Erlang、Python等,都可以同时使用。你可以在全局和每个目录的基础上切换语言的版本。

在这篇文章中,我们将学习使用asdf和Node所需的一切,包括如何在本地机器中设置和更新asdf,以及安装、更新和删除Node插件。

开始使用

要开始使用asdf,我们需要安装一些依赖项,如coreutilscurl ,和git 。Asdf使用这些依赖项来安装不同的语言。

执行下面的命令来安装asdf。

 
brew install coreutils curl git  # on macOS with Homebrew

sudo apt install curl git        # on Linux

Asdf文档建议从git repo克隆,像这样。

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.8.1

要安装asdf,把它添加到你的shell中。你可以在文档中查看其他安装方法我将使用 "Bash & Homebrew(macOS)"方法。

用下面的方法把asdf.sh 添加到你的~/.bash_profile

echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ~/.bash_profile

然后,设置bash完成。

echo -e "\\n. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash" >> ~/.bash_profile

你可以像这样看到你的~/.bash_profile

cat ~/.bash_profile

Asdf也支持ZshFish shells。

现在,关闭终端,并启动一个新的终端。让我们通过在命令行中输入asdf ,确保asdf已经安装。

安装Node.js插件

在asdf中,每种语言都由一个插件支持。他们有数百个插件,但如果你没有看到你需要的东西,你也可以创建自己的。

插件不仅包括语言,asdf还支持数据库。

插件是用以下命令安装的。

asdf plugin add <name> 

在安装Node插件之前,我们首先要安装GnuPG来验证软件包的真实性。每个插件都有不同的要求,你可以在每个插件的GitHub repo找到。

对于Mac,我们可以通过Homebrew安装GnuPG。

brew install gpg

安装GnuPG后,通过运行以下程序安装Node插件。

asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

安装后,你可以看到已安装的插件列表,像这样。

asdf plugin list

安装一个编程语言版本

Asdf列出了每种编程语言的所有可用版本;截至撰写本文时,我们总共可以安装604个Node版本。

你可以通过以下方式查看Node的版本列表。

asdf list all nodejs | wc -l   # prints 604

要安装一个特定版本的Node,请运行。

asdf install nodejs 14.17.6

如果你在安装某个版本的Node时遇到了一些错误,可以试试这个命令。

asdf reshim nodejs

你可能会在这里得到一个关于reshim 的错误。如果不运行reshim 命令,npm包将在你的路径中不可用。

Unknown command: `asdf reshim nodejs 14.17.6`
/usr/local/Cellar/asdf/0.8.1_1/libexec/bin/asdf: line 82: /Users/<your-username>/.asdf/lib/commands/command-help.bash: No such file or directory

你可以通过运行以下命令查看你已经安装了哪些版本。

asdf list all nodejs

要安装最新版本的Node,请运行。

asdf install nodejs latest

我们也可以安装以指定字符串开头的最新Node版本。

# asdf install <name> latest:<version>
asdf install nodejs latest:16

设置一个版本

编程语言的版本可以在三个层面上进行设置:全局、当前shell中或本地。

全局

你可以设置Node的默认全局版本,这样它将在任何新的shell中持续存在。这将在Home 目录下的.tool_versions 文件中添加或更新一行。

要设置Node的全局或默认版本,请运行。

# asdf global <name> <version> [<version>...]
asdf global nodejs 14.17.6
asdf global nodejs latest

现在,你可以用asdf current 命令验证asdf的当前版本。在我的例子中,它显示最新的Node版本为16.9.0。

(base) ➜  ~ asdf current
nodejs          16.9.0          /Users/<username>/.tool-versions

如果你没有列出一个工具执行的版本,这将返回一个错误。通过这个命令,我们可以看到当前目录下的工具和版本解析,或者没有解析。

全局默认值是在$HOME/.tool-versions 中管理的。你可以通过运行以下内容看到它的内容。

cat $HOME/.tool-versions

我已经把全局的Node版本设置为最新的,我可以通过运行来验证。

(base) ➜  ~ node -v
v16.9.0 

Shell

如果你想只在当前的shell中使用Node版本,可以运行以下内容。

# asdf shell <name> <version> [<version>...]
asdf shell nodejs 14.17.6
asdf shell nodejs latest

这个版本的Node将只在当前的shell会话中运行,所以当你关闭会话时,这个版本将不可用。

在引擎盖下,shell 将版本设置为一个环境变量,名为ASDF_${LANG}_VERSION ,只用于当前的shell会话。

ASDF_NODEJS_VERSION=14.17.6 node --version

本地

你也可以通过在本地设置版本来运行基于单个项目的Node的特定版本。

asdf local <name> <version> [<version>...]
asdf local nodejs 14.17.6
asdf local nodejs latest

local 将版本写到$PWD/.tool-versions

你可以通过运行node -v 来验证本地和shell环境中的Node版本。

要设置基于单个项目的本地版本,首先用asdf install nodejs 安装你要使用的版本,然后运行asdf local nodejs 。这将创建一个带有你选择的Node版本的.tool-versions 文件。

卸载一个版本

要卸载一个版本,请使用这个命令。

# asdf uninstall <name> <version>
asdf uninstall nodejs 14.17.6
asdf uninstall nodejs latest

遗留支持

在团队中采用一个新的版本管理器可能需要时间,这就是为什么asdf让你回退到传统的版本文件。如果你愿意,你仍然可以使用你喜欢的版本管理器,如nvm

要启用传统支持,只需在主目录($HOME/.asdfrc)添加一个.asdfrc 文件,并添加以下配置设置。

legacy_version_file = yes  # .asdfrc file

通过将遗留版本文件设置为yes ,asdf将能够读取其他版本管理器文件,如.nvmrc.node-versions.ruby-versions

更新插件

在某些时候,你可能需要更新插件。你可以通过运行这个命令来完成。

asdf plugin update --all

到此为止,我们一直依靠asdf来管理多个开发环境。为了跟上asdf 版本,请运行以下命令。

asdf update       # via git
brew upgrade asdf # via homebrew

如果你想卸载asdf,你可以跟着docs走。

总结

Asdf是多语言程序员的一个伟大工具。它能实现无忧的安装,并能在多种语言版本之间轻松切换,为真正重要的事情节省时间--别忘了阅读《asdf的歌谣》!它能让你的工作变得更轻松。

现在,你可以安装任意多的语言,只要你想工作。与其使用许多不同的软件包管理器,你可以给asdf一个尝试,以统治他们所有。

你呢?你使用asdf吗?你使用它的经验如何?

The postManage Node.js versions using asdfappeared first onLogRocket Blog.