VSCode Scala项目Metals智能提示报错 代码可通过Mill正常编译运行
问题解决:Metals提示
object pwd is not a member of package foo.os bloop 问题根因
该报错是包作用域隐式冲突导致的:你当前的代码位于foo包下,直接调用os.pwd时,Scala语义检查会优先在当前foo包路径下查找os对象,也就是尝试匹配foo.os路径,由于不存在该路径就会抛出上述错误。Mill可以正常编译是因为Mill的编译链路对顶级依赖包的匹配优先级更高,和Metals底层依赖的Bloop编译服务器的解析规则存在差异,所以出现了编译运行正常但智能提示报错的不一致现象。
你当前的build.sc依赖配置是正确的,不需要调整依赖项。
解决方案
按优先级从高到低尝试以下操作即可解决:
- 方案1:显式指定顶级包导入os-lib
在代码的package foo行后添加显式导入,强制从顶级依赖中匹配os包,修改后的main.scala如下:
也可以直接在调用处指定顶级包://main.scala package foo import _root_.os object Exercise{ def main(args: Array[String]): Unit = { println(os.pwd) } }println(_root_.os.pwd) - 方案2:提前导入os-lib的所有成员
直接导入os包下的所有成员后可直接调用pwd,无需加前缀,修改后的代码如下://main.scala package foo import os._ object Exercise{ def main(args: Array[String]): Unit = { println(pwd) } } - 方案3:重置Metals构建缓存
如果修改代码后报错仍存在,按Ctrl+Shift+P(Mac为Cmd+Shift+P)调出VSCode命令面板,依次执行:Metals: Restart build serverMetals: Import build
等待Metals重新索引项目依赖后,报错提示就会消失。
内容的提问来源于stack exchange,提问作者usermine12
相关产品推荐
相关产品推荐

