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


69

我已经在Linux Mint机器上安装了Geany,并编写了一些简单的代码。只是一个很小的世界,即可开始使用该语言。

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

如何运行此代码?我没有使用IDE或预先打包的东西,而只是使用简单的文本编辑器Geany。

我应该运行什么命令?

Answers:


71

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

在脚本中也可以很好地工作!

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

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

我通常看到的lein(见下文)工具的一个优点clj是,到那时为止,可以lein处理构建打包代码库的更多过程。但是,还有其他处理方式(请参见packuberdeps或cambada),以及clj胜过IMHO。

leinlein-exec

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

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

如上所述,leinover的一个优点clj是它是一个完整的构建工具,并且可以使用lein jar或来为您制作jar / uberjars。lein uberjar,部署等工作。

对于ClojureScript

我建议http://planck-repl.org/。现在,它支持(引导)快速启动ClojureScript脚本,而无需启动JVM或Clojure。对于大多数脚本任务,快速执行很重要,因此,当您不需要特定于JVM的任何东西时,这是我的第一建议。

对于较大的项目,而不仅仅是repl / cli样式的使用,您可能希望查看Shadlow-CLJS,因为它易于合并香草JS项目。与FWIW一样,Shadow可以很好地与deps和lein集成在一起,并且具有内置的原始代码重载功能,例如figwheel。

drip 加快启动时间

注意:多年来我一直没有尝试使用此工具,因此不知道它是否仍然有效或维护得如何。

Drip是一个精巧的小工具,可为您提供准备启动的预引导JVM映像。这对于减少JVM应用程序的启动时间可能非常有用。Clojure可能需要一段时间才能自我引导,因此滴水是帮助加快该过程的好工具。当您编写小的脚本时,尤其是这种情况,通常期望它们可以快速运行。如果您使用的是leiningen,请看一下lein-drip插件。

java

当然,您可以按照另一个答案的建议使用

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

但是您不会经常在野外看到这种情况,因为必须找到您的路径clojure.jar并手动为依赖项构造类路径很麻烦。但是,要知道,每个人都有。


1
谢谢!sudo apt-get install clojure然后clojure hello.clj
CornSmith 2014年

2
lein exec是必经之路。
2015年

@qed-同意;那就是我通常走的路。
2015年

如果您正在寻找它,我写了一篇简短而肮脏的博客文章,介绍如何安装exec插件。
Quazi Irfan

3
@qed为什么lein exec“要走的路”?为什么不使用clojure
亚历山大·普雷斯伯

58

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

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

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

java -jar your_app.jar

命令

PS您可以lein以下文章中阅读如何使用-它描述了基本任务和配置


1
也许还要补充一点,他必须首先使用lein new创建一个项目,并将clj文件作为该项目的一部分,例如core.clj
Michiel Borkent

是的,它对创建项目可能很有用……我在我的文章中介绍了如何使用lein进行链接
Alex Ott

亚历克斯,我一直在尝试,但这只是显示一个空行。我的文件中有一个println,但它从不打印;有什么东西不见了吗?java -cp clojure-1.6.0.jar clojure.main .. \ hey.clj
Gans

对我来说效果很好...您是否在源代码的顶层或函数中包含println?如果是更高版本,则该函数将被编译,但不会运行echo '(println "test")' > 1.cljjava -cp ~/.m2/repository/org/clojure/clojure/1.6.0/clojure-1.6.0.jar clojure.main 1.clj
Alex Ott 2014年

我不断得到Exception in thread "main" java.io.FileNotFoundException: <FILENAME>.clj (No such file or directory)
Snehaa Ganesan

15

安装完lein和lein-exec插件后,运行创建的.clj文件非常简单

lein exec hello.clj

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

lein exec hello.clj arg1 arg2 arg3

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

(foo *command-line-args*) 

9

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

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

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

java -jar cool_app.jar

2

如果您只想执行一个文件,如何将其通过管道传递给repl,例如:

cat $PATH_TO_FILE | lein repl


1

Drip现在可能是此问题的最佳答案(有关在Clojure中使用Drip的详细信息,请参见Drip的Wiki)。

Cake合并到Leiningen中,此后被Drip取代为Clojure自动化的最稳定的实现-在此处查看类似问题的答案



0

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

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

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

注意:我是Clojure的新手,我不确定为什么使用'^:skip-aot`,但尚未检查。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.