什么可能导致链接错误在 fastOptJS 中消失?
What might cause linking errors that disappear on clean in fastOptJS?
经常 ./sbt fastOptJS
向我抛出一个链接错误,Referring to non-existent method...
,如果我 运行 ./sbt clean
然后再次 ./sbt fastOptJS
,它就会消失。
我想知道,这可能是什么原因造成的?这可能是 build.sbt
配置错误的问题吗?常见的编码风格陷阱?
根据我的经验,这通常是由于增量编译器没有根据某些更改重新编译足够的源代码造成的。我看到的一个特殊问题是方法签名更改,其中只有推断的 return 类型更改导致此问题,例如更改时:
def x(a: Int, b: Double) = a
到
def x(a: Int, b: Double) = b
如果是这种情况,使用显式 return 类型通常会有所帮助:
def x(a: Int, b: Double): Double = a
(实际上需要更复杂的代码才能触发该问题。)
对我来说,这在 Scala JS 和 Scala JVM 中都会发生。在 Scala JVM 中,它通常不是在链接期间显示,而是在执行期间显示,抛出异常 NoSuchMethodError
。
虽然我已经接受了另一个答案,但我添加这个答案是希望它对前来搜索的其他人有用。
https://github.com/sbt/zinc/issues/249
Zinc对Macros的支持并不完善,有时Macro的定义会改变,但有些使用了Macro的文件没有,所以编译后的代码也没有改变,导致最后一步函数缺失。
经常 ./sbt fastOptJS
向我抛出一个链接错误,Referring to non-existent method...
,如果我 运行 ./sbt clean
然后再次 ./sbt fastOptJS
,它就会消失。
我想知道,这可能是什么原因造成的?这可能是 build.sbt
配置错误的问题吗?常见的编码风格陷阱?
根据我的经验,这通常是由于增量编译器没有根据某些更改重新编译足够的源代码造成的。我看到的一个特殊问题是方法签名更改,其中只有推断的 return 类型更改导致此问题,例如更改时:
def x(a: Int, b: Double) = a
到
def x(a: Int, b: Double) = b
如果是这种情况,使用显式 return 类型通常会有所帮助:
def x(a: Int, b: Double): Double = a
(实际上需要更复杂的代码才能触发该问题。)
对我来说,这在 Scala JS 和 Scala JVM 中都会发生。在 Scala JVM 中,它通常不是在链接期间显示,而是在执行期间显示,抛出异常 NoSuchMethodError
。
虽然我已经接受了另一个答案,但我添加这个答案是希望它对前来搜索的其他人有用。
https://github.com/sbt/zinc/issues/249
Zinc对Macros的支持并不完善,有时Macro的定义会改变,但有些使用了Macro的文件没有,所以编译后的代码也没有改变,导致最后一步函数缺失。