2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面了解更多关于如何使用此功能的信息。

0投票
Leiningen

嗨,

我有两个ClojureScript项目。我使用以下命令从第一个项目(html-ui-lib)中创建了一个JAR文件,并将其安装在一个本地仓库中

lein with-profile prod jar
lein localrepo install -r /home/muenkel/soft/Global/clojure-repo target/html-ui-lib-0.1.2-SNAPSHOT.jar html-ui-lib 0.1.2-SNAPSHOT

在第二个项目(via-trans)中,我尝试使用这个库。为此,我在项目文件中包含了库。遗憾的是,JAR文件中并非所有文件都被安装。我在哪里做错了?

以下是JAR文件的内容

245 周五 Aug 11 00:02:34 CEST 2023 META-INF/MANIFEST.MF
3268 周五 Aug 11 00:02:34 CEST 2023 META-INF/maven/html-ui-lib/html-ui-lib/pom.xml
3183 周五 Aug 11 00:02:34 CEST 2023 META-INF/leiningen/html-ui-lib/html-ui-lib/project.clj
783 周五 Aug 11 00:02:34 CEST 2023 META-INF/leiningen/html-ui-lib/html-ui-lib/README.md

 0 Fri Aug 11 00:02:32 CEST 2023 META-INF/
 0 Fri Aug 11 00:02:32 CEST 2023 META-INF/maven/
 0 Fri Aug 11 00:02:32 CEST 2023 META-INF/maven/html-ui-lib/
 0 Fri Aug 11 00:02:32 CEST 2023 META-INF/maven/html-ui-lib/html-ui-lib/

158 周五 Aug 11 00:02:32 CEST 2023 META-INF/maven/html-ui-lib/html-ui-lib/pom.properties

 0 Fri Aug 11 00:01:30 CEST 2023 public/
 0 Tue Jul 11 23:15:06 CEST 2023 public/css/

2715 周二 Jul 11 23:15:06 CEST 2023 public/css/style.css
151 周日 Mar 26 21:35:54 CEST 2023 public/test.html

 0 Fri Aug 11 00:02:32 CEST 2023 public/cljs-out/

554 周一 Apr 17 22:11:34 CEST 2023 public/index.html
417 周六 Apr 08 23:03:08 CEST 2023 public/devcards.html

 0 Sat Jul 22 23:08:08 CEST 2023 html_ui_lib/
 0 Wed May 10 20:49:58 CEST 2023 html_ui_lib/util/

1100 周三 May 10 20:49:58 CEST 2023 html_ui_lib/util/limit-lines.cljs
1123 周四 May 04 23:27:52 CEST 2023 html_ui_lib/core.cljs

 0 Tue Jul 18 21:06:24 CEST 2023 html_ui_lib/spec/

272 周日 Jun 04 00:13:12 CEST 2023 html_ui_lib/spec/email-value-specs.cljs
1883 周二 Jul 18 21:06:24 CEST 2023 html_ui_lib/spec/value_specs.cljs
213 周三 Jun 07 23:31:32 CEST 2023 html_ui_lib/spec/text_value_specs.cljs
3871 周三 Jun 07 23:14:28 CEST 2023 html_ui_lib/spec/ui-specs.cljs
267 周三 Jun 07 23:26:06 CEST 2023 html_ui_lib/spec/number_value_specs.cljs
185 周六 May 20 23:56:54 CEST 2023 html_ui_lib/spec/date_value_specs.cljs
178 周三 May 31 00:26:16 CEST 2023 html_ui_lib/spec/drop_down_value_specs.cljs
1545 周一 Jul 17 22:55:08 CEST 2023 html_ui_lib/spec/type_specs.cljs

 0 Tue Jul 18 20:59:58 CEST 2023 html_ui_lib/ui/

