Nvm-windows: 支持.nvmrc

创建于 2016-01-08  ·  18评论  ·  资料来源: coreybutler/nvm-windows

允许项目指定要使用的版本。
查看nvm 用法

或者从package.json 引擎解析壁橱可用版本

enhancement request wontfix

最有用的评论

.nvmrc 支持是在 CI 系统中使用 NVM 的一个相当重要的方面。 我不链接 package.json 建议,特别是因为它破坏了与 nvm 的兼容性,但是会接受支持 .nvmrc 的拉取请求吗?

所有18条评论

我不认为这是我想走的路。 主要原因是它需要一些非常丑陋的黑客来重新创建/模仿节点二进制文件。 例如,调用node index.js意味着被黑/伪造的node.exe需要首先解析package.json文件(如果它甚至存在)以确定版本,然后执行真正的node.exe用于适当的版本。

其他一些类似的项目已尝试使用.bat文件来完成此操作。 这种方法是脆弱的,它违背了架构的主要目标

我也不认为这方面的需求很普遍。

.nvmrc 支持是在 CI 系统中使用 NVM 的一个相当重要的方面。 我不链接 package.json 建议,特别是因为它破坏了与 nvm 的兼容性,但是会接受支持 .nvmrc 的拉取请求吗?

@gruber76 - 我可能不会接受关于这个的 PR。

.nvmrcpackage.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 - installuse之间的分离主要用于大规模环境配置。 我会经常在它们之间切换之前安装多个版本的节点。 然而; 有一个标志似乎是完全合理的,比如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?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

flpms picture flpms  ·  4评论

thany picture thany  ·  4评论

janpio picture janpio  ·  3评论

David263 picture David263  ·  3评论

SufyanParkar picture SufyanParkar  ·  4评论