Clojure China

不用 Lein/Boot 部署代码到 Clojars

#1

Clojure 部分代码是按照 Java 生态的习惯打包发布到 Maven 仓库上面的.
作为 npm 程序员, 我对 Maven 相当了解…
Clojars 是一个类似 Maven 的仓库, 相对于 Maven, 更多包会发布在这里.
一般要发布 Clojure 或者 ClojureScript 模块, 就是发布到 Clojars.

一般教程都是基于 Lein 或者基于 Boot 用 deploy 命令发布,
但是对于不用 Lein 或者 Boot 的 cljs 开发者来说, 我就觉得挺不爽的.
那两个东西启动和部署太慢了, 所以一直在寻求替代方案吗最后基于 cljs 快速冷启动.

原理

我在论坛上发了一个帖子求助: Feature request: release to Clojars with ClojureScript

有人给了比较精辟的回复

I’ve been doing this with the clj cli. You can generate dependencies and paths into your pom.xml from deps.edn by running clj -Spom. Then run mvn deploy. Here’s an example pom.xml file for a project I published: https://github.com/protocol55/styleguide/blob/master/pom.xml

我一开始没有看, 后来反应过来, 就是要先有一个 pom.xml 文件, 然后 Maven 就能上传了.
后面的回复当中还有给了一个更详细的教程, 具体到命令怎么用: Clojure projects from scratch

首先因为是 Clojars, 需要填写这边的账号密码, 本地先加一个配置文件 ~/.m2/settings.xml:

<settings>
  <servers>
    <server>
      <id>clojars</id>
      <username>username</username>
      <password>password</password>
    </server>
  </servers>
</settings>

后面的步骤主要是 clj -Spom 可以生成 pom.xml 文件. 最后就是 mvn deploy 了.
生成的 pom.xml 有几个地方是需要手动修改的, 默认没有 Clojars 的配置.
我不重复了, 戳上面的原文链接看细节.
我按着跑了一遍, 最后跑成功了. 突然感觉清晰了.

meyvn

然后我在想 pom.xml 是 XML 维护起来太麻烦了, 能不能用脚本处理一下,
想起来后面的回复当中有人写了 meyvn 这个工具.
是一个 Maven 的封装的样子. 突然觉得可能就是做这个事情的.
Meyvn 依赖 clj 命令还有 mvn 命令, 所以需要 brew 提前安装好.

安装步骤的话, 首先在 $HOME/.clojure/deps.edn

:aliases {:meyvn {:extra-deps {org.danielsz/meyvn {:mvn/version "1.0.5"}}}}

Clojars Project 注意版本号用最新的吧, 可能以后版本安装方式会简化一下.

然后要找一下系统当中 Maven 的安装路径, 需要执行一些命令:

brew install coreutils
greadlink -f `which mvn` | awk '{gsub("bin/mvn", ""); print}'
# 得到结果 /usr/local/Cellar/maven/3.5.4/

拿到安装路径之后, 在 /user/local/bin/ 创建一个命令 myvn:

touch /usr/local/bin/myvn
chmod +x /usr/local/bin/myvn

其中执行的脚本用到前面的路径, 我这边看起来简单是这样的:

#!/bin/sh
M2_HOME=/usr/local/Cellar/maven/3.5.4/ clj -A:meyvn -m meyvn.core "$@"

保存之后就有一个可执行的命令了. 然后就是需要一个 meyvn 的配置文件 meyvn.edn.
我看了下文档没写清楚, 但是项目里又一个神似的, 直接可以抄:

{:pom {:group-id "org.danielsz",
       :artifact-id "meyvn",
       :version "1.0.5",
       :name "Better builds for Clojure"}
 :packaging {:jar {:enabled true
                   :remote-repository {:id "clojars"
                                       :url "https://clojars.org/repo"}}}
 :scm {:enabled true}}

这些完成之后, 运行 myvn deploy 就会开始代码的打包和部署了.
除此运行会自动下载依赖, 很多的依赖, 我的文章都快码完了, 依赖还没有下载完…
后面运行好一些, 但是冷启动还是挺慢, 最终完成发布还是需要十几秒.
此外账号密码似乎读取的时候前面 Maven 的配置, 所以直接通过了.

其他

不管怎样, 整个方案是可以用来替代 Boot 来进行发布的.
实际上用 clj 加上 mvn 命令应该说可以很快的, 但出维护性方面不知道怎么办.
我暂时先用这个方案, 后面想办法改进.
Meyvn 的文档其实应该说只有 README, 用到其他配置我还得想想.

1赞