将使用 nvm 在项目上设置默认节点版本的点文件?

A dotfile that will set the default node version on a project using nvm?

在ruby中,当使用rbenv时,你可以创建一个.ruby-version文件,并将它放在本地目录中。 https://gist.github.com/fnichol/1912050 我正在使用 NVM?

寻找类似的东西

问题:

是否有 属性 可在 package.json 中设置或要创建的文件将设置项目节点的默认版本?

您可以结合使用 NVM、项目目录中的点文件和一个名为 direnv 的小工具来执行此操作,该工具允许您在每个目录的基础上加载环境变量。

http://direnv.net/

安装 NVM 和 direnv,然后 cd 到您要更改 Node 版本的目录。

在该目录中添加一个名为 .nvmrc 的文件,其中仅包含您要自动切换到的 Node 版本的版本号,例如:

6.2.2

然后将名为 .envrc 的环境配置文件添加到您的目录,其中包含此脚本:

nvmrc=~/.nvm/nvm.sh
if [ -e $nvmrc ]; then
  source $nvmrc
  nvm use
fi

PATH_add node_modules/.bin

如果你现在 cd 离开这个目录,然后 cd 回来,direnv 会启动,你应该被要求通过输入 [=18 将目录添加到你的 direnv 白名单=] 在提示符下。列入白名单后,direnv 将在您进入此目录时自动 运行 该脚本,将您的 Node 版本设置为 .nvmrc.

中的版本号

作为奖励,它还会将 node_modules 目录添加到您的 PATH 中,因此您可以从这些目录执行二进制文件,而无需预先添加 node_modules 路径。

这是我的做法,与 Ross Shannon 的回答大体相似,但有一些不同:

  1. 您可以仅在 package.json 中指定节点版本,而无需 .nvmrc 文件
  2. 您也可以直接在 .envrc 中指定节点版本,同样无需 .nvmrc 文件
  3. 我没有将 node_modules/.bin 添加到 PATH,但如果这是您的首选行为,只需将 PATH_add node_modules/.bin 添加到 use_nvm 函数即可。

对我来说,支持 package.json 而不是 .nvmrc 的 Node 版本选择很重要,因为我不想担心保持两个文件同步(尤其是在有多个协作者的项目中) .也就是说,此解决方案仍然适用于 .nvmrc.

此解决方案需要 direnv, nvm and optionally (if you want to be able to select the Node version from package.json) jq

~/.config/direnv/direnvrc 文件中,添加以下内容:

# To use:
# 1) Node version specified in package.json, in .envrc add:
#      use nvm package.json
#    This requires that package.json contains something like
#      "engines": {
#        "node": ">=6.9.2"
#      },
#
# 2) Node version specified in .envrc add:
#      use nvm 6.9.2
#
# 3) Node version specified in .nvmrc, in .envrc add:
#      use nvm
use_nvm() {
  local node_version=

  if [[ $node_version = "package.json" ]]; then
    if has jq; then
      node_version=$(jq --raw-output .engines.node package.json | tr -d "<=> ")
    else
      echo "Parsing package.json for node version to use with direnv requires jq"
    fi
  fi

  nvm_sh=~/.nvm/nvm.sh
  if [[ -e $nvm_sh ]]; then
    source $nvm_sh
    nvm use $node_version
  fi
}

在您的项目目录中,添加一个调用 use nvm.envrc 文件,例如:

use nvm package.json

但是,对于我的 .envrc:

,我更喜欢下面这样的东西
if declare -Ff use_nvm >/dev/null; then
  use nvm package.json
fi

对于具有共享 .envrc 的共享项目,这样没有 use nvm 定义的协作者就不会收到错误。

现在,当您进入项目目录时,将自动使用您想要的 Node 版本(第一次,系统会提示您将对 .envrcdirenv allow 的更改列入白名单)。

direnv 的 stdlib 中内置了一些对此的原生支持。它记录在他们的 wiki, but the source 中,同样易于阅读,或键入 direnv stdlib 找到它)。

$ node -v
v8.0.0
$ cat .node-version
4.3.2
$ cat .envrc
use node
$ export NODE_VERSIONS=~/.nvm/versions/node
$ export NODE_VERSION_PREFIX=v
$ direnv allow
direnv: loading ~/.config/direnv/direnvrc
direnv: loading .envrc
direnv: using node
direnv: Successfully loaded NodeJS v4.3.2 (via .node-version), from prefix (~/.nvm/versions/node/v4.3.2)
direnv: export +CPATH +LD_LIBRARY_PATH +LIBRARY_PATH +PKG_CONFIG_PATH ~MANPATH ~PATH
$ node -v
v4.3.2
$ direnv deny
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
$ node -v
v8.0.0

如果你想要 node_modules/.bin 在你的路径中,只需将行 layout node 添加到你的 .envrcsource 也在 direnv stdlib 输出中) .

Note: This solution does not switch the folder version automatically.

其他答案对我帮助不大,因此,这是我遵循的解决方案:

创建一个 .nvmrc 文件并指定您希望应用 运行 运行的节点版本。

touch .nvmrc

打开文件并指定版本,比如13.3.0

Post你在.nvmrc里定义了一个版本,你也可以在package.json文件里定义engines,保证版本符合要求,如果没有,运行ning npm install 将失败。

"engineStrict": true,
"engines": {
  "node": "13.3.0"
}

以下是节点版本不匹配时您会遇到的错误。

最后,要确保它切换到正确的节点版本,您可以运行以下命令post导航到目录。

nvm use

这将切换到所需的版本,或者您可以将其添加到 package.json 中的 script 命令之一,例如:

"scripts": { 
  /*
   * here, the second command (nodemon server.js) will change base on the dev 
   * server you are using and the path where you've server.js
  */
  "dev:app:run": "nvm use; nodemon server.js"
},

以上将在启动服务器之前切换节点版本。