diff options
Diffstat (limited to 'content/article')
| -rw-r--r-- | content/article/clj5.md | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/content/article/clj5.md b/content/article/clj5.md index a426694b..37d1abe5 100644 --- a/content/article/clj5.md +++ b/content/article/clj5.md @@ -282,14 +282,41 @@ date.getMonth() 好了,现在你已经会偷 Java 代码用了。 -## Leiningen 插件 +在 Clojure 中写 Java,本质上同时使用 Lisp 的语法和 Java 的语义(semantics),类的概念都来自 Java,和 Clojure 格格不入。所以,除非必要不建议大量使用 Java 库,如果要用,也建议把 Java 代码封装在 Clojure 函数里。其实不少 Clojure 库就是通过封装 Java 库开发的,有些 Clojure 库还会专门用 Java 写,这样性能会更好。[^4] -## 只给测试用的依赖 +## 开发依赖和 Leiningen 插件 -## Footnotes +之前引入的依赖都是代码依赖,会被一起打包到 Uberjar 里。还有一类依赖是开发依赖,比如测试工具、代码格式化工具、Mock 工具、依赖管理工具等等。 + +还记得 `project.clj` 里的 `:profiles` 吗?其实每个 `:profiles` 都可以声明自己的依赖项。比如说 `:test` 就针对 `lein test`,只有在运行测试时才会加载里面声明的依赖。下面的代码引用了 `ring-mock`,这是用来测试 [Ring](https://github.com/ring-clojure/ring) 项目的 Mock 工具。[^5] + +```clojure + :profiles {:uberjar {:aot :all} + :test {:dependencies [[ring/ring-mock "0.6.2"]]}} +``` + +上述依赖不写在 `:profiles` 里也能用,但运行和编译代码时,都会把实际上并没有在生产代码里用到的依赖打包进去,会消耗额外的资源,因此应该分离。 + +此外还有 Leiningen 插件,他们和代码以及测试代码都没有关系,而是用来辅助开发的,写在 `:plugins` 设置项里,格式与依赖相同。下面是我常用的一些插件。 + +```clojure + :plugins [[lein-ancient "0.6.15"] + [lein-ring "0.12.6"] + [lein-cloverage "1.2.2"] + [dev.weavejester/lein-cljfmt "0.16.5"]] +``` + +- [lein-ancient](https://codeberg.org/xsc/lein-ancient):可以运行 `lein ancient` 命令检查依赖是否有新版本。 +- [lein-ring](https://github.com/weavejester/lein-ring):可以用 `lein ring` 运行基于 Ring 的 Web 服务,支持热重载,而且不需要在代码里编写运行服务器的逻辑,也不需要 `gen-class`,只需要编写 Handler。 +- [lein-cloverage](https://github.com/cloverage/cloverage):用 `lein cloverage` 运行测试并统计测试覆盖率,支持生成多种格式的报告,可以查看各个命名空间的形式覆盖率(forms coverage)和代码行覆盖率。还可以在生成的 HTML 页面里查看具体哪些语句没有被完全覆盖。 +- [lein-cljfmt](https://github.com/weavejester/cljfmt):用 `lein cljfmt` 格式化代码。 [^1]: `ns` 实际上只是把全局变量 `*ns*` 设置成了指定的命名空间。 [^2]: Cheshire 指《爱丽丝梦游仙境》里的「柴郡猫」。`cheshire` 库用的是 Java 库 Jackson。 [^3]: ~~是的,Java 的包名都又臭又长。~~ + +[^4]: 不是说 Java 性能有多好,是因为 Clojure 运行在 Java 之上,自然会有性能损失。 + +[^5]: Ring 是 Clojure 的 Web 服务器抽象库;Mock 是指用来测试、演示的假组件,比方说前端需要调用后端 API 进行开发,但后端还没开发完,这时前端就可以用假的 Mock API。 |
