Project Icon

nave

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

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

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

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号