我可以从全局安装的软件包中访问本地安装的软件包吗?

时间:2014-01-03 15:37:54

标签: node.js package npm

我不知道我是否正确地提出了这个问题,所以如果从标题中不清楚我的意思,我会道歉。

假设我有一个安装可执行文件的NPM软件包。据推测,我希望用户使用-g标志安装此软件包,以便他们可以在任何时候运行它。

在这种情况下,当我从可执行文件中调用require()时,它将查找全局安装的软件包。

但是假设这个包为Node项目提供了通用功能。我可能想知道当前项目已安装本地的软件包。我应该假设:

path.join(process.cwd(), 'node_modules')

或者在这种情况下是否有更“正确”的方法来设置NODE_PATH? (或者不是设置NODE_PATH,我应该require(absolute_path_to_file)吗?)

1 个答案:

答案 0 :(得分:1)

require不仅会查找$(CWD)\node_modules内的包,还会查找父级,祖父级等所有node_modules内的包。因此,您可以在npm上使用resolve来解决此问题问题

FILE:your_global_command.js

// npm install resolve
var resolve = require('resolve').sync;

// Lookup for local module at current working dir
function require_cwd(name) {
    var absolute_path = resolve(name, { basedir: process.cwd() });
    return require(absolute_path);
}

// Load local express
// this will throw an error when express is not found as local module
var express = require_cwd('express');

我还创建了一个包,要求在current-working-dir(而不是模块的__dirname)中使用一个包: https://npmjs.org/package/require-cwd