如何发布jar到clojars
Clojars 介绍
Clojars 是一个为开源 Clojure 类库打造的仓库,截止2017年9月17日,大概有19831个项目发布在上面。整个网站也是用 Clojure 编写的。
发布 Clojure library
1. 注册 clojars
前往 clojars 注册
2. lein 部署
1 | $ lein deploy clojars # lein deploy [repository name], here the repo name is clojars. |
如果不想加上 clojars
参数,则需要在当前项目下的 project.clj 添加如下内容
1 | {:deploy-repositories [["releases" :clojars] |
这里注意一点:
这里使用 :deploy-repositories
而非 :repositories
,原因是 :repositories
除了用于部署还会作为依赖源被项目使用。所以,如若必要,还是职责单一点好。这样,也可以加入 :user profile (~/.lein/profiles.clj) 供所有本地项目发布使用。
这个时候可以执行
1 | $ lein deploy |
如上,这时会弹出用户名和密码输入框。为了节省时间,避免每次输入,最好把用户凭证 (credentials) 以文件的形式存放到用户范围的目录下,即*~/.lein/credentials.clj*,并做加密处理。
3. 设置全局的 credentials map
首先,把如下的 credentials map 写入 ~/.lein/credentials.clj
1 | {#"https://clojars.org/repo" {:username "username_on_clojars" :password "password_on_clojars"}} |
其次,使用 gpg 加密该文件
1 | $ gpg --default-recipient-self -e \ |
加密后,即可删除原文件 ~/.lein/credentials.clj。然后在:deploy-repositories
map 中指定 :creds :gpg
1 | {:deploy-repositories [["releases" :clojars |
完成上述,lein deploy
的时候即可解密 ~/.lein/credentials.clj.gpg
,从中获取对应仓库的username
和password
(注:为了便于索引查找,credentials 使用正则表达式 #”https://clojars.org/repo“ 作为 key)
Error: gpg agent timeout
有时候,deploy 时会出现 gpg agent 超时的错误
1 | $ lein deploy |
仔细搜索文档会发现下面这句很重要的话
Due to a bug in gpg you currently need to use gpg-agent and have already unlocked your key before Leiningen launches, but with gpg-agent you only have to enter your passphrase periodically; it will keep it cached for a given period.
大意是,leiningen 需要用到 gpg-agent,而且在 lein deploy
之前,就应该解锁密钥。
不实际操作的话,还是很难弄懂这句话具体的指代。我们不妨思考一下。
1. 看看后台是否有个进程叫做 gpg-agent?
1 | ps -ef |grep gpg |
嗯,还真有!
2. gpg 直接解密 credentials.clj.gpg
1 | gpg --decrypt ~/.lein/credentials.clj.gpg |
这奇怪的等待让我不安,所以我使出了杀手锏 kill -9
,直接把 gpg-agent 干掉。
3. 重新 gpg –decrypt
1 | gpg --decrypt ~/.lein/credentials.clj.gpg |
终于可以输入 passphrase 了,解密完成。这大概就是上面引文所说的 unlock your key before Leiningen launches.
4. 重新部署
1 | lein deploy |
没有出现 gpg-agent timeout 的错误,部署完成。
提示
1
2
3
--default-recipient-self
Use the default key as default recipient if option --recipient is not used and don’t ask if this is a valid one.
The default key is the first one from the secret keyring or the one set with --default-key.
1 | --default-recipient-self |
参考链接
[1] Leiningen Deployment
[2] GPG: How to change the configuration