【发布时间】:2021-04-09 08:26:43
【问题描述】:
我正在尝试创建一个能够使用npm install -g mymodulename 全局安装的节点模块。如果我在模块目录中运行node index.js,模块中的所有内容都可以正常工作,但现在我想制作它以便可以将其发布到 NPM,并且可以从任何目录安装和运行它。
我的模块中有一些代码查看运行它的目录中的某些文件。我发现当我执行npm install -g ./ 然后进入另一个目录进行测试时,然后运行@987654325 @,它正在读取的相对路径来自我的模块安装位置(即/usr/local/bin/my-module),而不是我运行它的目录。
全局安装的模块如何知道它是从哪里运行的?举个例子,我正在尝试读取我所在目录中的package.json文件。它正在读取/usr/local/bin/my-module/package.json的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 ./,然后我 cd 进入另一个名为 /Users/me/Projects/different-project 的不同目录,另一个 npm 项目所在的目录,并运行 my-module,我得到 node_modules does not exist。当我注销currentDir 时,我得到/usr/local/lib/node_modules/my-module 我期望看到/Users/me/Projects/different-project。
【问题讨论】:
-
是的,这些方法没有权利按照你想要的方式工作,因为它们会找到你当前运行脚本的目录,也就是那个模块。你试过了:
var path = require('path'); var appDir = path.dirname(require.main.filename);?我认为这应该返回应用程序的入口点。 -
当我退出
appDir时,它显示的是/usr/local/lib/node_modules/my-module,而不是它正在执行的目录:/ -
process.cwd()应该可以工作。这是一个几乎与您正在尝试做的事情完全相同的示例(授予不同的文件名):github.com/TechnologyAdvice/DevLab/blob/master/src/… -
非常有帮助的问题,来自@Fluidbyte 的回答 - 我对你的另一个回答表示感谢 ;-)
标签: node.js npm npm-install