CNode

如何在包里 获取引用用这个包的文件的 路径?

问答
Hhuyinghuan发布于11 年前最后回复11 年前6 回复5239 浏览0 收藏

比如这里有个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)

A
alsotang#1·11 年前

试试这个变量 __dirname 和这个 __filename

H
huyinghuan#2·11 年前
引用 alsotang试试这个变量 dirname 和这个 filename

@alsotang __dirname 和 __filename 是获取当前执行文件的目录和 文件名, 我需要的是 在包里面知道是那个文件引用的这个包, 比如 test.js 引用了test包,那么test.say() 打印的就是test.js的文件路径。如果是 a.js引用了test包,那么test.say() 打印的就是a.js的文件路径

H
huyinghuan#3·11 年前

其实有个非常不友好的实现方式是通过打印new一个Error的错误堆栈 来 逐层解析 引用关系。 但是这个东西非常不优雅

J
jysperm#4·11 年前

思路一:

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

J
jysperm#5·11 年前

补一下示例(没测试):(require 'stack-trace').get()[1].getFileName()

A
alsotang#6·11 年前
引用 jysperm思路一: module.parent.filename, 但只能获取到第一个 require 这个包的文件,因为 Node 会在第一次 require 一个包的时候将其缓存。 http://n...

@jysperm 包引用的缓存是可以手动清除的。所以思路一来做的话,可以使其不受缓存影响。

参与回复
登录后即可参与回复。登录