3234 周二 Jun 06 21:32:30 CEST 2023 html_ui_lib/ui/input_email.cljs
4298 周二 Jul 18 20:59:58 CEST 2023 html_ui_lib/ui/tree_view.cljs
3361 周二 May 24 22:41:30 CEST 2023 html_ui_lib/ui/input_text.cljs
3420 周六 Jun 03 21:42:24 CEST 2023 html_ui_lib/ui/input_date.cljs
6013 周三 Jun 07 23:35:28 CEST 2023 html_ui_lib/ui/input_number.cljs
2029 周三 Jul 12 22:42:44 CEST 2023 html_ui_lib/ui/core.cljs
396 周五 Apr 07 21:19:26 CEST 2023 html_ui_lib/ui/button.cljs
844 周二 Jul 11 23:13:50 CEST 2023 html_ui_lib/ui/output_boolean.cljs
1127 周三 Jul 12 23:57:34 CEST 2023 html_ui_lib/ui/input_checkbox.cljs
276 周日 Apr 23 22:59:54 CEST 2023 html_ui_lib/ui/grid_container.cljs
603 周四 Jun 08 22:50:00 CEST 2023 html_ui_lib/ui/output_number.cljs
1613 周一 Jul 10 21:58:34 CEST 2023 html_ui_lib/ui/input_radio.cljs
381 周日 Apr 09 00:16:22 CEST 2023 html_ui_lib/ui/table.cljs
1775 周六 Jul 01 22:19:10 CEST 2023 html_ui_lib/ui/drop_down_list.cljs
2789 周三 Jun 28 22:57:44 CEST 2023 html_ui_lib/ui/leaf_template.cljs
313 2023年6月8日星期四 23:19:22 中欧夏令时 html_ui_lib/ui/output_text.cljs
2160 2023年7月13日星期四 23:36:30 中欧夏令时 html_ui_lib/ui/input_password.cljs
519 2023年6月7日星期三 22:44:34 中欧夏令时 html_ui_lib/test_runner.cljs
860 2023年6月7日星期三 22:57:28 中欧夏令时 html_ui_lib/number_value_specs_test.cljs
273 2023年5月24日星期三 21:17:16 中欧夏令时 html_ui_lib/text_value_specs_test.cljs
1090 2023年5月30日星期二 23:24:06 中欧夏令时 html_ui_lib/value_specs_test.cljs
7280 2023年6月7日星期三 23:07:38 中欧夏令时 html_ui_lib/ui_specs_test.cljs
2274 2023年5月24日星期三 21:37:08 中欧夏令时 html_ui_lib/type_specs_test.cljs
305 2023年5月24日星期三 23:44:04 中欧夏令时 html_ui_lib/drop_down_value_specs_test.cljs
260 2023年3月26日星期日 21:35:54 中欧夏令时 html_ui_lib/core_test.cljs

以下是库目录的内容。如您所见,这里只包含命名空间 ui 的文件

via-trans/resources/public/cljs-out/dev/html_ui_lib/
└── ui
    ├── core.cljs
    ├── core.cljs.cache.json
    ├── core.js
    ├── core.js.map
    ├── input_text.cljs
    └── input_text.js

以下是 html_ui_lib 的 project.clj 文件

(defproject html-ui-lib "0.1.2-SNAPSHOT")
:description "FIXME: write this!"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"

        :url "http://www.eclipse.org/legal/epl-v10.html"}

:min-lein-version "2.7.1"
:dependencies [[clj-commons/citrus "3.3.0"]

             [cljs-ajax "0.8.1"]
             [funcool/struct "1.4.0"]
             [org.clojure/clojure "1.10.0"]
             [org.clojure/clojurescript "1.11.60"]
             [rum "0.12.10"]]

;;:deps {io.github.clj-kondo/config-rum-rum {:mvn/version "0.12.10"}}
:global-vars {warn-on-reflection true}
;;:global-vars {asserts false}
:source-paths ["src/cljs" "test/cljs"]
:aliases {"fig:build" ["trampoline" "run" "-m" "figwheel.main" "-b" "dev" "-r"]

        "fig:min"   ["run" "-m" "figwheel.main" "-O" "advanced" "-bo" "dev"]
        "prod:build" ["run" "-m" "figwheel.main" "-O" "advanced" "-bo" "prod"]}

