node.js 节点脚本中无法访问全局模块路径

node.js global modules path not accessible in node scripts

我正在部署一个 WordPress 站点,它有一堆自定义 mu-plugins 和自定义主题,它们都有 gulp 构建过程,并且都使用完全相同的 npm 包。因此,我想全局安装所有 npm 包,这样我就可以 运行 一个根级节点脚本,该脚本将依次 运行 每个 gulp 文件(主题和插件) 并构建所有的东西。仅使用节点 child_process.execSync() 到 运行 子 gulp 文件。

不幸的是,我的脚本似乎无法找到全局安装的 npm 包。我的 .bashrc 脚本定义了以下内容:

PATH="/usr/local/bin/npm-global/bin:$HOME/bin:$HOME/.local/bin:$PATH"
NODE_PATH="/usr/local/bin/npm-global/lib/node_modules:$NODE_PATH"
NPM_CONFIG_PREFIX=/usr/local/bin/npm-global/

如果我 运行 npg -g prefix 和 npm -g root 我得到以下信息:

$ npm -g prefix
/usr/local/bin/npm-global

$ npm -g root
/usr/local/bin/npm-global/lib/node_modules

但是,如果我 运行 我的节点脚本,我会收到类似 Error: Cannot find module 'glob'

的错误

如果我添加像

这样的东西,我可以让我的脚本工作

module.paths.push('/usr/local/bin/npm-global/lib/node_modules') 添加到我的主脚本中,但我还必须将其添加到每个 gulp 文件中。我还应该指出,如果我 运行 类似 child_process.execSync('npm -g root') 它输出 /usr/local/bin/npm-global/lib/node_modules

那么我怎样才能让我的所有脚本默认只使用全局安装的包呢?

您可以通过 setting the NODE_PATH environment variable 为系统上的所有项目共享一个公共 node_modules 目录。您的 .bashrc 正在设置该变量,但您 can/should 检查它是否已在脚本本身中设置。 (也许你 运行 它作为不同的用户或在不同的子 shell 中?也许你在 macOS 上并且最近切换到 zsh 并从不同的 rc 加载东西?也许缺少 export 在定义 NODE_PATH?)

的行的开头

最直接的故障排除方法是让您的脚本检查 process.env.NODE_PATH 的值。如果它为空或未设置,那是你的问题。

您还可以使用特定的 NODE_PATH 调用您的脚本,如下所示:NODE_PATH=/the/path/you/want node script.js.