如何编写一个自动更改节点版本的.nvmrc 文件

嗨,我有两个项目一个在 angularjs 4.4.7和另一个在角6版本。我需要在这个节点版本之间切换。我尝试使用手动工作的 NVM。如何处理 angularjs 程序内部的版本更改,以便在自动加载最新角度页面时更改节点版本。有没有可能。我也经历了 # avn 但是如何创建。Node-version 文件。有人可以帮助任何链接或正确的示例步骤

165483 次浏览

正如在 nvm知识库中与此相关的 GitHub 问题线程中指出的那样,您可以在每个 Angular 项目文件夹中运行以下命令:

$ node -v > .nvmrc

请注意,您需要首先切换到每个项目中节点的正确版本,即运行上述命令的 之前

命令 中发生了什么:

  • node -v将把当前版本的 node转换为 stdout
  • 然后,>符号将 redirecting输出到一个名为 .nvmrc的文件(如果已经存在具有相同文件名的内容,它将覆盖该内容)。
  • 在 bash 手册页面 https://linux.die.net/man/1/bash导演部分下阅读更多 bash 重定向

cd进入目标目录时,nvm将首先读取文件,并自动切换到正确的版本。

正如@Aditya-M-P 已经提到的,你可以在你的项目根目录中运行以下命令来生成 .nvmrc,为你的项目设置一个期望的 NodeJS 版本来正常工作:

node -v > .nvmrc

它会在你的 .nvmrc文件中生成这样的东西:

v10.16.2

也使用没有 v字母的 10.16.2将工作得很好。

但是,在 。 nvmrc部分的官方文档中从未提到,一旦创建了这个文件,指定的节点版本将自动加载。 所以这还不够,您需要运行下面的命令,这样 nvm就可以查找 .nvmrc文件来加载指定的版本:

nvm use

下面是一个演示用的 gif: enter image description here

自动加载指定的节点版本:

您需要根据使用的 bashzsh向 shell 配置添加其他内容

为了得到它们的确切配置,请按照相应的 Shell 配置节中的说明操作。

在我的例子中,我使用的是 zsh,所以我确实需要在我的 .zshrc文件的末尾添加这个,下面的图片证实了它的工作原理:

# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
local node_version="$(nvm version)"
local nvmrc_path="$(nvm_find_nvmrc)"


if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")


if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$node_version" ]; then
nvm use
fi
elif [ "$node_version" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

enter image description here

我希望它能对其他面临同样问题的人有所帮助!

检查 GitHub 上 nvm 回购的 自述。解决方案已经在那里给出。

壳牌集成

对于 Bash,将以下内容放在 $HOME/.bashrc的末尾,shell 将根据目录下的 .nvmrc文件更改节点版本。

find-up () {
path=$(pwd)
while [[ "$path" != "" && ! -e "$path/$1" ]]; do
path=${path%/*}
done
echo "$path"
}


cdnvm(){
cd "$@";
nvm_path=$(find-up .nvmrc | tr -d '[:space:]')


# If there are no .nvmrc file, use the default nvm version
if [[ ! $nvm_path = *[^[:space:]]* ]]; then


declare default_version;
default_version=$(nvm version default);


# If there is no default version, set it to `node`
# This will use the latest version on your machine
if [[ $default_version == "N/A" ]]; then
nvm alias default node;
default_version=$(nvm version default);
fi


# If the current version is not the default version, set it to use the default version
if [[ $(nvm current) != "$default_version" ]]; then
nvm use default;
fi


elif [[ -s $nvm_path/.nvmrc && -r $nvm_path/.nvmrc ]]; then
declare nvm_version
nvm_version=$(<"$nvm_path"/.nvmrc)


declare locally_resolved_nvm_version
# `nvm ls` will check all locally-available versions
# If there are multiple matching versions, take the latest one
# Remove the `->` and `*` characters and spaces
# `locally_resolved_nvm_version` will be `N/A` if no local versions are found
locally_resolved_nvm_version=$(nvm ls --no-colors "$nvm_version" | tail -1 | tr -d '\->*' | tr -d '[:space:]')


# If it is not already installed, install it
# `nvm install` will implicitly use the newly-installed version
if [[ "$locally_resolved_nvm_version" == "N/A" ]]; then
nvm install "$nvm_version";
elif [[ $(nvm current) != "$locally_resolved_nvm_version" ]]; then
nvm use "$nvm_version";
fi
fi
}
alias cd='cdnvm'

因为在 Bash 中没有钩子支持,所以上面的解决方案很难看。

对于 ,把这个放入你的 $HOME/.zshrc

# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
local node_version="$(nvm version)"
local nvmrc_path="$(nvm_find_nvmrc)"


if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")


if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$node_version" ]; then
nvm use
fi
elif [ "$node_version" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

更好的解决方案

一个更好的解决方案是使用 Nodenv。我不是在开玩笑,nodenv与 nvm 非常不同,n。

nodenvrbenv家族的一员,这些版本管理器比其他版本管理器有很大的优势。

  1. 它改变节点的版本,而不需要一次又一次地修改环境变量 PATH,因为它使用的是 垫片可执行文件。这使得它有一个内置的支持 自动切换节点版本
  2. nodenv中的自动版本切换不需要连接到 chpwd上来定期检查目录更改。版本选择将延迟到执行 node命令时进行。
  3. nodenv中的命令是用脚本实现的。而来自 nvm的命令是在函数中实现的,这意味着所有4000多行代码都必须在 shell 启动时进行解析,并大大增加了 shell 的初始化时间。nodenv初始化快得多。

参考文献

创建。Nvmrc 文件,其中包含项目中需要的节点版本,比如

v12.20.0

你应该能够在项目文件夹和运行 nvm use光盘。这将打印像这样的东西:

Found '/Users/you/myproject/.nvmrc' with version <v12.20.0>
Now using node v12.20.0 (npm v6.14.8)

没有自动化的方法 AFAIK,由 NVM 提供,除了创建一个 bash 脚本为您做这些,NVM 文档详细介绍了 给你