Лучшие практики для включения проектов в проект Nodeclipse
У меня есть проект Nodeclipse x, который можно рассматривать как библиотеку в форме файлов JavaScript. У него есть корневая папка: 'r'. В этой папке есть файл index.js.
Типичный модуль, использующий x, начинается с: var r = require('r');.
Это хорошо работает при запуске Node.js из строки cmd, просто добавляя полный путь к 'r' в NODE_PATH.
Теперь в другом проекте Nodeclipse y я добавляю проект x в качестве ссылки на вкладке "projects" в свойствах "Включить путь".
Я ожидаю, что Nodeclipse сделает волшебство, добавив исходные папки x к путям включения y при запуске проекта. Если нет, какой смысл добавлять проект?
Однако при нажатии: var r = require ('r'); Node.js жалуется, что не может найти 'r'. Войдя в исходный код для 'require', очевидно, что ни один из исходных путей проекта 'x' не был добавлен к пути include.
Что мне не хватает?
2 ответа
Для чего это стоит, я нашел решение. Моя структура проекта состоит из 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;
}
На самом деле это общий вопрос Node.js, и я только что добавил node.js
тег.
Короче говоря, вы должны сделать это Node.js, а не Eclipse.
Теперь в другом проекте Nodeclipse y я добавляю проект x в качестве ссылки на вкладке "projects" в свойствах "Включить путь".
Это то, к чему вы привыкли использовать Eclipse JDT для Java.
Для Node.js он также должен работать без какой-либо IDE:
- Использовать конкретное состояние проекта Y
из проекта х до
npm install . -g
тогда в проекте у
npm install x --save
- Использовать последний проект Y
Другой способ это require(path/to/project_x)
или в проекте у
npm link path/to/project_x
Просто изучите Node.js, Eclipse и, конечно, Nodeclipse:)
Плагины Nodeclipse "Enide Studio 2014" имеют встроенный терминал: