nave
Node 的虚拟环境。
一条命令即可切换 node 版本和全局 npm 安装空间。支持命名环境。默认使用子 shell,因此您可以通过 ^D
或 exit
快速退出环境。
无需编辑 .bashrc
或 .profile
,只需安装即可使用。
安装
如果您想要全局的 nave
命令,可以用 npm 安装。但这并非必要。您可以直接运行这里的 nave.sh
shell 脚本,或者将其符号链接到任何位置,甚至只需下载脚本并将其放在您想要的位置。
curl https://raw.githubusercontent.com/isaacs/nave/main/nave.sh > /usr/local/bin/nave
chmod 0755 /usr/local/bin/nave
使用 npm
如果您有 npm,假设您已经有了 Node,所以这有点多余,但也许您喜欢用其他方式安装顶层 Node,然后用 npm 安装子 shell 版本切换器。为什么 bash 程序会在 npm 中呢?没关系。比特不会评判。
npm install -g nave
使用方法
要使用某个版本的 node,执行以下操作:
nave use <某个版本>
如果您想命名一个虚拟环境,可以这样做:
nave use <某个名称>
如果该虚拟环境尚不存在,它会提示您选择一个版本。
这两个命令都会让您进入一个子 shell。使用 exit
或 ^D
退出 shell 回到原来的位置。
以下是完整的使用说明:
用法:nave <命令>
命令
install <版本> 安装指定版本(例如:12.8.0)
install <名称> <版本> 将版本安装为命名环境
use <版本> 进入使用指定版本的子 shell
use <版本> <程序> 进入子 shell,运行"<程序>",然后退出
use <名称> <版本> 创建使用指定版本的命名环境。
如果名称已存在但版本不同,
则会更新链接。
usemain <版本> 安装到 /usr/local/bin(即作为主要 nodejs 使用)
clean <版本> 删除 <版本> 的源代码
uninstall <版本> 删除 <版本> 的安装
ls 列出当前已安装的版本
ls-remote 列出远程 node 版本
ls-all 列出远程和本地 node 版本
latest 显示最新的 dist 版本
cache 清除或查看缓存
help 输出帮助信息
auto 查找 .naverc 并进入该环境
如果未找到 .naverc,则等同于 'nave exit'
auto <目录> 进入 <目录>,然后查找 .naverc,并进入该环境
如果未找到 .naverc,则在指定目录中
等同于 'nave exit'。
auto <目录> <命令> 进入 <目录>,然后查找 .naverc,并在该环境中
运行命令
如果未找到 .naverc,则在指定目录中
等同于 'nave exit <命令>'。
should-auto 如果 nave auto 环境已经
匹配配置,则退出状态为 1,如果应该
进行更改则为 0(即通过调用 'nave auto')
显式调用 'nave use' 或 'nave exit' 将
告诉 nave 它不应该自动执行。
get <变量> 打印出各种 nave 配置值。
exit 取消设置所有 NAVE 环境变量(与 'exec' 一起使用)
exit <命令> 在无 nave 的环境中运行指定命令
(请注意,nave 仍会设置 NAVE_EXIT=1 以
防止 'nave should-auto' 评估为真。)
版本字符串
任何需要版本的命令都可以提供以下
"版本式"标识符之一:
- x.y.z 特定的 SemVer 元组
- x.y 主版本和次版本号
- x 仅主版本号
- lts 最新的 LTS(长期支持)node 版本
- lts/<名称> 指定 LTS 集合中的最新版本(argon、boron 等)
- lts/* 与单独的 "lts" 相同
- latest 最新的(非 LTS)版本
- stable 向后兼容的 "lts" 别名。
要退出 nave 子 shell,输入 'exit' 或按 ^D。
要在不使用子 shell 的情况下运行 nave,执行 'exec nave use <版本>'。
要清除 nave 环境的设置,使用 'exec nave exit'
环境变量
可以设置以下环境变量来改变 nave 的行为。
NAVE_DIR nave 操作的根目录。默认为
$XDG_CONFIG_HOME/nave(如果设置,例如 ~/.config/nave),或
~/.nave。
NAVE_NPX 设置为 '1' 可将 node_modules/.bin 添加到 PATH
NAVE_DEBUG 设置为 '1' 可在调试模式下运行。
NAVE_CACHE_DUR 缓存版本信息的持续时间(秒)(86400)
NAVEUA 获取版本信息时发送的用户代理头
NAVE_SRC_ONLY 设置为 '1' 仅从源代码构建 node,永不使用
二进制发行版。(这会慢得多!)
NAVE_JOBS 设置构建 node 时使用的 JOBS 数量。
默认为系统的 CPU 数量。
NODEDIST 获取 node 的发行服务器。默认为
https://nodejs.org/dist
NAVE_CONFIG 从源代码构建时传递给 ./configure 的参数。
使用时,Nave 设置以下环境变量:
NAVE 描述正在使用的 nave 设置的字符串。
NAVENAME 在命名子 shell 中的名称,否则为 $NAVEVERSION
NAVEVERSION 正在使用的 node 版本。
NAVELVL 当前使用的子 shell 数量(类似于 bash 的 $SHLVL)
NAVE_LOGIN 交互式 nave 子 shell 中为 '1',否则为 '0'。
NAVE_ROOT nave 安装环境的位置
NAVE_SRC 下载的 Node.js 源代码位置
NAVE_AUTO_RC 'nave auto' 使用的 .naverc 文件
NAVE_AUTO_CFG 'nave auto' 使用的 .naverc 文件内容
配置文件
Nave 子 shell 将根据是否作为登录 shell 运行或运行特定命令,
像普通 shell 一样加载相同的 .bashrc、.bash_profile、.zprofile 等
配置文件。
此外,所有 nave 子 shell 如果找到以下文件,都会在正常的 shell 配置文件之后
按以下顺序加载,基于上述环境变量。当在子目录中运行时,
nave 会向上遍历目录树寻找任何它找到的这些文件,
但不会超过任何包含 '.git' 条目的文件夹。
.nave_profile_${NAVE}
.nave_profile_${NAVENAME},如果是命名环境
.nave_profile_${NAVEVERSION},例如 .nave_profile_16.19.0
.nave_profile_${NAVEVERSION major.minor},例如 .nave_profile_16.19
.nave_profile_${NAVEVERSION major},例如 .nave_profile_16
.nave_profile
最后,如果存在,它总是会加载 ${NAVEDIR}/../.naverc。
(例如,~/.config/.naverc)
这些可用于设置特定项目的配置、环境变量或
基于使用的 Nave 环境的其他行为,而无需使用
主目录中的配置文件。
'nave auto' 命令会向上遍历目录树寻找
'.naverc' 或 '.nvmrc' 文件,并将其内容用作 'nave use' 的参数。
无子 shell 操作
如果您不想进入子 shell,只需使用 exec
运行 nave
exec nave use lts/argon
您甚至可以在 .bashrc
文件中添加类似这样的内容来节省输入:
n () {
exec nave "$@"
}
使用特定版本的 Node.js 运行 shell 脚本
如果需要使用 nave 提供的 node.js 版本运行 shell 脚本,可以在脚本中插入以下片段:
[ "${IN_SUBSHELL}" != "$0" ] && exec env IN_SUBSHELL="$0" nave use 5.0.0 bash "$0" "$@" || :
自动化!
您可以在项目根目录(或任何地方)放置一个 .naverc
文件。这个文件应该包含您想要使用的版本。它可以是类似 lts/boron
或 16
或 latest
的内容
echo lts/boron > ~/projects/my-project/.naverc
然后您可以运行 nave auto
来加载适当的环境。
但这对我来说还不够神奇或自动!
如果您想要更加荒谬/自动化,在您的 bash 设置(比如 ~/.bashrc
或其他)中添加这个
alias cd='exec nave auto'
然后每次您 cd
到不同的文件夹时,它都会自动加载正确的 nave 设置,或者如果找不到自动设置,就退出 nave 环境。
请注意,这样做也会导致当您 cd 到没有 nave 设置的目录时退出 nave 环境,所以它可能会干扰 "正常" 的 nave 操作。
此外,为 cd
设置别名是一种非常全面的系统更改。您可能希望给它一个其他名称,这样您就可以在不影响环境变量的情况下切换目录,避免产生潜在的意外副作用,或者甚至只是在您想要这种行为发生时显式运行 exec nave auto
。
总之,这是您的 shell,我希望这能帮助您更好地享受它 :)
不,那太神奇了,稍微不那么神奇一点
好的,将这个片段放在您的 bash 配置文件(.bashrc
或 .bash_profile
或您用于此目的的任何文件)中的 PROMPT_COMMAND
导出中。
export PROMPT_COMMAND='nave should-auto && exec nave auto'
现在,在任何有 .naverc
(或 .nvmrc
)的项目中,您总是会处于配置的 nave 环境中,而在任何没有为 nave auto 设置的文件夹中的主 shell 中,您总是不会处于 nave 环境中。
这对您通过 nave use
获得的普通 nave 子 shell 没有影响。
您的 PROMPT_COMMAND
的输出用于主 bash 提示符,所以您也可以做一些花哨的事情,比如:
__prompt () {
if nave should-auto; then
exec nave auto
if
# 在蓝底白字中显示 nave 版本,但在绿色中显示"正常"的 node 版本
if [ "$NAVE" != "" ]; then
echo -ne " \033[44;37mnode@$NAVE\033[0m"
else
echo -ne " \033[32mnode@$(node -p 'process.version.slice(1)' 2>/dev/null)\033[0m"
fi
}
PS1="\\$ "
export PROMPT_COMMAND='__prompt'
环境变量
$NAVE
当前 shell。可以是版本号,或名称和版本号。$NAVE_NPX
设置为 "1" 以在所有 nave shell 中将node_modules/.bin
添加到$PATH
(包括使用exec nave auto
时的主 shell)。$NAVE_AUTO_RC
由nave auto
找到的.naverc
文件。$NAVE_AUTO_CFG
进入nave auto
环境时读取的.naverc
文件内容。$NAVENAME
当前 shell 的名称。在未命名环境中等同于$NAVEVERSION
。$NAVEVERSION
当前 shell 指向的 node 版本。(应与node -v
一致。)$NAVELVL
子 shell 的嵌套级别。$NAVE_DEBUG
设置为 1 以bash -x
样式运行 nave。$NAVE_DIR
设置为你希望 nave 进行操作的位置。默认为~/.nave
。$NAVE_CONFIG
设置为要传递给./configure
的参数数组。默认为("--debug")
。(注意需要使用括号来提供多个参数。我在自己的系统上使用("--debug" "--without-npm")
,因为我通常使用 nave 来测试 npm,所以在子 shell 中安装它帮助不大。)这可以在~/.naverc
文件中设置,或在你的常规~/.bash{rc,_profile}
文件中设置。$NAVE_JOBS
如果设置,这将是构建 node 时运行的作业数。如果未设置,它将使用$JOBS
环境变量,然后尝试根据 CPU 数量猜测合理值,如果sysctl -n hw.ncpu
失败则默认为 2。$NAVE_SRC_ONLY
设置为 "1" 仅从源代码构建,而不是获取二进制文件。
贡献
欢迎提交补丁!在花太多时间开发补丁或功能请求之前,请发布一个问题,以确认是否会被接受或有未预见的后果。
如果补丁破坏测试或导致覆盖率低于 100%,通常不会被接受。你可以通过以下方式运行测试:
npm test
# 或者...
bash test/run.sh
你可以通过以下方式检查覆盖率:
npm run cov
# 或者...
COV=1 bash test/run.sh && open coverage-all/kcov-merged/nave.sh.*.html
最新的覆盖率报告可以在以下地址找到: https://isaacs.github.io/nave/kcov-merged/index.html
兼容性
Nave 是一个 bash 程序。即使你使用 zsh 或 fish 作为 shell,只要你的系统 某处 有 bash,它仍然可以执行大部分功能,但一些神奇的功能可能无法工作(因为这些显然必须在你的 shell 中通过 exec
内联运行)。
Nave 需要 bash。它可能永远无法在 Windows 或其他缺乏原生 Bourne Again Shell 的系统上运行。抱歉。(如果你能让它在有 bash 的 Windows 系统上正常工作,如 WSL 和 Cygwin,欢迎提交补丁。)
Nave 登录可以在任何 shell 中工作,但在 nave 环境中执行命令(例如,nave use 12 node program.js
)需要你的 shell 支持 -c
参数。(Bash、sh、zsh 和 fish 都可以正常工作。)
配置
如果 ~/.naverc
存在且可读,Nave 将在初始化新子 shell 时加载它。
你可以通过设置 NAVE_DIR
环境变量来控制 nave 放置文件的位置。但是,请注意,这必须在 除 ~/.naverc
之外的其他地方设置,因为它需要在调用 nave
命令的 父 shell 中设置。
默认情况下,nave 将文件放在 ~/.nave/
。如果此目录不存在且无法创建,那么它将尝试使用 nave.sh bash 脚本本身的位置。如果它无法写入此位置,则会报错退出。
致谢
nave 借鉴了 Tim Caswell 的 "nvm" 和 Kris Kowal 的 "sea" 程序的概念、灵感和代码。
Sea 非常好,但与 Narwhal 紧密相连。此外,它是一个 require.paths 管理器,而 nave 不是。
Nvm 也非常好,但必须被 source 而不是运行,因此对某些用例来说有点奇怪。但它不涉及子 shell,这使得它对其他一些用例更好。