【发布时间】:2011-12-01 04:11:15
【问题描述】:
我在 Linux 上编写了一个小型“hello world”程序来开始使用这种语言。
现在我想运行它并查看它的输出。
如何运行此代码? 我应该运行什么命令?
【问题讨论】:
标签: command-line clojure
我在 Linux 上编写了一个小型“hello world”程序来开始使用这种语言。
现在我想运行它并查看它的输出。
如何运行此代码? 我应该运行什么命令?
【问题讨论】:
标签: command-line clojure
FWIW,我将这里的问题解释为专门询问如何运行单个文件(如脚本),而不是作为已编译项目的一部分。 很明显,您希望如何以及为何要运行单个文件,以及您希望如何构建一个完整的项目之间存在关系,因此我也权衡了这一点。
clj 工具文档在这里:
https://clojure.org/guides/deps_and_cli
这是 Clojure 项目的官方部分,这本身就是走这条路的一个很好的理由。但是,与这里的其他解决方案相比,它有几个优点:
deps.edn
~/.clojure/deps.edn 似乎比 ~/.lein/profiles.clj 在通过其别名干净地提供可重用功能方面做得更好
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> 你的代码库,当你到达那一点时。
但是,还有其他处理方式(请参阅pack、uberdeps 或 cambada),并且上面提到的 clj 的优势超过了恕我直言。
如果您尝试运行单个文件,而不是整个项目,那么您很有可能处于“脚本领域”。
不幸的是,JVM 需要一段时间才能启动,Clojure 本身也是如此。
通过 GraalVM 和 SCI 的魔力,Babashka 能够以极快的启动时间支持大多数 Clojure 语言。
它还为典型的脚本任务提供了相当多的“电池”,当您需要快速执行、短寿命的进程时,它是clj 的完美补充。
安装后,您可以简单地bb you-code-file.clj,或在您的shebang 中使用#!bb。
有关更多使用说明,请参阅文档:
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 jar 或lein uberjar 为您制作jar/uberjar,进行部署等。
我推荐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 是“要走的路”?为什么不使用clojure?
您可以使用以下命令运行脚本:
java -cp clojure.jar clojure.main file.clj
但最好使用leiningen,尤其是当您开始向项目添加依赖项时。 lein 提供了许多命令来运行您的代码(具有所有必要的依赖项),使用lein jar 将代码打包到存档中,或者使用您可以运行的lein uberjar 创建完整、独立的存档:
java -jar your_app.jar
命令
附:您可以在following article 中阅读如何使用lein - 它描述了基本任务和配置
【讨论】:
echo '(println "test")' > 1.clj; java -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)
一旦你安装了 lein 和 lein-exec 插件,运行你创建的 .clj 文件就像
lein exec hello.clj
如果您传递命令行参数,例如
lein exec hello.clj arg1 arg2 arg3
您可以在 hello.clj 中的 'foo' 函数中访问它们,例如
(foo *command-line-args*)
【讨论】:
对于您可以添加的单个 clj 文件,
#!/usr/bin/env java -cp /path/to/clojure-1.2.0.jar clojure.main
到文件顶部并使其可执行,或者您可以使用 leiningen,它是一个 clojure 构建工具,它将创建一个包含所有内容的单个 jar,然后您就可以这样做,
java -jar cool_app.jar
【讨论】:
如果您只想执行单个文件,如何将其通过管道传输到 repl,例如:
cat $PATH_TO_FILE | lein repl
【讨论】:
Drip 现在可能是这个问题的最佳答案(有关在 Clojure 中使用 Drip 的详细信息,请参阅 Drip's wiki)。
Cake 被并入 Leiningen 并已被 Drip - see this answer 取代为 Clojure 自动化的最稳定实现。
【讨论】:
要通过命令行运行单个文件,请使用以下命令:
clj -m (NameSpace name)
例如:clj -m Sample
或者如果你想通过 repl 运行:
(load-file filelocation)
例如:
(load-file "Sample.clj")
【讨论】:
我在使用 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 方法。我假设这只是为了测试目的而创建的。我的解决方案适用于这种特定情况。
【讨论】: