在Leiningen中排除某些clj命名空间进行编译

9
我有一个使用lein run正常运行的项目。现在我想使用lein uberjar将其编译为独立的jar文件。然而,在我的src/projectname/目录中有一些源文件,例如playground.cljstats.clj,我用它们来尝试emacs和repl,但是我不想将它们编译到最终项目中。
使用类似make的东西,我会指定所有应该被编译的文件。使用clojure/leiningen,似乎默认情况下编译所有文件 - 如何排除文件?我在leiningen文档中没有找到任何信息。
我当前正在使用:aot :all。这是改变什么的地方吗?同样,我没有找到详细的文档说明。 更新: 到目前为止,建议都没有起作用。然而,有效的方法是包括所有需要的命名空间,而不是排除不应该被编译的命名空间。例如:
(defproject myproject "version"
  ;; ...
  :profiles {:uberjar {:aot [myproject.data
                             myproject.db
                             myproject.util]}})
3个回答

3
请查看 leiningen's sample project.clj,其中描述了如何使用 :jar-exclusions:uberjar-exclusions 在创建 jar(或 uberjar)时排除任意路径。
  ;; Files with names matching any of these patterns will be excluded from jars.
  :jar-exclusions [#"(?:^|/).svn/"]
  ;; Files with names matching any of these patterns will included in the jar
  ;; even if they'd be skipped otherwise.
  :jar-inclusions [#"^\.ebextensions"]
  ;; Same as :jar-exclusions, but for uberjars.
  :uberjar-exclusions [#"META-INF/DUMMY.SF"]

尝试使用 :uberjar-exclusions [#".*stats.clj" #".*playground.clj"],但没有改变任何东西。 - pholz

1

虽然这是一个老问题,但我认为我已经找到了答案,供后来者参考。

我在 @amalloy 的回答中的样例leiningen项目链接中找到了答案,不过我使用的是 source-paths 而不是 :jar-exclusions在这里

思路是创建两个独立的源代码目录,一个用于您不想分散的内容,另一个用于您想要分散的内容:

dev-src/<your-project>/playground.clj
dev-src/<your-project>/stats.clj
src/<your-project>/<everything-else>

接下来,在你的project.clj文件中,通常在中包含src,并在一个特殊的profile中包含emacs-src,以便在其中可见,比如通常的:dev profile:

{
   ;; ...
   :source-paths ["src"]
   :profiles {
      :dev {
         :source-paths ["src" "dev-src"]
      }
   }
}

这样,当您在计算机上操作时,这些文件将在jar包中,而当您部署到clojars或使用uberjar编译时,它们将不会被包含在jar包中,也不会被编译。


0

尝试这个 (ns ^:skip-aot my-ns)

你也可以这样做

(ns ^{:skip-aot true} my-ns
    (require [...]))

源代码


1
对我没有用。这与此有任何关系吗?-> 来自相同的源文件:“^:skip-aot将不会禁用:AOT编译”:main“,当:aot为:all或包含主类时。”也就是说,我需要用所有要包含的文件的向量替换:all? - pholz
我假定你的主要ns,myproject.core依赖于myproject.stats中的代码。你不能定义需要:aot的命名空间而不是使用:all吗? - runexec
你使用的 lein 版本是什么? - runexec
Leiningen 2.3.4 运行在 Java 1.7.0_65 OpenJDK 64 位服务器虚拟机上。 - pholz
你可以尝试升级到Lein 2.5,然后检查问题是否仍然存在吗? - runexec
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接