如何为项目指定本地版本的Node?

sen*_*nel 4 javascript dependencies node.js npm

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

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

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$
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?!

小智 19

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

因此,在您有问题的目录中运行:

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

然后,将脚本放入您package.json的如下:

"scripts": {
  "v": "node -v"
}
Run Code Online (Sandbox Code Playgroud)

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

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

注意:将节点引擎设置为建议 - “此字段仅供参考,仅在您的软件包作为依赖项安装时才会产生警告。”


Cir*_*四事件 13

NVM + .nvmrc

如果您像这样使用 NVM(您可能应该这样做),那么您可以在 git-tracked.nvmrc文件中指明给定项目所需的 nodejs 版本:

node --version > .nvmrc
Run Code Online (Sandbox Code Playgroud)

或者:

echo v10.15.1 > .nvmrc
Run Code Online (Sandbox Code Playgroud)

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

nvm use
Run Code Online (Sandbox Code Playgroud)

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

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

nvm list
Run Code Online (Sandbox Code Playgroud)

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

使用 NVM 0.33.11 进行测试。


Ton*_*gan 6

对于这个问题我有两个解决方案......

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

视窗:

Mac/Linux:

Soln #2:使用 Docker 映像在具有您选择的 Node 版本的 Linux VM 上运行开发代码。您的开发人员现在都获得了相同的开发环境,有望与您的最终部署环境相匹配。

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

最后,您还可以利用 Docker 进行CI 测试

参考文献:


msc*_*dex 5

我相信engineengineStrict适用于安装软件包(通过npm)的时间,而不是用于尝试使用node 执行某些操作的时间。这些选项警告/阻止用户安装并非旨在与其当前使用的节点版本兼容(或兼容)的软件包。

  • 实际上,这似乎是合理的。我只是挖了npm,然后发现`npm install`将严格标志传递到对“ npm-install-checks”的链接调用中(https://github.com/npm/npm/blob/master/lib /install.js:858)。如您在npm-install-checks(https://github.com/npm/npm-install-checks/blob/master/index.js:12)中所见,进行了检查以查看模块是否可以在严格指定的引擎。这样就可以了-当然不是我所期望的。感谢您指出我的方向! (2认同)