欢迎!请查看关于页面以获取更多有关如何使用本站的信息。
https://github.com/MichaelBlume/reify-fail
`(defprotocol Foo(hello [this] "Says hello"))
`
(def bar(reify Foo
(hello [this] "hello, world")))
(when-not (satisfies? Foo bar)(throw (Exception. "bar doesn't satisfy Foo"))) `
备注
项目是 AOT(Ahead-Of-Time 编译)另一个命名空间需要此命名空间。该命名空间首先被编译。如果没有那个命名空间,问题就消失了。
评论者:hiredman
在检出代码仓库后,您采取了哪些步骤来重现此问题?
我克隆了仓库并运行lein compile,但没有出错。
lein compile
评论者:michaelblume
我用lein check尝试重现这个问题,但是lein compile也失败了,所以我有点困惑。
lein check
我认为非常重要的一点是,接近空白的命名空间应该先编译,可能编译顺序的平台有差异?
在macOS和Ubuntu上测试代码仓库均失败,两个操作系统都使用了Java 8
在Ubuntu上我有
$ lein -vLeiningen 2.7.1 with Java 1.8.0_151 OpenJDK 64-Bit Server VM
如果我用:aot:all替换为:aot(link: com.lendup.citadel.pipeline com.lendup.citadel.providers.mocky),我就可以重现这个错误。我怀疑lein可以在编译命名空间之间进行旧的ns检查来避免重复编译迁移命名空间。
:aot
:all
(link: com.lendup.citadel.pipeline com.lendup.citadel.providers.mocky)
可能与https://github.com/technomancy/leiningen/issues/2316有关
评论由:ikitommi 发布
相关链接:https://github.com/technomancy/leiningen/issues/2508。
评论由:bronsa 发布
这是Clojure还是Lein问题?我们能否通过裸 clj 代码来重现这个问题?
clj
评论由:alexmiller 发布
我怀疑你可以通过按照特定顺序编译某些东西来重现这个问题,但我还没有尝试过。但最终的答案可能是:按正确的顺序编译。