nave

nave

Node.js 版本管理与虚拟环境工具

nave 是一款为 Node.js 开发者设计的虚拟环境管理工具。它能够快速切换 Node.js 版本和全局 npm 安装空间,支持命名环境,并使用子 shell。nave 无需修改系统配置文件即可使用,提供了安装、使用、清理和卸载特定 Node.js 版本等功能。此外,nave 还支持自动化配置和灵活的环境变量设置,有助于提升开发效率。

naveNode.js版本管理虚拟环境命令行工具Github开源项目

nave

Node 的虚拟环境。

一条命令即可切换 node 版本和全局 npm 安装空间。支持命名环境。默认使用子 shell,因此您可以通过 ^Dexit 快速退出环境。

无需编辑 .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/boron16latest 的内容

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_RCnave 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,这使得它对其他一些用例更好。

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多