【问题标题】:How do I specify a local version of Node for a project?如何为项目指定本地版本的 Node?
【发布时间】:2014-09-12 05:53:19
【问题描述】:

我有一个项目,我们试图让 Node 启动并在多个开发人员的机器上运行。问题在于,并非所有开发人员都是 Node(甚至是 JavaScript)开发人员,我们希望确保他们拥有运行特定项目所需的 Node 版本(开发人员将在他们的机器上拥有多个 Node 项目)。

我阅读了有关 package.json 的“engines”字段的信息,但我似乎找不到任何方法来安装我需要的 Node 版本。为了测试,我通过 NVM 将我当前的节点版本设置为 v0.10.29,创建了一个 package.json 指定 v0.11.13 的必要引擎,并尝试通过node 命令以及通过 package.json- 启动 Node定义npm start 命令。

blackjack:node-engines-test sent1nel$ node -v
v0.10.29
blackjack:node-engines-test sent1nel$ cat package.json
{
  "name": "node-engines-test",
  "version": "0.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "engineStrict": true,
  "engines": {
    "node": "v0.11.13"
  },
  "start": "node index.js",
  "author": "",
  "license": "ISC"
}
blackjack:node-engines-test sent1nel$ cat index.js
console.log('Version: ' + process.version);
blackjack:node-engines-test sent1nel$ node index.js
Version: v0.10.29
blackjack:node-engines-test sent1nel$ npm start
blackjack:node-engines-test sent1nel$

npm install 似乎也不关心节点引擎版本。

blackjack:node-engines-test sent1nel$ npm install
npm WARN package.json node-engines-test@0.0.0 No description
npm WARN package.json node-engines-test@0.0.0 No repository field.
npm WARN package.json node-engines-test@0.0.0 No README data
blackjack:node-engines-test sent1nel$ node -v
v0.10.29

什么给了?!

【问题讨论】:

  • 您从哪里读到指定engines 安装、需要或使用特定的节点版本?我很确定它所做的一切都提供了有关预期节点版本的信息 - npmjs.org/doc/package.json.html#engines 。如果你想强制一个版本(无论出于何种原因),你可以使用engineStrict - npmjs.org/doc/package.json.html#engineStrict
  • 正如您在上面的package.json 中看到的,我实际上确实设置了engineStrict 标志。我假设会发生的是,设置该标志将安装或提供一个警告,表明错误的 Node 版本处于活动状态,正如您从日志中看到的那样,这不会发生。
  • 如果您使用的是 NVM,那么您需要将每个人的机器设置为相同的版本。我能想到的最简单的方法是编写一个可以完成所有工作的 shell 脚本。
  • 我正在使用nvm - 我只是想确保显示警告,因此如果开发人员需要运行nvm install vx.y.z,他们知道该怎么做。如果什么都不存在,我有代码要写。
  • 很公平,谢谢(如果 engineStrict 标志在功能上无用,wtf 就是它的重点?)

标签: javascript node.js dependencies npm


【解决方案1】:

NVM + .nvmrc

如果您是 using NVM like this,您可能应该这样做,那么您可以在 git 跟踪的 .nvmrc 文件中指明给定项目所需的 nodejs 版本:

node --version > .nvmrc

或:

echo v10.15.1 > .nvmrc

这不会在cd 上自动生效,这是正常的:用户必须执行以下操作:

nvm use

现在该版本的节点将用于当前 shell。

您可以列出您拥有的节点版本:

nvm list

.nvmrc 记录在:https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

使用 NVM 0.33.11 测试。

Heroku 确实尊重 package.json engines:

值得一提的是,作为documented here,Heroku 确实玩得很好,并遵守engines: 条目,例如:

  "engines": {
    "node": "14.17.0",
    "npm": "6.14.13"
  },

所以您应该 Always, Always 将其设置为您在本地使用的内容。

【讨论】:

  • 节点版本在shell会话中不是持久的,每次我需要运行nvm use
【解决方案2】:

npm 注册表包含一个名为“node”的包。它是一个常规的 npm 包,仅包含 Node.js 二进制文件。

所以,在你有问题的目录中运行:

npm install node@your.desired.version --save-exact

然后,在您的package.json 中添加一个脚本,如下所示:

"scripts": {
  "v": "node -v"
}

要验证,请在项目根目录的终端中运行node -v,您应该会看到您在计算机上设置的版本。通过运行npm run v 进行比较,您应该会看到您为项目设置的版本。这样,您可以在不更改全局节点配置的情况下无缝移动文件系统并执行各种构建。

原则上,每个带有 npm 包的可执行文件都链接到项目中的本地二进制目录。这意味着当我们安装这样的包时,我们可以在里面找到它的可执行文件的链接。

注意:设置节点engine 建议 - “此字段仅供参考,仅当您的包作为依赖项安装时才会产生警告。” p>

【讨论】:

    【解决方案3】:

    我相信enginesengineStrict 是在软件包安装(通过npm)时使用的,而不是在您尝试执行某些东西时使用与节点。这些选项警告/防止用户安装不适合(或兼容)他们当前使用的节点版本的包。

    【讨论】:

    【解决方案4】:

    我有两个解决这个问题的办法......

    Soln #1:使用节点版本管理器,可以下载和安装特定版本的 Node 和 NPM(以及适用于 Windows 的 x86/x64 架构),然后允许开发人员切换版本。

    窗户:

    Mac/Linux:

    解决方案 #2:使用 Docker 映像在具有所选节点版本的 Linux VM 上运行开发代码。您的开发人员现在都获得了一个相同的开发环境,有望与您的最终部署环境相匹配。

    This example 向您展示如何 Dockerize 您的 Web 应用程序以进行部署。在开发过程中,您想替换 COPY . /src 命令使用卷从主机文件系统挂载代码,以避免在更新代码时进行映像重建。一个技巧是创建基础镜像,然后派生开发(./src 是一个卷)和部署(复制 ./src)镜像。

    最后你也可以利用 Docker 来做你的CI testing

    参考:

    【讨论】:

    • 啊,我应该提到过去一年我一直在使用 NVM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2016-09-04
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多