【问题标题】:How can I run a .clj Clojure file I created?如何运行我创建的 .clj Clojure 文件?
【发布时间】:2011-12-01 04:11:15
【问题描述】:

我在 Linux 上编写了一个小型“hello world”程序来开始使用这种语言。

现在我想运行它并查看它的输出。

如何运行此代码? 我应该运行什么命令?

【问题讨论】:

    标签: command-line clojure


    【解决方案1】:

    FWIW,我将这里的问题解释为专门询问如何运行单个文件(如脚本),而不是作为已编译项目的一部分。 很明显,您希望如何以及为何要运行单个文件,以及您希望如何构建一个完整的项目之间存在关系,因此我也权衡了这一点。

    最佳选择:clj 工具

    文档在这里:

    https://clojure.org/guides/deps_and_cli

    这是 Clojure 项目的官方部分,这本身就是走这条路的一个很好的理由。但是,与这里的其他解决方案相比,它有几个优点:

    • 更干净的依赖解析模型,通过deps.edn
    • 还可以通过 git 引用解决依赖关系!
    • ~/.clojure/deps.edn 似乎比 ~/.lein/profiles.clj 在通过其别名干净地提供可重用功能方面做得更好
    • 如果您需要在 repl 中加载您的代码,clj 不会像 lein repl 那样卡在一个无聊的 src 文件中

    简单

    clj your-code-file.clj

    或者如果你有依赖项

    clj -Sdeps '{:deps {clj-time {:mvn/version "0.14.2"}}} your-code-file.clj

    在脚本中也可以作为 shebang 使用!

    #!clj -deps '{:deps {clj-time {:mvn/version "0.14.2"}}}
    (ns my-crazy-script!
      (:require ...))
    ...
    

    我建议使用homebrew 安装,它现在可以在 Mac 和 Linux 上运行。如果您使用的是 Windows,我建议您使用 WSL+brew。

    我看到lein(见下文)工具优于clj 的一个优势通常是lein 处理了更多构建打包的过程em> 你的代码库,当你到达那一点时。 但是,还有其他处理方式(请参阅packuberdeps 或 cambada),并且上面提到的 clj 的优势超过了恕我直言。

    巴巴什卡

    如果您尝试运行单个文件,而不是整个项目,那么您很有可能处于“脚本领域”。 不幸的是,JVM 需要一段时间才能启动,Clojure 本身也是如此。 通过 GraalVM 和 SCI 的魔力,Babashka 能够以极快的启动时间支持大多数 Clojure 语言。 它还为典型的脚本任务提供了相当多的“电池”,当您需要快速执行、短寿命的进程时,它是clj 的完美补充。

    安装后,您可以简单地bb you-code-file.clj,或在您的shebang 中使用#!bb。 有关更多使用说明,请参阅文档:

    https://babashka.org/

    lein & lein-exec

    如果您更喜欢lein 工具,或者已经有~/.lein/profiles.clj 文件方便并且不想投资于学习clj/deps.edn,您可以考虑查看lein-exec

    如果您已经设置了带有依赖项的project.clj,您当然可以运行lein run -m <yer-namespace>[/<yer-main-fn>]

    如上所述,lein 相对于clj 的一个优势在于它是一个完整的构建工具,可以使用lein jarlein uberjar 为您制作jar/uberjar,进行部署等。

    对于 ClojureScript

    我推荐http://planck-repl.org/。它现在支持(引导)快速启动 ClojureScript 脚本,而无需启动 JVM 或 Clojure。 像 babashka 一样,这使得它非常适合编写脚本。 但是,我发现 babashka 更强大,更自然地编写脚本,所以我会从那里开始,除非你有特殊原因想要使用 Cljs(更熟悉 JS/node,需要某些 cljs 库等)。

    对于更重要的项目(除了脚本),您可能需要查看 Shadlow-CLJS,因为它可以轻松地整合 vanilla JS 项目。 FWIW,Shadow 很好地与 deps 和 lein 集成,并且有自己的内置 hode 代码重新加载,如 figwheel。

    java

    当然,正如另一个答案中所建议的那样,您可以使用

    java -cp clojure.jar clojure.main file.clj
    

    但是您不会经常看到这种情况,因为必须找到您的clojure.jar 的路径并手动编写依赖项的类路径很痛苦。 但是,你知道,各有各的。

    【讨论】:

    • 谢谢! sudo apt-get install clojure 然后clojure hello.clj
    • lein exec 是要走的路。
    • @qed - 同意;这就是我通常的方式。
    • 如果你正在寻找它,我写了一篇关于如何安装 exec 插件的快速而肮脏的blog 帖子。
    • @qed 为什么lein exec 是“要走的路”?为什么不使用clojure
    【解决方案2】:

    您可以使用以下命令运行脚本:

    java -cp clojure.jar clojure.main file.clj
    

    但最好使用leiningen,尤其是当您开始向项目添加依赖项时。 lein 提供了许多命令来运行您的代码(具有所有必要的依赖项),使用lein jar 将代码打包到存档中,或者使用您可以运行的lein uberjar 创建完整、独立的存档:

    java -jar your_app.jar
    

    命令

    附:您可以在following article 中阅读如何使用lein - 它描述了基本任务和配置

    【讨论】:

    • 可能要补充一点,他必须先用 lein new 做一个项目,并将 clj 文件作为项目的一部分,例如 core.clj
    • 是的,它正在创建项目可能很有用...我添加了关于如何使用 lein 的文章的链接
    • Alex,我一直在尝试这个,但它只显示一个空行;我在文件中有一个 println 但它从不打印它;有什么遗漏吗? java -cp clojure-1.6.0.jar clojure.main ..\hey.clj
    • 对我来说很好...你有 println 在源代码的顶层还是在函数内部?如果是后者,则编译该函数,但永远不会运行...以下对我来说没有任何问题:echo '(println "test")' > 1.cljjava -cp ~/.m2/repository/org/clojure/clojure/1.6.0/clojure-1.6.0.jar clojure.main 1.clj
    • 我不断收到Exception in thread "main" java.io.FileNotFoundException: <FILENAME>.clj (No such file or directory)
    【解决方案3】:

    一旦你安装了 lein 和 lein-exec 插件,运行你创建的 .clj 文件就像

    lein exec hello.clj
    

    如果您传递命令行参数,例如

    lein exec hello.clj arg1 arg2 arg3
    

    您可以在 hello.clj 中的 'foo' 函数中访问它们,例如

    (foo *command-line-args*) 
    

    【讨论】:

      【解决方案4】:

      对于您可以添加的单个 clj 文件,

      #!/usr/bin/env java -cp /path/to/clojure-1.2.0.jar clojure.main
      

      到文件顶部并使其可执行,或者您可以使用 leiningen,它是一个 clojure 构建工具,它将创建一个包含所有内容的单个 jar,然后您就可以这样做,

      java -jar cool_app.jar
      

      【讨论】:

        【解决方案5】:

        如果您只想执行单个文件,如何将其通过管道传输到 repl,例如:

        cat $PATH_TO_FILE | lein repl

        【讨论】:

          【解决方案6】:

          Drip 现在可能是这个问题的最佳答案(有关在 Clojure 中使用 Drip 的详细信息,请参阅 Drip's wiki)。

          Cake 被并入 Leiningen 并已被 Drip - see this answer 取代为 Clojure 自动化的最稳定实现。

          【讨论】:

            【解决方案7】:

            要通过命令行运行单个文件,请使用以下命令:

            clj -m (NameSpace name)
            

            例如:clj -m Sample

            或者如果你想通过 repl 运行:

            (load-file filelocation)
            

            例如:

             (load-file "Sample.clj")
            

            【讨论】:

              【解决方案8】:

              我在使用 lein 从 clojure 项目中运行特定的 clojure 脚本文件时遇到了类似的问题。然后我找到了一条捷径,想分享一下。

              project.clj 文件中,您可以切换clojure 脚本文件名(当然有main 方法)。以下是对此的声明。

              :main ^:skip-aot conv.newconv; here conv is namespace and newconv is the file name.

              注意:我是 clojure 的新手,我不确定为什么要使用 '^:skip-aot`,我没有检查过。

              注意:此方法不需要安装任何插件,也不需要生成任何 jar 文件。这只需要更改项目文件中的名称。

              假设:您的 clojure 项目有多个 clojure 文件,每个文件都有 main 方法。我假设这只是为了测试目的而创建的。我的解决方案适用于这种特定情况。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-03-14
                • 2012-08-17
                • 1970-01-01
                • 2021-02-26
                相关资源
                最近更新 更多