我想制作一个宏,在编译时验证其他项目中资源的存在。是否可以从上下文中获取此信息?
def example_impl(c: Context): c.Expr[Unit] = {
import c.universe._
//instead of
// val r = this.getClass().getResource("/file.txt")
val r = c.somthing.getResource("/file.txt")
//...
}
这也许是不可能的。但如果是的话,我想知道该怎么做。
最佳答案
我们首先考虑什么是“资源”。资源是可以从类路径中的目录开始找到的文件。请注意,为此目的,jar 文件是一个目录,因为它存储 zip 文件系统。类路径是运行 Java 时可用的环境信息。
还有一个根本问题:Scala 编译器不知道这些资源在哪里!它接收要编译的源文件,可能是目标目录,并且它有自己的类路径,但它们与运行 scalac 相关,而不是与 scalac 正在编译的代码相关。
“生成”资源的不是编译器——scalac 和 javac 都不是。它是其他工具,例如 jar
(命令行工具),通常由其他工具调用,例如构建系统(ant、maven、sbt)。
因此,没有关于在哪里可以找到这些资源的信息——它们通常位于与源代码不同的目录中。您可以使用普通的 Scala 文件 i/o 支持来遍历目录等,但在编译时没有可用的“资源源”信息。
关于scala - 从 scala 宏的上下文中获取资源路径文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20510461/