:profiles {:dev {:dependencies [[com.bhauman/figwheel-main "0.2.18"]

                              [org.slf4j/slf4j-nop "1.7.30"]
                              [com.bhauman/rebel-readline-cljs "0.1.4"]
                              [devcards "0.2.7"]
                              ;; for informing the linter clj-kondo, that the macros
                              ;; defc etc defines symbols
                              [io.github.clj-kondo/config-rum-rum "1.0.0"]]
               :source-paths ["devcards/cljs"]
               :resource-paths ["target"]
               ;; need to add the compiled assets to the :clean-targets
               :clean-targets ^{:protect false} ["target" "resources/public/cljs-out"]
               #_:global-vars #_{*asserts* false}}
         :prod {:dependencies [[com.bhauman/figwheel-main "0.2.18"]]
                :compiler {:optimizations :advanced
                           :pretty-print false}
                :clean-targets ^{:protect false}
                ["target"
                 "resources/public/cljs-out/prod"
                 "resources/public/cljs-out/prod-main.js"]
                :cljsbuild {:builds
                            [{:source-paths ["src/cljs"]
                              :compiler
                              {:output-to "resources/public/cljs-out/prod-main.js"
                               :optimizations :advanced
                               :pretty-print false}
                              :build nil}]}
                :plugins [[lein-cljsbuild "1.1.8"]]}}

:plugins [[com.github.clj-kondo/lein-clj-kondo "0.2.4"]

        [com.fabiodomingues/lein-clj-depend "0.3.0"] ;; Usage: lein clj-depend
        ;; Detects curcular referencies
        [lein-kibit "0.1.8"] ; Code Analyzer: https://github.com/clj-commons/kibit
                                    ; Anounced better code alternatives
                                    ; Usage: lein kibit
                                    ; Automatic: lein auto kibit
                                    ; With replace: lein kibit --replace --interactive
        ])

以下是 via-trans 的项目文件

(defproject via-trans "0.1.0-SNAPSHOT")
:description "FIXME: write description"
:url "http://example.com/FIXME"
:dependencies [;;[camel-snake-kebab "0.4.3"] ; 用于转换关键词的库

             [ch.qos.logback/logback-classic "1.4.4"]
             [cljs-ajax "0.8.1"]
             [clj-commons/citrus "3.3.0"]
             ;;[clojure.java-time "1.1.0"]
             ;;[cljc.java-time "RENAMED"]
             [cljc.java-time "0.1.18"]
             [conman "0.9.6"] ; Library used for creating functions from sql
             [cprop "0.1.19"]   ; Configuration
             [devcards "0.2.7"]
             [expound "0.9.0"]
             [funcool/struct "1.4.0"]
             [com.layerware/hugsql "0.5.3"] ; Replacement for conman
             ;[hugsql-adapter-case "0.1.0"] ; case adapter for db table columns 
             [html-ui-lib "0.1.2-SNAPSHOT"]
             [json-html "0.4.7"]
             [luminus-transit "0.1.5"]
             [luminus-undertow "0.1.18"]
             [luminus/ring-ttl-session "0.3.3"]
             [org.mariadb.jdbc/mariadb-java-client "1.1.5"]
             ;;[mysql/mysql-connector-java "8.0.18"]
             [markdown-clj "1.11.3"]
             [metosin/muuntaja "0.6.8"]
             [metosin/reitit "0.5.18"]
             [metosin/ring-http-response "0.9.3"]
             [mount "0.1.16"]
             [nrepl "1.0.0"]
             [org.clojure/clojure "1.11.1"]
             [org.clojure/clojurescript "1.11.60"]
             [org.clojure/tools.cli "1.0.214"]
             [org.clojure/tools.logging "1.2.4"]
             [org.webjars.npm/bulma "0.9.4"]
             [org.webjars.npm/material-icons "1.10.8"]
             [org.webjars/webjars-locator "0.45"]
             [org.webjars/webjars-locator-jboss-vfs "0.1.0"]
             [ring-webjars "0.2.0"]
             [ring/ring-core "1.9.6"]
             [ring/ring-defaults "0.3.4"]
             [rum "0.12.10"]
             [selmer "1.12.55"]]

