【问题标题】:How can I require node modules across disk partitions?如何跨磁盘分区要求节点模块?
【发布时间】:2021-04-01 16:13:52
【问题描述】:
  • Node.js 版本:14.15.0
  • 操作系统:Raspbian
  • 范围(安装、代码、运行时、元、其他?):需要

我有一个在 Raspberry Pi 4 上运行的 Node 程序。我最近开始使用名为 Mender 的 OTA 部署系统来将更新推送到远程 RPis 上的代码。 Mender 创建了一个使用两个 3.5GB 分区的分区系统,一个作为主分区,另一个作为部署失败时的回滚。它还有第三个分区/data,在我的情况下约为 20GB,用于在更新之间需要持久化的东西。

我无法将整个应用程序及其所有节点模块依赖项放入 3.5GB 分区。所以我将node_modules 目录移动到/data 分区并创建了一个指向我的项目目录(home/pi/myProject) 的符号链接。这适用于模块安装,但是当我尝试从我的项目中 require 一个已安装的模块时,会引发错误;

internal/modules/cjs/loader.js:883
  throw err;
  ^

Error: Cannot find module '@google-cloud/pubsub'
Require stack:
- /home/pi/myProject/pwrMngmnt.js
- /home/pi/myProject/[eval]
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (/myProject/pwrMngmnt.js:3:20)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/home/pi/myProject/pwrMngmnt.js',
    '/home/pi/myProject/[eval]'
  ]
}

我需要设置什么配置才能使其正常工作吗?

【问题讨论】:

    标签: node.js node-modules partition pnpm mender


    【解决方案1】:

    您可以指定NODE_PATH 环境变量,而不是进行符号链接。 引用the NodeJS documentation“NODE_PATH 最初是为了支持在当前模块解析算法定义之前从不同路径加载模块。”

    NODE_PATH 仍然受支持,并且可以完全适合您的 IMO 用例。如果需要,不要忘记修复文件权限(使用 chmodchown)。

    例如:

    export NODE_PATH="/data/node_modules"
    node <your script>
    

    此外,您可以要求 npmyarn 在此目录中安装模块。

    纱线

    yarn install --modules-folder /data/node_modules
    

    使用 npm

    mkdir -p /data/node_modules
    npm install --prefix /data
    

    可能的相关问题:

    【讨论】:

    • 我之前尝试过,但并没有改变错误。你知道NODE_PATH 是否需要相对于我在home/pi/myProject 中的节点应用程序目录进行设置,其中homedata 是同级目录?还是按照您显示的正确设置绝对路径?
    • 我用绝对路径做了一个快速测试,效果很好。我使用“npm install --prefix /tmp/node_test”和“NODE_PATH=/tmp/node_test/node_modules”进行了测试。如果没有 NODE_PATH,我会收到“MODULE_NOT_FOUND”错误。使用 NODE_PATH,我没有任何问题。
    • 酷。我刚刚在阅读this,了解如何在 Raspbian 上设置全局环境变量。接受的答案建议将文件添加到设置变量的profile.d。您知道从 Raspbian 或 Node 的角度来看,您命名文件是否重要?
    • 嗯,你的问题对我来说不是很清楚。这取决于您如何启动节点脚本/守护进程。你是从你的 tty 开始的吗?来自初始化脚本(例如 systemd)?从另一个工具?我建议阅读以下文档:help.ubuntu.com/community/EnvironmentVariables 请注意它是 Ubuntu 文档。 Raspbian 上的一些机制可能会有所不同。我还看到了这个 Debian wiki 页面:wiki.debian.org/EnvironmentVariables ... 但它看起来很“旧”/“过时”。
    • 我需要程序在启动/重启时运行,所以我计划使用init.d 设置它,如here 所述
    【解决方案2】:

    这是基本结构

    -|- data
     |- myProject
    

    创建两个文件夹node_modules,一个在源,一个在目标

    mkdir myProject/node_modules
    mkdir data/node_modules
    sudo mount --bind data/node_modules/ myProject/node_modules/
    

    你现在应该有这样的东西

    -|- data -|- node_modules 
     |- myProject -|- node_modules
                   |- index.js
                   |- package.json   
    

    现在myProject/node_modulesdata/node_modules 的镜像 这非常方便,因为您甚至可以从网络挂载文件,如果您希望它在重新启动时永久存在,您可以在 /etc/fstab 中添加一个条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2015-01-05
      • 2011-01-09
      • 2014-06-14
      相关资源
      最近更新 更多