如何在包里 获取引用用这个包的文件的 路径?
发布于 11 年前 作者 huyinghuan 5090 次预览 最后一次回复是 11 年前 来自 问答
比如这里有个npm package test 它的主函数是 lib/index.js
exports.say = ->
console.log("依赖引用我的文件是??")
//怎么获取? process.cwd()肯定是不行的, 因为引用这个包的文件不一定是 入口函数。
这里有个demo.coffee, 引用了 test包,并且调用了它的say 方法
test = require 'test'
test.say()
在say函数里面是否可以获取的到demo.coffee的文件路径? 则个demo.coffee不是入口函数。
6 回复
试试这个变量
__dirname和这个__filename@alsotang __dirname 和 __filename 是获取当前执行文件的目录和 文件名, 我需要的是 在包里面知道是那个文件引用的这个包, 比如 test.js 引用了test包,那么test.say() 打印的就是test.js的文件路径。如果是 a.js引用了test包,那么test.say() 打印的就是a.js的文件路径
其实有个非常不友好的实现方式是通过打印new一个Error的错误堆栈 来 逐层解析 引用关系。 但是这个东西非常不优雅
思路一:
module.parent.filename, 但只能获取到第一个 require 这个包的文件,因为 Node 会在第一次 require 一个包的时候将其缓存。 http://nodejs.org/api/modules.html#modules_module_parent http://nodejs.org/api/modules.html#modules_module_filename思路二:
从调用栈中获取上一层调用的文件,我用过
stack-trace这个包,还算好用。 https://github.com/felixge/node-stack-trace补一下示例(没测试):
(require 'stack-trace').get()[1].getFileName()@jysperm 包引用的缓存是可以手动清除的。所以思路一来做的话,可以使其不受缓存影响。