:min-lein-version "2.0.0"
:source-paths ["src/clj" "src/cljc" "src/cljs" "devcards/cljs"]
:test-paths ["test/clj" "test/cljc" "test/cljs"]
:resource-paths ["resources" "target"]
:clean-targets ^{:protect false} ["target" "resources/public/cljs-out"]
:target-path "target/%s/"
:main ^:skip-aot via-trans.core
:plugins []
:profiles
{:uberjar {:omit-source true

         :aot :all
         :uberjar-name "via-trans.jar"
         :source-paths ["env/prod/clj" ]
         :resource-paths ["env/prod/resources"]}

:dev [:project/dev :profiles/dev]
:test [:project/dev :project/test :profiles/test]
:project/dev {:jvm-opts ["-Dconf=dev-config.edn" ]}

              :dependencies [[com.bhauman/figwheel-main "0.2.18"]
                             [com.bhauman/rebel-readline-cljs "0.1.4"]
                             [org.clojure/tools.namespace "1.3.0"]
                             [pjstadig/humane-test-output "0.11.0"]
                             [prone "2021-04-23"]
                             [ring/ring-devel "1.9.6"]
                             [ring/ring-mock "0.4.0"]]
              :plugins      [[com.jakemccrary/lein-test-refresh "0.24.1"]
                             [jonase/eastwood "1.2.4"]
                             ;;[cider/cider-nrepl "0.28.4"] ; ist in .lein/profiles.clj
                             ]   
              :source-paths ["env/dev/clj" ]
              :resource-paths ["env/dev/resources" "target"]
              :repl-options {:init-ns user
                             :timeout 120000}
              :injections [(require 'pjstadig.humane-test-output)
                           (pjstadig.humane-test-output/activate!)]}

:project/test {:jvm-opts ["-Dconf=test-config.edn" ]}

              :resource-paths ["env/test/resources"] }

:profiles/dev {}
:profiles/test {}})

by
您未能描述实际的问题。这看起来都应该是对的,所以很难从这个中推断出问题。
by
问题是,jar 文件中的所有文件并没有安装到 via-trans/resources/public/cljs-out/dev/html_ui_lib/ 中(请查看我的帖子中的目录列表 - 在 jar 文件的内容列表之后)。只有命名空间 html-ui-lib/ui,例如,不是命名空间 html-ui-lib/spec。但由于 html-ui-lib/ui 中的文件需要 html-ui-lib/spec 中的文件,因此会出现编译错误。

1 答案

0投票

您的设置不常见,因此很难确定您期望发生什么,或者为什么您想在.java文件中包含通常只用于开发的文件。

在常见的Clojure(Script)设置中,库仅包含其源代码,不包含编译后的工件。实际项目则使用这些库来构建所需的内容。

库中也可以有CLJS构建,但那些只与该库的开发相关,不是实际发布输出的部分。

如果出于某种原因您不想这样,而希望将构建保存在库中,那么项目应该包含在.jar中的唯一相关文件就是由prod构建生成的.js文件。这通常在项目的prod.edn中定义。它可能只产生一个输出文件。您所缺失的文件是开发文件,应不再相关。

您的项目似乎也有些零散,因为仍然存在可能是lein-cljsbuild配置的遗留部分,同时也还有对较新的figwheel.main的引用。您可能需要清理它们,以便更容易了解实际发生了什么。

我对lein-localrepo的使用也不是很确定。一个简单的lein install应该就能达到相同的效果,如果目标是使用来自项目的本地安装的库。不确定localrepo具体还做什么。

localrepo插件允许您在特定坐标下安装任意的JAR文件,目的是帮助您使用那些仅以纯下载形式存在(不在Maven仓库中)或作为具有任意构建过程的源项目(所以您需要自己下载并构建JAR)的库。使用它而不是lein install在我看来似乎...非常奇特。
我认为 project.clj 文件中的异常是由于我的无知而不是意图造成的。另外,对于生产配置 prod,我尝试了 cljsbuild 和 figwheel。

我使用 figwheel.main 进行了开发,并认为对于生产,我必须使用常规的 ClojureScript 编译器 cljsbuild。
当我使用 figwheel 生成优化的 JavaScript 文件时,与使用 cljsbuild 相比,并不是所有的命名空间都被包含在内。

