如何运行我创建的.clj Clojure 文件?

为了开始学习这门语言,我在 Linux 上编写了一个小小的“ hello world”程序。

现在我想运行它,看看它输出了什么。

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

41391 次浏览

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

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

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

java -jar cool_app.jar

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

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

但是最好使用 雷宁根,特别是当您开始向项目添加依赖项时。Lein 提供了许多命令来运行您的代码(包括所有必要的依赖项) ,用 lein jar将代码打包归档,或用 lein uberjar创建完整的、独立的归档,您可以使用这些命令运行:

java -jar your_app.jar

指挥官

你可以在 以下文章中读到如何使用 lein-它描述了基本的任务和配置

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"}}}' -M your-code-file.clj

工程以及在脚本中的一个示范以及!

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

我建议使用 自酿的进行安装,它现在可以在 Mac 和 Linux 上运行。如果你使用的是 Windows 系统,我建议你使用 WSL + 酿造。

我所看到的 lein(见下文)工具相对于 clj的一个优势通常是,当您到达那一点时,lein处理的 建筑物包装过程稍微多一点。 然而,还有其他处理方法(见 收拾行李Uberdeps或 cambada) ,上述 clj的优点超过了 IMHO。

巴巴斯卡

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

一旦你安装它,你可以简单地 bb you-code-file.clj,或使用 #!bb在您的工具箱。 有关更多使用说明,请参见文档:

Https://babashka.org/

leinlein-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,因为它可以轻松地合并普通的 JS 项目。 FWIW,Shadow 很好地集成了 deps 和 lein,并且有它自己的内置在 hode 代码重新加载,就像图轮一样。

java

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

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

但是这种情况在野外并不常见,因为必须找到 clojure.jar的路径并为依赖关系手动组合类路径是一件痛苦的事情。 但是,你知道,每个人都有自己的想法。

Drip 可能是这个问题的最佳答案(有关使用 Drip with Clojure 的详细信息,请参阅 德里普的维基百科)。

Cake 已经被 Leiningen 引入,并且已经被 Drip-看看这个答案取代,成为 Clojure 自动化最稳定的实现。

一旦安装了 lein 和 Lein-exec插件,运行您创建的. clj 文件就像下面这样简单

lein exec hello.clj

以防您传递命令行参数,如

lein exec hello.clj arg1 arg2 arg3

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

(foo *command-line-args*)

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

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

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

注意: 我是 cljure 的新手,我不确定为什么使用“ ^ : Skip-aot”,我还没有检查过。

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

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

如果您只想执行一个文件,那么将它管道化到 repl 如何:

cat $PATH_TO_FILE | lein repl

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

clj -m (NameSpace name)

例: clj -m Sample

或者如果您想运行 repl:

(load-file filelocation)

例如:

 (load-file "Sample.clj")

我真的很喜欢写小字。Clj 脚本,但有时这些脚本有需要安装的依赖项。由于没有其他的答案涵盖这个情况,我在这里提供一个例子。这个示例是一个单文件脚本,它需要来自 math.combinatorics库的 permutations函数。


麻烦的 Mac 专用解决方案

#!/usr/bin/env clj -Sdeps {:deps,{org.clojure/math.combinatorics,{:mvn/version,"0.1.6"}}} -M
; Explanation for the shebang:
;   -Sdeps  Specify deps in EDN format
;   ,       Clojure interprets commas as whitespace. Without the commas, the EDN is
;           broken up into multiple arguments and the command fails. On the
;           command line you can use single quotes around the EDN string, but
;           Mac shebangs don't support quoting around arguments.
;   -M      Run the program as a "main" function


(ns foo
(:use [clojure.math.combinatorics :only (permutations)]))


(dorun (map #(println (apply str %)) (permutations "abcde")))

只有 Linux 的解决方案

#!/usr/bin/env -S clj -Sdeps '{:deps {org.clojure/math.combinatorics {:mvn/version "0.1.6"}}}' -M
; Explanation for the shebang:
;   env -S  Allow multiple arguments to be passed to the following command
;   -Sdeps  Specify deps in EDN format
;   -M      Run the program as a "main" function


(ns foo
(:use [clojure.math.combinatorics :only (permutations)]))


(dorun (map #(println (apply str %)) (permutations "abcde")))

便携式解决方案(Linux 和 Mac)

请参阅 普朗克文件获得解释。它非常聪明!

#!/usr/bin/env bash
"exec" "clj" "-Sdeps" "{:deps {org.clojure/math.combinatorics {:mvn/version \"0.1.6\"}}}" "-M" "$0" "$@"


(ns foo
(:use [clojure.math.combinatorics :only (permutations)]))


(dorun (map #(println (apply str %)) (permutations "abcde")))

根据你的操作系统从下面的官方链接安装 clojure

Https://clojure.org/guides/install_clojure

现在我们可以很容易地执行下面的命令 只在 Mac 上测试过文件。其他复杂的步骤现在不需要我认为。

在文件 hello-world.clj中编写一个打印语句示例

(println "Hello world")

在终端中用以下命令运行程序

clj -M hello-world.clj

它会输出

Hello world

在 Clojure Version: 1.11.1.1200上测试