Javascript 将使用nvm在项目上设置默认节点版本的点文件?
在ruby中使用rbenv时,您可以创建一个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版本
文件并将其放在本地目录中。
我正在寻找类似的东西使用
问题:
在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"
},