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

Javascript 将使用nvm在项目上设置默认节点版本的点文件?,javascript,node.js,version-control,nvm,Javascript,Node.js,Version Control,Nvm,在ruby中使用rbenv时,您可以创建一个.ruby版本文件并将其放在本地目录中。 我正在寻找类似的东西使用 问题: 在package.json中是否有要设置的属性或要创建的文件来设置项目节点的默认版本?您可以使用项目目录中的NVM、点文件和一个名为direnv的小工具来实现这一点,该工具允许您在每个目录的基础上加载环境变量 安装NVM和direnv,然后将cd安装到要更改节点版本的目录中 在该目录中添加一个名为.nvmrc的文件,其中只包含要自动切换到的节点版本的版本号,例如: 6.2.2

在ruby中使用rbenv时,您可以创建一个
.ruby版本
文件并将其放在本地目录中。 我正在寻找类似的东西使用

问题:


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

您可以使用项目目录中的NVM、点文件和一个名为
direnv
的小工具来实现这一点,该工具允许您在每个目录的基础上加载环境变量

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

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

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将启动,并要求您通过在提示符下键入
direnv allow将目录添加到direnv白名单中。
。一旦被列入白名单,direnv将在您进入该目录时自动运行该脚本,并将您的节点版本设置为
.nvmrc
中的版本号


作为奖励,它还将把
node\u modules
目录添加到您的路径中,这样您就可以从这些目录中执行二进制文件,而无需预先设置
node\u modules
路径。

以下是我的操作方法,通常与Ross Shannon的答案类似,但有一些区别:

  • 您可以仅在
    包.json
    中指定节点版本,而不需要
    .nvmrc
    文件
  • 您还可以直接在
    .envrc
    中指定节点版本,同样不需要
    .nvmrc
    文件
  • 我不会将
    node\u modules/.bin
    添加到路径中,但如果这是您的首选行为,只需将
    PATH\u add node\u modules/.bin
    添加到
    use\nvm
    函数中即可
  • 对我来说,支持从
    package.json
    而不是
    .nvmrc
    选择节点版本很重要,因为我不想担心保持两个文件同步(特别是在有多个协作者的项目上)。也就是说,此解决方案仍然适用于
    .nvmrc

    此解决方案需要,并且可选(如果您希望能够从package.json中选择节点版本)

    ~/.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
    }
    
    但是,对于我的
    .envrc
    ,我更喜欢以下内容:

    if declare -Ff use_nvm >/dev/null; then
      use nvm package.json
    fi
    
    对于具有共享的
    .envrc
    的共享项目,以便未定义
    的协作者使用nvm
    不会收到错误


    现在,当您进入项目目录时,您所需的节点版本将自动使用(第一次,您将被提示使用
    direnv allow
    )将您对
    .envrc
    的更改列为白名单)。

    现在,direnv的stdlib中内置了一些本机支持。在他们的文档中有记录,但也很容易阅读,或者键入
    direnv stdlib
    查找)

    如果您想在路径中使用
    node\u modules/.bin
    ,只需将行
    layout node
    添加到
    .envrc
    (也在
    direnv stdlib
    输出中)

    注意:此解决方案不会自动切换文件夹版本

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

    创建
    .nvmrc
    文件,并指定希望应用程序运行的节点版本

    touch .nvmrc
    
    
    打开文件并指定版本,例如
    13.3.0

    .nvmrc
    中定义版本后,您也可以在
    package.json
    文件中定义
    引擎
    ,这将确保版本满足要求,如果不满足要求,则运行
    npm安装
    将失败

    "engineStrict": true,
    "engines": {
      "node": "13.3.0"
    }
    
    下面是如果它与节点版本不匹配时将遇到的错误

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

    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"
    },
    

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

    direnv的好处在于,当您更改出目录(例如:到其他项目)时,它会自动撤消所有修改。此答案不支持在direnv卸载时撤消
    nvm use
    的效果。要添加到Ross的答案中,您可以使用
    asdf
    而不是
    nvm
    ,后者的工作原理与nvm非常相似,但不仅仅是NodeJ。请参阅,然后将
    asdf
    direnv
    组合使用,可以一次创建文件
    nvm use
    
    "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"
    },