一个dotfile,它将使用nvm在项目上设置默认节点版本?

Mat*_*ood 7 javascript version-control node.js nvm

在ruby中使用rbenv时,您可以创建一个.ruby-version文件并将其放在本地目录中.https://gist.github.com/fnichol/1912050 我正在寻找与NVM类似的东西?

题:

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

Ros*_*non 12

您可以使用项目目录中的NVM,dotfiles和一个名为的小工具来执行此操作,该工具direnv允许您基于每个目录加载环境变量.

http://direnv.net/

安装NVM和direnv,然后安装cd到要更改节点版本的目录.

添加.nvmrc在该目录中调用的文件,其中仅包含要自动切换到的节点版本的版本号,例如:

6.2.2
Run Code Online (Sandbox Code Playgroud)

然后添加一个调用.envrc到您的目录的环境配置文件,其中包含以下脚本:

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

PATH_add node_modules/.bin
Run Code Online (Sandbox Code Playgroud)

如果你现在cd离开这个目录,然后再cd回来,direnv将启动,你应该被要求通过direnv allow .在提示符下输入将目录添加到你的direnv白名单.一旦列入白名单,只要您进入此目录,direnv就会自动运行该脚本,并将您的节点版本设置为版本号.nvmrc.

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


edd*_*ies 7

这是我的做法,通常与罗斯香农的答案类似,但有一些区别:

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

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

此解决方案需要direnvnvm和可选的(如果您希望能够从 package.json 选择 Node 版本)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=$1

  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
}
Run Code Online (Sandbox Code Playgroud)

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

use nvm package.json
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢以下内容.envrc

if declare -Ff use_nvm >/dev/null; then
  use nvm package.json
fi
Run Code Online (Sandbox Code Playgroud)

对于具有共享的共享项目,.envrc以便未定义的协作者use nvm不会收到错误。

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


dei*_*zel 5

现在有一些内置于 direnv 的 stdlib 的本地支持。它记录在他们的wiki 中,但源代码同样易于阅读或键入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
Run Code Online (Sandbox Code Playgroud)

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