Coffee Break Clojure, Vol.5

Coffee Break Clojure, Vol.5

💡 原文中文,约9100字,阅读约需22分钟。
📝

内容提要

本文介绍用 Leiningen 管理 Clojure 项目:用 `lein new app` 创建项目,`project.clj` 声明依赖、入口和编译配置;`ns` 定义命名空间,用 `:require`、`:import` 引入 Clojure 与 Java 代码;依赖来自 Maven Central 和 Clojars,开发依赖与插件写在 `:profiles`、`:plugins` 中。

🔎

延伸解读

项目模板选择:app 与 default 的适用场景

文章指出,`lein new` 提供 app 和 default 等模板,模板只是预配置项目描述文件和结构,选哪个不影响开发。若写 Clojure 库用 default,写应用程序用 app。作者以 app 创建 antfighter 为例,并提到默认 LICENSE 是 Eclipse Public License,写着玩可删除,发布则建议考虑更换授权协议。

project.clj 关键配置项解读

project.clj 中,`:dependencies` 声明依赖向量,默认应加载 org.clojure/clojure;`:main` 指定入口命名空间;`:target-path` 是编译产物目录;`:profiles` 可为不同环境指定选项和依赖。`:uberjar` 配置用于 `lein uberjar`,将所有依赖打包成可独立运行的 Fat Jar,并启用 AOT 编译。

命名空间与依赖引入的实用规则

Clojure 文件路径与命名空间严格对应:src/antfighter/core.clj 对应 antfighter.core,文件名用下划线,命名空间用连字符。`:require` 引入其他命名空间,支持 `:refer` 和 `:alias`;`:import` 引入 Java 类。依赖来自 Maven Central 和 Clojars,添加后需重启 REPL 或应用才能生效。

开发依赖与插件应分离管理

文章强调,代码依赖会打包进 Uberjar,而测试工具、Mock 等开发依赖应放在 `:profiles` 的 `:test` 等配置中,避免打包无用资源。Leiningen 插件写在 `:plugins`,用于辅助开发,如 lein-ancient 检查依赖更新、lein-ring 运行 Web 服务、lein-cloverage 统计测试覆盖率、lein-cljfmt 格式化代码。

❓

Q&A

如何用 Leiningen 创建一个新的 Clojure 项目?

在终端运行 `lein new app 项目名` 即可创建应用项目,例如 `lein new app antfighter`。如果要创建库项目,则使用 `lein new default 项目名`。

Clojure 项目中的 project.clj 文件有什么作用?

project.clj 是项目描述文件,用于声明项目名、版本号、依赖项、入口命名空间、编译输出路径以及不同环境下的配置(如 :profiles 和 :plugins)。

在 Clojure 中如何引入其他命名空间的符号?

使用 `:require`,例如 `(:require [clojure.test :refer :all])`。可以通过 `:refer` 直接引入符号,或用 `:alias` 设置别名,不推荐使用 `:use`。

Clojure 项目如何添加外部依赖?

在 project.clj 的 `:dependencies` 向量中添加依赖,格式为 `[依赖名 "版本号"]`,例如 `[cheshire "6.2.0"]`。保存后运行 `lein deps` 下载依赖。

如何在 Clojure 中调用 Java 类和方法?

使用 `:import` 引入 Java 类,例如 `(:import [java.util Date])`。创建实例用 `(Date.)`,调用方法用 `(.getMonth date)` 或 `(. date getMonth)`,静态方法用 `类名/方法名` 如 `(java.time.Instant/now)`。

Leiningen 的 :profiles 和 :plugins 有什么区别?

`:profiles` 用于为不同环境(如测试、uberjar)指定依赖和选项,例如 `:test` 下的开发依赖;`:plugins` 用于声明 Leiningen 插件,辅助开发,如 lein-ancient、lein-ring 等。

🏷️

标签

➡️

继续阅读