使用clj1.9快速启动clojure的repl
随着Clojure1.9的发布,给我们带来了spec和命令行的支持. mac下通过HomeBrew可以快速安装最新版clojure,自带clj命令行工具
|
|
linux平台按照
|
|
然后通过clj
命令就可以快速启动clj的repl.
原来用lein repl
和boot repl
启动需要1分钟,clj
命令启动只需要短短的几秒。
1. 命令行工具clj简介
clojure命令行工具可以用来:
- 启动REPL(Read-Eval-Print-Loop)
- 运行clj程序
- 求值clj表达式
当然,我们可以在clj中使用JVM平台丰富的优秀三方库
启动clj的时候,clj会从安装目录(/usr/local/Cellar/clojure/1.9.0.273/deps.edn)
,用户配置(~/.clojure/deps.edn)
,工程目录(./deps.edn)
依次读取deps.edn
文件合并,该文件可以:
- 指定从本地,github工程,maven仓库或者clojar等地方拉取jar包依赖。
- 指定source目录,默认是src(安装目录的deps.edn指定的)
- 指定alias,可以通过-R参数来指定加载某个alias的配置
- 指定仓库位置,默认的
:mvn/repos
是maven中央仓库和clojar
使用clj -Spath
可以得到计算出的classpath信息,clj -Sverbose
可以输出重要的路径信息,clj -Spom
可以根据当前工程生成pom.xml
文件
一个deps.edn
示例:
|
|
启动repl之后就能自动将maven仓库里的sparkledriver库装载到classpath以供使用。
如果要书写clj程序,默认clj会从当前目录下的src读取源文件,如果源文件写了main
函数,那么
可以用clj -m 命名空间
来运行,比如我有这个结构的工程,创建了src/pdf.clj
|
|
one more thing
clj支持shebang了,可以作为脚本直接运行。。。
|
|
2. 使用tools.nrepl
tools.nrepl
是clj提供的远程repl服务工具,可以启动一个远程的repl服务端,也可以用来连接
另一个使用tools.nrepl
启动的repl服务端.这样就能够远程求值,动态替换函数实现,实时查看远程
运行时讯息等等。我们常用来做IDE的补全和求值。
在deps.edn里加上一行org.clojure/tools.nrepl {:mvn/version "0.2.13"}
,然后运行clj打开repl
user=> (require '[clojure.tools.nrepl.server :as s])
nil
user=> (s/start-server :port 55555)
#clojure.tools.nrepl.server.Server{:server-socket #object[java.net.ServerSocket 0x749f539e "ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=55555]"], :port 55555, :open-transports #object[clojure.lang.Atom 0x33abde31 {:status :ready, :val #{}}], :transport #object[clojure.tools.nrepl.transport$bencode 0x6a969fb8 "clojure.tools.nrepl.transport$bencode@6a969fb8"], :greeting nil, :handler #object[clojure.tools.nrepl.middleware$wrap_conj_descriptor$fn__577 0x3028e50e "clojure.tools.nrepl.middleware$wrap_conj_descriptor$fn__577@3028e50e"], :ss #object[java.net.ServerSocket 0x749f539e "ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=55555]"]}
这样,nrepl server就启动在55555端口了
3. 集成cider
光有nrepl其实还没啥用,我们IDE常用的code reference,jump to definition等功能,nrepl都没有,但是cider有。cider提供的nrepl支持clj的debug,更好的错误提示,reload,变量信息,补全等功能。
在deps.edn去掉tools.nrepl,加上cider/cider-nrepl
,完整示例:
|
|
放在~/.clojure/deps.edn
就可以不用在每个工程都指定了,然后启动server(点击可放大):
(require '[clojure.tools.nrepl.server :as nrepl-server])
(require '[cider.nrepl :refer (cider-nrepl-handler)])
(nrepl-server/start-server :port 7888 :handler cider-nrepl-handler)
如果你用的emacs,那么可以直接cider-connect
链接上去high了。
4. 完整配置
我的~/.clojure/deps.edn
|
|
我的~/.clojure/init.clj
|
|
启动命令使用clj -i ~/.clojure/init.clj -r
,读者可以自行alias
,笔者的14版最低配mac启动只花了1秒。
最后奉上两个实用的elisp函数,用于修复projectile和cider正确识别含有deps.edn
的工程,放在init.el里就行。前提是安装了cider和projectile.
|
|
- 原文作者:Chris Wang
- 原文链接:https://www.sound2gd.wang/post/%E4%BD%BF%E7%94%A8clj1.9%E5%BF%AB%E9%80%9F%E5%90%AF%E5%8A%A8clojure%E7%9A%84repl/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。