如何在包里 获取引用用这个包的文件的 路径?
发布于 10 年前 作者 huyinghuan 4471 次浏览 最后一次编辑是 8 年前 来自 问答

比如这里有个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 包引用的缓存是可以手动清除的。所以思路一来做的话,可以使其不受缓存影响。

回到顶部