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
.
我正在部署一个 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
.