但如果你理解正确的话,JAR 文件中应该只包含 cljs 文件——对吗?
那么,只使用命令 `lein with-profile prod jar` 就应该足够创建 JAR 文件——对吗?
正如你在我帖子顶端看到的,JAR 文件也只包含 cljs 而没有 js 文件。
为了澄清,`lein install` 将生成一个 JAR 并在 `~/.m2` 中本地安装,使其可供其他项目访问。您不需要手动创建 JAR,也不需要使用本地仓库。是的,只包含 .cljs 文件是标准做法。然而,这也确实需要添加或移动构建设置到项目中。我猜测 Figwheel 没有包含所有内容,可能是因为您可能在代码中未能正确包含依赖关系,例如缺少 (ns ... (:require ...))。
感谢您的提示。我不知道这一点。现在我已经使用 `lein install` 重新安装了 html-ui-lib 项目,但错误仍然存在。只有 ui/core.cljs 和 ui/input_text.cljs 这两个 Clojurescript 文件被复制(安装)到了 via-trans-project 中,我不明白为什么。

是否有任何元文件,其中必须填写关于 JAR 中 Clojurescript 文件的信息?
又有一种期望,我难以理解。install 命令会把 .jar 文件复制到 ~/.m2 工具库目录。不会将任何内容复制到 via-trans 项目中。你为什么期望文件被复制到 via-trans 项目?对于 .jar 文件,没有额外的配置,只需要包含文件即可。基于你的最初帖子的内容,这似乎是正确的。你的项目还需要依赖这个库,但在任何情况下都似乎缺少了?在你的项目 :dependencies 中应该有一个 [html-ui-lib "0.1.2-SNAPSHOT"]。
依赖条目 [html-ui-lib "0.1.2-SNAPSHOT"] 存在于 via-trans 的 project.clj 文件中。

在运行 cider-jack-in-cljs 命令,并设置 repl 类型为 figwheel-main、构建为 dev 之后,我遇到了以下的编译错误
``` clojurescript
[Figwheel:WARNING] 编译异常   资源/public/cljs-out/dev/html_ui_lib/ui/input_text.cljs   第7行 第5列

  找不到命名空间:html-ui-lib.spec.ui-specs,无法找到 html_ui_lib/spec/ui_specs.cljs、html_ui_lib/spec/ui_specs.cljc 或提供 "html_ui_lib.spec.ui-specs" 的 JavaScript 源代码(请检查使用连字符的命名空间在 ClojureScript 文件名中使用下划线)在文件 resources/public/cljs-out/dev/html_ui_lib/ui/input_text.cljs 中

   2    (:require
   3     [citrus.core :as citrus]
   4     [rum.core :as rum]
   5     [html-ui-lib.ui.core :refer [get-event-value-save-cursor!op-get-input
   6                                  set-cursor-pos-mixin]]
   7     [html-ui-lib.spec.ui-specs :as us]
          ^---
   8     [cljs.spec.alpha :as s]))
```
被投诉缺失的文件 "html_ui_lib/spec/ui_specs.cljs" 存在于 jar 文件中,但不在 "resources/public/cljs-out/dev/html_ui_lib/" 目录中。只有 ui 目录。这就是我假设编译器将依赖项的内容复制到 "resources/public/cljs-out/dev",但在 html-ui-lib 的情况下没有完全复制的原因。
您所遇到的错误是文件实际上有错误的名称。请记住,文件名应将破折号-替换为下划线'_'。根据您的初始帖子,文件的名称为html_ui_lib/spec/ui-specs.cljs,请注意最后的破折号。将其替换后,您应该就能正常使用了。

我不知道figwheel为什么使用resources/public文件夹作为参考,这非常误导人,并不是实际文件的来源。但现在我明白您为什么对文件位置感到困惑。
非常感谢您的帮助。

问题的原因确实是在文件名中的下划线'_'。我知道,在Clojure/Clojurescript中,文件名必须用下划线代替破折号。但作为一名老Lisp程序员,我总是不经思考地在文件名中使用破折号而不是下划线。
但是,我在html-lib-ui中用defcard和测试测试了我的代码,没有出现任何问题。在我看来,Clojurescript在处理文件名中的破折号方面似乎比Clojure更少有问题。
有没有任何linters或Emacs的包可以在文件名中有破折号时发出警告?
...