允许项目指定要使用的版本。
查看nvm 用法
或者从package.json 引擎解析壁橱可用版本
我不认为这是我想走的路。 主要原因是它需要一些非常丑陋的黑客来重新创建/模仿节点二进制文件。 例如,调用node index.js
意味着被黑/伪造的node.exe
需要首先解析package.json
文件(如果它甚至存在)以确定版本,然后执行真正的node.exe
用于适当的版本。
其他一些类似的项目已尝试使用.bat
文件来完成此操作。 这种方法是脆弱的,它违背了架构的主要目标。
我也不认为这方面的需求很普遍。
.nvmrc 支持是在 CI 系统中使用 NVM 的一个相当重要的方面。 我不链接 package.json 建议,特别是因为它破坏了与 nvm 的兼容性,但是会接受支持 .nvmrc 的拉取请求吗?
@gruber76 - 我可能不会接受关于这个的 PR。
.nvmrc
、 package.json
......它们都需要相同的讨厌的黑客。
@coreybutler我不确定我是否理解您不想支持这一点的理由。 每当 nvm 被调用而不指定版本号时,这个功能不会简单地回退到查看 .nvmrc 文件吗? 因此,你在谈论什么讨厌的黑客?
讨厌的黑客:重写 Windows 的符号链接。
NVM for Windows 的工作原理是将符号链接目标更改为所需的物理节点安装目录。 这是一个系统范围的变化。
假设您通过在.nvmrc
文件中指定版本 0.12.0 来启动脚本,然后启动没有.nvmrc
的第二个脚本。 符号链接将指向 v0.12.0(从第一个实例化开始)。 如果第二个脚本需要没有.nvmrc
其他东西(如 v4.2.6),它将失败。 这会在使用符号链接时引入环境不稳定,因为没有真正的进程隔离。
在每个进程的基础上真正隔离版本的唯一方法是将nvm.exe
重定向到脚本请求的版本,而不是允许操作系统执行此操作。 我真的不想重新创建操作系统已经为我们做的事情。
如果人们真的想使用每个进程/项目的方法,更合适的解决方案是隔离运行时环境。 就个人而言,我为此使用 Docker。
在这里原谅我的无知。 我的主要用例是使用 bower/grunt/gulp 等与多个团队一起开发节点/Web 应用程序。 对我来说,在五分钟内运行多个版本是非常罕见的。 对于这个用例,.nvmrc 文件是我的团队指定节点应该做什么的方式。
在您描述的情况(脚本 A 与脚本 B)中,我无法看到如何支持 .nvmrc 比让脚本 A(或脚本 A 的用户)调用 nvm 来设置版本然后忘记设置更麻烦它在运行脚本 B 之前。但我猜有一些 nvm 的常见用例比我的核心更难。 可能,例如,如果我的 CI 服务器负载更重。
我确实有一个hackey解决方法可以提供给需要它的任何其他人。 预运行 bat 脚本中的以下内容:
set /p nodev=<.nvmrc
nvm install %nodev%
nvm use %nodev%
为什么不在 npm 脚本中放置 nvm 命令来设置所需的版本?
史蒂夫·李
从我的移动设备发送 请原谅打字错误
2016 年 3 月 3 日 16:50,“gruber76”通知@github.com 写道:
在这里原谅我的无知。 我的主要用例是开发
多个团队使用 bower/grunt/gulp 等的 node/web 应用程序。 为了
我,我很少会在其中运行多个版本
彼此相隔五分钟。 对于这个用例,.nvmrc 文件是我的
团队指定节点应该做什么。我无法看到您描述的情况(脚本 A 与
脚本 B)如何支持 .nvmrc 会比拥有更麻烦
脚本 A(或脚本 A 的用户)调用 nvm 来设置版本,然后
在运行脚本 B 之前忘记设置它。但我猜有
nvm 的一些常见用例比我的核心更难。
可能,例如,如果我的 CI 服务器负载更重。我确实有一个hackey解决方法可以提供给需要它的任何其他人。 这
在预运行的 bat 脚本中执行以下操作:设置 /p nodev=<.nvmrc
nvm 安装 %nodev%
nvm 使用 %nodev%—
直接回复此邮件或在 GitHub 上查看
https://github.com/coreybutler/nvm-windows/issues/128#issuecomment -191852401
.
支持.nvmrc
文件会非常有帮助。 我们有很多项目,而且它们并不都运行相同版本的 node。 .nvmrc
文件位于每个 repo 的根目录,以确保给定项目使用正确版本的节点。
作为旁注, nvm install
后面必须跟有nvm use
也有点烦人。 我很想知道安装后需要第二步的原因。 我可以看到安装和使用是如何不同的,但我想知道是否有一个用例,有人会下载和安装,但不使用。
我们对此的解决方法是我们有一个名为install-node.js
,它位于每个项目的根目录。 每当我们切换到一个项目时,我们都会从命令行运行node install-node
。 install-node.js 文件的内容如下:
var childProcess = require('child_process')
var fs = require('fs')
var nodeVersion = fs.readFileSync('.nvmrc', 'utf8').trim()
var command = "nvm install " + nodeVersion + " && nvm use " + nodeVersion
console.log('executing command: ' + command)
childProcess.exec(command, function(error, stdout, stderr) {
if (stdout) console.log(stdout.toString())
if (stderr) console.error(stderr.toString())
if (error) console.error(error)
})
@josh-egan-ps - install
和use
之间的分离主要用于大规模环境配置。 我会经常在它们之间切换之前安装多个版本的节点。 然而; 有一个标志似乎是完全合理的,比如nvm install -u 5.9.1
来安装和自动使用...或者自动使用版本并有一个标志_不_使用它。 我肯定会考虑添加这个。
对于每个人 - 如果您确实需要在每个项目的基础上进行切换,请考虑将nvm use x.x.x && node index.js
放在 package.json 的 npm start 脚本部分。 一个常见的最佳实践是始终使用npm start
来启动节点应用程序。
对于每个人 - 如果您确实需要在每个项目的基础上进行切换,请考虑将 nvm use xxx && node index.js 放在 package.json 的 npm start 脚本部分。 一个常见的最佳实践是始终使用 npm start 来启动节点应用程序。
如果安装期间使用的任何 npm _build_ 脚本依赖于 node / npm 版本,这实际上可能为时已晚。 或者其他工具(例如 grunt 等)会显式运行它们可能会在安装过程中使用错误版本的 node / npm 失败。 或者使用错误的版本导致其他问题,顺便说一句,我假设在本地安装_everything_(即不是-g)的其他最佳实践,因此版本依赖性从来都不是问题。
因此,使用npm install
来设置每件事是一种很好的做法。 然后你可以添加一个预安装步骤来使用 nvm use。 例如添加
"preinstall": "nvm use x.x.x",
即使原始 npm 版本将在父进程中运行,这也应该没问题。 安装步骤将启动一个新的 shell,因此所有操作都应该选择新节点和 npm。
您甚至可能想要添加一个预启动步骤而不是安装。
@SteveALee - 是的,你说得对,我之前的建议行不通。 在此过程中要可靠地启动为时已晚。
@coreybutler最后我选择了这个
"preinstall":"nvm use 4.4.1 || echo nvm not found: check node version && pause",
也许nvm use -i x.x.x
选项会很好? 也就是说,如果还没有安装?
我想建议至少实现其中的一部分:
在 Linux / Mac 上,在存在.nvmrc
文件的文件夹中,我可以在不指定具体版本的情况下运行nvm use
,并且与.nvmrc
的内容匹配的已安装版本得到活性。 如果文件显示8
,则安装最新安装的 Node 8 版本。
我在我的系统上将它与一个重载cd
的脚本结合起来,这样我就可以将cd
放入一个目录并激活正确版本的节点,这个脚本在.bashrc
:
# Support .nvmrc
load-nvmrc() {
if [[ -f .nvmrc && -r .nvmrc ]]; then
nvm use
elif [[ $(nvm version) != $(nvm version default) ]]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
# Override `cd` to auto-load correct version of Node on enterting directory.
cd() { builtin cd "$@"; 'load-nvmrc'; }
如果nvm
尊重这些文件,这也可以很容易地在 Windows 上工作。
默认情况下不会实现 .nvmrc。 然而; 路线图有一个钩子支持计划(https://github.com/coreybutler/nvm-windows/issues/190)。 pre-use
脚本可用于根据他们想要的任何文件(包括 package.json、.nvmrc 或您选择的任何其他文件)调整版本。
由于这个问题似乎几乎已经死了,我有一个解决方法 Powershell 脚本,如果 .nvmrc 文件包含一位数节点版本,它应该模仿“nvm use”和“nvm install”的功能。
nvm install (Get-Content .nvmrc)
可以正常工作,但是nvm use (Get-Content .nvmrc)
不起作用(因为当一个数字版本被传递给安装时,它会安装该节点版本的最新版本,但nvm use
与单个数字附加 '.0.0' 而不是获取最新的。
@coreybutler如果您更新了install
相同的代码,则无需进行此修复(即):
if len(version) == 1 {
version = findLatestSubVersion(version)
} else {
version = cleanVersion(version)
}
以下脚本将使用“nvm list available”并过滤与 .nvmrc 文件版本匹配的最高 LTS 版本的列表,然后“nvm use”它。 如果它没有安装,它'nvm install's it 然后'nvm use'它。
((nvm use (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc)) + '.*'})[0].split('|')[2].trim()) -like '*not installed*') -and (nvm install (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc) + '.*') })[0].split('|')[2]) -and (nvm use (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc) + '.*') })[0].split('|')[2].trim())
只是想请求 nvm use 的支持来读取 .nvmrc 文件。 这真的会让我在 Mac 和 Windows 之间的节点开发体验变得无缝。
这是因为它已修复或不会更改而关闭吗?
是否有另一个 Windows 兼容版本的nvm
使用与 *nix 版本相同的 API?
最有用的评论
.nvmrc 支持是在 CI 系统中使用 NVM 的一个相当重要的方面。 我不链接 package.json 建议,特别是因为它破坏了与 nvm 的兼容性,但是会接受支持 .nvmrc 的拉取请求吗?