如何跨磁盘分区要求节点模块?
How can I require node modules across disk partitions?
- Node.js 版本: 14.15.0
- OS: Raspbian
- 范围(安装、代码、运行时间、元、其他?):要求
我 运行 在 Raspberry Pi 上有一个 Node 程序 4. 我最近开始使用一个名为 Mender 的 OTA 部署系统来将更新推送到我在远程 RPis 上的代码。 Mender 创建了一个分区系统,该系统使用两个 3.5GB 分区,一个作为主要分区,另一个作为部署失败时的回滚分区。它有一个第 3 个分区 /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_PATH
环境变量来代替符号链接。
引用 the NodeJS documentation
: "NODE_PATH 最初创建是为了支持在定义当前模块解析算法之前从不同路径加载模块。"
NODE_PATH
仍然受支持,并且可以完全适合您的用例 IMO。如果需要,请不要忘记修复文件权限(使用 chmod
和 chown
)。
例如:
export NODE_PATH="/data/node_modules"
node <your script>
此外,你可以要求npm或yarn在这个目录下安装模块。
用纱线:
yarn install --modules-folder /data/node_modules
与 npm:
mkdir -p /data/node_modules
npm install --prefix /data
可能的相关问题:
- Specify path to node_modules in package.json
- How to npm install to a specified directory?
这是基本结构
-|- 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_modules
是 data/node_modules
的镜像
这非常方便,因为您甚至可以从网络挂载文件,如果您希望它在重新启动后永久存在,您可以在 /etc/fstab
.
中添加一个条目
- Node.js 版本: 14.15.0
- OS: Raspbian
- 范围(安装、代码、运行时间、元、其他?):要求
我 运行 在 Raspberry Pi 上有一个 Node 程序 4. 我最近开始使用一个名为 Mender 的 OTA 部署系统来将更新推送到我在远程 RPis 上的代码。 Mender 创建了一个分区系统,该系统使用两个 3.5GB 分区,一个作为主要分区,另一个作为部署失败时的回滚分区。它有一个第 3 个分区 /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_PATH
环境变量来代替符号链接。
引用 the NodeJS documentation
: "NODE_PATH 最初创建是为了支持在定义当前模块解析算法之前从不同路径加载模块。"
NODE_PATH
仍然受支持,并且可以完全适合您的用例 IMO。如果需要,请不要忘记修复文件权限(使用 chmod
和 chown
)。
例如:
export NODE_PATH="/data/node_modules"
node <your script>
此外,你可以要求npm或yarn在这个目录下安装模块。
用纱线:
yarn install --modules-folder /data/node_modules
与 npm:
mkdir -p /data/node_modules
npm install --prefix /data
可能的相关问题:
- Specify path to node_modules in package.json
- How to npm install to a specified directory?
这是基本结构
-|- 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_modules
是 data/node_modules
的镜像
这非常方便,因为您甚至可以从网络挂载文件,如果您希望它在重新启动后永久存在,您可以在 /etc/fstab
.