1

我有一个 Nodeclipse 项目 x,可以认为是一个库,以 javascript 文件的形式。它有一个根文件夹:'r'。此文件夹有一个“index.js”文件。

使用 x 的典型模块以:var r = require('r'); 开头。

这在从 cmd 行运行 Node.js 时效果很好,只需将 'r' 的完整路径添加到 NODE_PATH。

现在在另一个 Nodeclipse 项目 y 中,我将项目 x 添加为“包含路径”属性的“项目”选项卡中的引用。

我期望 Nodeclipse 在运行项目时能够神奇地将 x 的源文件夹添加到 y 的包含路径中。如果不是,添加项目有什么用?

但是,当点击:var r = require('r'); 时,Node.js 抱怨它找不到 'r'。进入“require”的源代码,很明显项目“x”的源路径都没有添加到包含路径中。

我错过了什么?

4

2 回答 2

0

对于它的价值,我找到了解决方案。我的项目结构由 3 个根文件夹组成: - 生成 - 主 - 测试位于文件夹“src”下的所有文件夹。

我创建了一个脚本:exploded.js,它位于 src 文件夹中。我所有的测试脚本都以:“require('../../exploded') (# of ../ 取决于深度) 这个脚本覆盖 Module._resolveLookupPaths 并在主路径和生成的相应路径中丰富候选路径列表文件夹。

埃里克

Exploded.js 代码(没找到上传的方法):

var path = require("path");
var root = path.dirname(module.filename);
var fs = require("fs");

function readSubDirs() {
    var _children = fs.readdirSync(root);
    var children = [];
    for(var i=0;i<_children.length;i++) {
        var _child = _children[i];
        if(_child!=="node_modules") {
            if(_child.indexOf(".")!==0) {
                var _path = root + path.sep + _child;
                var _isdir = fs.lstatSync(_path).isDirectory();
                if( _isdir )  {
                    children.push(_child);
                }
            }
        }
    }
    return children;
}
var children = readSubDirs();

var m = require("module").Module;
var old_resolveLookupPaths = m._resolveLookupPaths;

function new_resolveLookupPaths(request, parent) {
    var resolved = old_resolveLookupPaths(request, parent);
    var start = request.substring(0, 2);
    if (start === './' || start === '..') {
        // is the calling module in the same hierarchy as this?
        if(parent.filename.search(root)===0) {
            var dirpath = path.dirname(parent.filename);
            var subpath = dirpath.substring(root.length+1);
            var idx = subpath.indexOf(path.sep);
            var folder = subpath.substring(0, idx);
            subpath = subpath.substring(idx);
            var paths = resolved[1];
            var more = [];
            for(var i=0;i<paths.length;i++) {
                var _path = paths[i];
                if(_path.indexOf(root)===0) {
                    if(_path.indexOf(subpath)>root.length) {
                        for(var j=0;j<children.length;j++) {
                            var _child = children[j];
                            if( _child!==folder) {
                                var _fullpath = root + path.sep + _child + subpath;
                                var _exists = fs.existsSync(_fullpath);
                                if(_exists) {
                                    var _isdir = fs.lstatSync(_fullpath).isDirectory();
                                    if( _isdir )  {                             
                                        more.push(_fullpath);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            resolved[1] = paths.concat(more);
        }
    }
    return resolved;
}

if(m._resolveLookupPaths !== new_resolveLookupPaths) {
    m._resolveLookupPaths = new_resolveLookupPaths;
}  
于 2014-11-30T09:01:46.183 回答
0

这实际上是 Node.js 的一般问题,我只是添加了node.js标签。

简而言之,您应该使用 Node.js 方式,而不是 Eclipse 方式。

现在在另一个 Nodeclipse 项目 y 中,我将项目 x 添加为“包含路径”属性的“项目”选项卡中的引用。

这就是您习惯使用 Eclipse JDT for Java 的原因。
对于 Node.js,它也应该在没有任何 IDE 的情况下工作:

  • 使用项目 Y 的特定状态

从项目 x 做

npm install . -g

然后在项目 y

npm install x --save
  • 使用最新的项目 Y

其他方式require(path/to/project_x)

或在项目 y

npm link path/to/project_x

只需学习 Node.js、Eclipse,当然还有Nodeclipse :)

Nodeclipse“Enide Studio 2014”插件集成了终端:

于 2014-11-27T02:36:40.977 回答