我正在尝试创建一个能够使用npm install -g mymodulename
全局安装的节点模块。如果我在模块的目录中运行node index.js
,我已经让模块中的所有内容工作正常,但是现在我想这样做以便我可以将它发布到NPM,它可以从任何地方安装和运行。目录
我的模块中有一些代码可以查看运行它的目录中的某些文件。我发现当我执行npm install -g ./
然后进入另一个目录进行测试时,然后运行my-module-command
,它正在读取的相对路径来自我的模块安装位置(即/usr/local/bin/my-module
),而不是我正在运行它的目录。
我的全局安装模块如何知道它的运行位置?举个例子,我正在尝试阅读我所在目录中的package.json
文件。它正在阅读package.json
的{{1}}文件
我试过了:
/usr/local/bin/my-module/package.json
直接直接致电__dirname
process.args[1]
process.cwd()
,但这些都没有。
在这里编辑一些在require('./package.json')
中打破的代码:
index.js
在我的#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var currentDir = path.dirname(require.main.filename);
fs.exists(`${currentDir}/node_modules`, function(dir) {
if (!dir) throw 'node_modules does not exist';
// do stuff
});
:
package.json
我尝试在项目目录中执行...
"bin": {
"my-module": "./index.js"
},
...
,然后我进入另一个名为npm install -g ./
的目录,其中另一个npm项目是,并运行/Users/me/Projects/different-project
,我得到{ {1}}。当我退出my-module
时,我得到的node_modules does not exist
我希望看到的是currentDir
。
答案 0 :(得分:0)
您是否尝试在文件路径的开头使用 ./
?这应该会给你当前的工作目录(或者调用 process.cwd()
也可以)。
在您的情况下,您的代码如下所示:
fs.exists(`./node_modules`, function(dir) {
if (!dir) throw 'node_modules does not exist';
// do stuff
});
我可以看到一些评论已经提到了这一点。也许我误解了这个问题?我刚刚遇到一个案例,我需要一个全局模块来获取我正在运行脚本的目录,而我上面的建议非常有效。