使用Leiningen构建Clojure 项目

Leiningen 是 Clojure 的项目构建工具,类似于 Maven。

事实上,Leiningen 底层完全使用 Maven 的包管理机制,只是 Leiningen 的构建脚本不是 pom.xml ,而是 project.clj,它本身就是 Clojure 代码。

这个解决方案, 比 gradle 似乎更加纯净. Gradle 配置文件采用的是 Groovy脚本.

我们知道这个命令:

lein repl

Leiningen 会启动一个 REPL。第一次 REPL 启动会比较慢,原因是 JVM 的启动速度慢。在 REPL 中可以看到运行结果。REPL 窗口本身支持直接运行 Clojure 代码,这样您可以直接在 REPL 中测试代码,能极大地提高开发效率。

使用Leiningen管理工程

借助Leiningen,你可以建立、构建、测试、打包和部署工程。也就是说,它能为你提供工程管理方面的一站式服务。

Maven是一个非常流行的Java依赖关系管理工具,而Leiningen就相当于Clojure世界中的Maven。重点是,Leiningen与Maven兼容,因此它可以毫无障碍地访问那些得到精心维护,且存放着海量Java类库的存储中心。此外,Clojure的库通常可以在Clojars5这个存储中心找到。所以,默认情况下Leiningen是启用了Clojars的。

使用Leiningen,你不用手动去下载那些在工程中需要用到的库。你只需要简单地声明一下工程的顶级依赖,剩下的事情Leiningen就会帮你自动搞定。

新建 lein 工程

使用 lein 命令,直接生成 lein 工程模板:

lein new app lein-cli

生成工程目录如下:

CHANGELOG.md
LICENSE
README.md
classes
doc
lib
project.clj
resources
src
test

导入 IntelliJ, 添加Clojure 语言环境支持, (IJ 会自动下载clojure-1.7.0.jar 到 lib 目录),标准的工程下:

.
|____.gitignore
|____.hgignore
|____.idea
| |____.name
| |____compiler.xml
| |____copyright
| | |____profiles_settings.xml
| |____lein-cli.iml
| |____libraries
| | |____Clojure_1_7_0.xml
| |____misc.xml
| |____modules.xml
| |____vcs.xml
| |____workspace.xml
|____CHANGELOG.md
|____classes
|____doc
| |____intro.md
|____lib
| |____clojure-1.7.0.jar
|____LICENSE
|____project.clj
|____README.md
|____resources
|____src
| |____lein_cli
| | |____core.clj
|____test
| |____lein_cli
| | |____core_test.clj

我们看一下项目配置文件project.clj

(defproject lein-cli "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]]
  :main ^:skip-aot lein-cli.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

这个配置文件本身就是 Clojure 代码.

1.下面几行

(defproject lein-cli "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}

定义了项目基本信息.

2.项目依赖

:dependencies [[org.clojure/clojure "1.8.0"]]

跟 maven 是一样的包管理机制.

3.程序编译运行信息

 :main ^:skip-aot lein-cli.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

启动程序

lein-cli.core.clj

(ns lein-cli.core
  (:gen-class))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (prn "Hello, World!"))

运行

$lein run

"Hello, World!"

光剑说

不知道为啥, 在 IJ 直接 Run core.clj, 没有输出.

看了一下 IJ 的报错提示:

下午7:03:12 IncompatibleClassChangeError: Found class com.intellij.psi.PsiReferenceRegistrar, but interface was expected
下午7:03:14 IncompatibleClassChangeError: Found class com.intellij.psi.PsiReferenceRegistrar, but interface was expected
下午7:03:14 All files are up-to-date

不知道是不是 IJ 的 Clojure 插件不支持导致的.

results matching ""

    No results matching ""