?

Log in

No account? Create an account

Previous Entry | Next Entry

require.paths这个全局变量直接影响到了module的加载时的查找路径,但是我发现nodejs(我的是0.4.7)在Windows平台上是有缺陷的。

缺陷的地方如下:

module.js中的源代码:

Module._initPaths = function() {
var paths = [path.resolve(process.execPath, '..', '..', 'lib', 'node')];

if (process.env['HOME']) {
paths.unshift(path.resolve(process.env['HOME'], '.node_libraries'));
paths.unshift(path.resolve(process.env['HOME'], '.node_modules'));
}

if (process.env['NODE_PATH']) {
paths = process.env['NODE_PATH'].split(':').concat(paths);
}

Module._paths = paths;
};

其中的第一句process.execPath和后面的NODE_PATH都有问题。

1)在代码platform_win32.cc中函数GetExecutablePath未真正实现。这样就造成了在node中执行process.execPath时总是返回argv[0],也就是node(或者node.exe). 从而造成path.resolve不正确。

2)NODE_PATH这个系统环境变量的路径分割方式有缺陷,都是按照×NIX平台上的“:"来分割的。在Windows下应该是”;“, 否则盘符会有问题。

由于问题1造成node.exe根本无法认出自己所在的目录,所以也就无法加路径lib\node到路径中,同时由于问题2,又无法设置NODE_PATH,这样就造成只有把lib放到HOME中的指定folder或者放到单独的project下面了。

这两处的修改方法很简单。

1)platform_win32.cc
int Platform::GetExecutablePath(char* buffer, size_t* size) {
*size=GetModuleFileName(NULL,buffer,*size);

if (*size==0) return -1;

return 0;
{

(很多年没写过C了,如果写错了,大家请指出。)

2)module.js.
if (process.env['NODE_PATH']) {
if (process.platform=='win32'){
paths = process.env['NODE_PATH'].split(';').concat(paths);
}else{
paths = process.env['NODE_PATH'].split(':').concat(paths);
}
}

Tags:

Latest Month

September 2011
S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 
Powered by LiveJournal.com
Designed by Akiko Kurono