【问题标题】:Omit sources partially in Leiningen在 Leiningen 部分省略来源
【发布时间】:2015-07-20 13:00:34
【问题描述】:

我有一个需要导出的 API,但我不想让很多代码被窥探。如果我包含 :omit-sources true,那么所有代码​​库都会消失,并且我的 API 不再可用于编译。

如何做到这一点?我将尝试使用 git 子模块,但我想知道是否有与我当前项目布局兼容的替代方法,例如,排除除包之外的所有内容。

编辑:我有一个 data_readers.clj,如果我使用 :omit-sources,它不会进入 JAR

我目前所做的是包括 :filespecs [{:type :bytes:path "data_readers.clj" :bytes ~(slurp "src/main/shared/clj/data_readers.clj")}]

手动包含文件,但这会导致 Cursive IntelliJ 插件出现问题。

【问题讨论】:

    标签: java clojure leiningen


    【解决方案1】:

    您需要:aot(提前编译)和:omit-source

    当不使用:aot 时(这是默认设置),clojure 将尝试从 jar 中的源代码动态编译类,因此它需要源代码。

    你可以使用:aot :all,如果你只想公开你的api,你可以使用:aot [my.awesome.api]

    所以你的 project.clj 看起来像:

    (defproject my-project ... ... :aot :all :omit-source true)

    clojure 邮件列表中的This thread 有关于此的信息。 compilation page in clojure.org 也很好地解释了提前编译:

    Clojure 将您即时加载的所有代码编译成 JVM 字节码,但是 有时提前编译 (AOT) 是有利的。一些 使用 AOT 编译的原因是:

    • 在没有源的情况下交付您的应用程序
    • 加快应用程序启动
    • 生成供 Java 使用的命名类
    • 创建不需要运行时字节码生成和自定义类加载器的应用程序

    【讨论】:

    • 谢谢@nberger。然而,我相信 :omit-source 仍然会忽略 JAR 中的所有源代码,而不管其中哪些源代码是在 :aot 中编译的。
    • data_readers.clj 是一个非常具体的案例,我想说它不是您的库导出的 api 的一部分,但它是使您的 api 更容易使用的糖。你的问题没有提到 data_readers.clj。当它启动时,clojure reads this file 好像它是一个资源,所以你可以完美地把它放在 resources/data_readers.clj 和它 will be included in the jar 即使是 :omit-source true
    • 举个例子,honeysql 以这种方式包含它的 data_readers.clj。
    • 谢谢,包括资源目录中的 data_readers.clj 并添加 :resource-paths ["resources"] 有效。我发誓我试过了。
    猜你喜欢
    • 2018-03-24
    • 2013-02-04
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    相关资源
    最近更新 更多