【问题标题】:exclude certain clj namespaces from compilation in leiningen从 leiningen 的编译中排除某些 clj 命名空间
【发布时间】:2015-01-30 12:59:42
【问题描述】:

我有一个使用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]}})

【问题讨论】:

    标签: clojure leiningen uberjar


    【解决方案1】:

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

    你也可以这样做

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

    Source

    【讨论】:

    • 对我不起作用。这有什么关系吗? -> 来自同一个源文件:“当 :aot 是 :all 或包含主类时,^:skip-aot 不会禁用 :main 的 AOT 编译。” IE。然后我需要将 :all 替换为要包含的所有文件的向量?
    • 没错。您可以将代码从主 ns 移动到另一个,并将 ^:skip-aot 添加到命名空间
    • 嗯,我的主要ns叫做myproject.core。我在myproject.statsns 指令中添加了^:skip-aot,但是当我运行lein uberjar 时,它仍然想编译stats。我只能通过将 stats.clj 重命名为 stats.bak 来解决此问题。
    • 我假设您的主要 ns myproject.core 依赖于 myproject.stats 中的代码。有什么理由不能定义哪些命名空间需要:aot 而不是使用:all
    • 我当然查过了。没有这种依赖。 stats 未在任何地方引用。
    【解决方案2】:

    看看leiningen's sample project.clj,它描述了如何使用:jar-exclusions:uberjar-exclusions 在创建jars(resp. uberjars)时排除任意路径。

      ;; 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"],没有任何改变
    【解决方案3】:

    老问题,但我想我已经为那些追随我的人找到了答案。

    我在@amalloy 的回答中的示例 leiningen 项目的链接中找到了答案,除了我使用 source-pathshere 而不是 :jar-exclusions

    我们的想法是创建两个独立的源目录,一个用于存放您不想传播的内容,另一个用于存放您需要做的事情:

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

    然后,在您的 project.clj 中,通常将 src 包含在 source-paths 中,并将 emacs-src 包含在您希望它可见的特殊配置文件中,例如通常的 :dev 配置文件:

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多