2024年Clojure状况调查中分享您的看法!

欢迎!请参阅关于页面以获得更多有关如何使用该信息的信息。

0
Clojure CLI
编辑

安装https://github.com/seancorfield/deps-new后,我使用命令clojure -Tnew app :name clojure-backend创建了一个项目,并遵循了pedestal组件指南http://pedestal.io/guides/pedestal-with-component。仓库在:https://github.com/cloped/clojure-backend

我试图实现我在Leiningen项目中曾经做的事情,在Cursive上启动REPL并调用它,在声明组件启动函数的namespace中。

阅读nREPL文档https://nrepl.org/nrepl/usage/server.html,在Leiningen中有一个:init-ns,这使得这一切都可以工作。

在Clojure Slack线程https://clojurians.slack.com/archives/C0744GXCJ/p1681750400843819上进行了几次讨论,并在Cursive REPL和Clojure CLI上尝试加载所需的namespace,我们了解到这可能是一个可以用于Clojure CLI的功能。

Colin帮助我找到这是如何在Leiningen中实现的:https://github.com/technomancy/leiningen/blob/24fb93936133bd7fc30c393c127e9e69bb5f2392/src/leiningen/repl.clj#L175-L195

我很想知道这是否对Clojure CLI有意义。如果是这样的话,我很兴奋能够帮助实现它,以开始我对Clojure社区的贡献。

2 个回答

+1

选择
 
最佳答案

在启动REPL时,无需将代码引入任何工具以切换命名空间。

定义自定义 user 命名空间 已成为在开发期间管理组件生命周期(启动、停止、重启)的一种长期存在的方法,这种方法不依赖于编辑器、工具或组件库,即它与所有事物都兼容。

在项目中创建一个 dev/user.clj 文件,用于定义 user 命名空间。除非代码位于 comment 形式中,否则此命名空间中的代码将在REPL启动期间加载。

REPL以 user 命名空间启动,因此 dev/user.clj 中定义的函数无需切换到另一个命名空间或使用完全限定名称即可立即使用。

在自定义 dev/user.clj user 命名空间中定义管理组件的函数,使它们立即在REPL使用的默认命名空间中可用。

这种方法的优势是代码更整洁,开发支持代码与生产代码之间的分离更清晰。

例如,通过Clojure CLI别名包含component repl和integrant repl库,这样就不会给CI工作流程和部署的uberjar增加负担。

自定义 user 命名空间包含用于component repl(或如 Integrant REPL 之类的其他开发时组件库)的require语句

我个人使用这种方法来启动一系列支持开发工具,无论它是Leiningen还是Clojure CLI项目。

Practicalli自定义REPL启动 详细说明了一般方法

Practicalli REPL重载 详细说明了我使用的特定开发工具(portal,hotload,命名空间重载,事件日志等)

Practicalli项目模板 提供了seancorfield/deps-new的生产级别模板,其中包括自定义的 dev/user.clj user 命名空间,practicalli/service 模板包含与aero集成的Integrant REPL示例

+1

您可以在命令行中将-e与其他"main opts"结合使用,以在特定命名空间中启动

> cat src/my_proj/api.clj
(ns my-proj.api)

(defn foo [opts]
  (println (get opts :bar "No :bar passed!")))

> clj -M -e "(require 'my-proj.api)(in-ns 'my-proj.api)" -r
#object[clojure.lang.Namespace 0x7957dc72 "my-proj.api"]
my-proj.api=>
它对我没用。我得到了以下内容


➜  clojure-backend git:(main) ✗  clj -r -e "(require 'clojure-backend.core) (in-ns 'clojure-backend.core)"
警告:隐式使用具有选项的clojure.main已被弃用,请使用-M
你好
在调用in-ns之后
Clojure 1.11.1
user=> *ns*
#object[clojure.lang.Namespace 0x68dcfd52 "user"]
user=> (my-function)
在(REPL:1:1)编译时出现语法错误。
无法在该上下文中解析符号:my-function
user=>
我想通了。我在-e命令前输入了-r,所以它没有用 :D
我还在思考这个问题,将命名空间作为参数接收,而不是要加载和更改代码,这有什么意义吗?
by
Clojure 通常遵循小而简单、可组合的方法。Leiningen 提供了许多可调节的功能,旨在使事情变得“简单”。添加额外参数可以简化操作,但代价是丧失小而简单、可组合的特性。然后 -e 参数选项允许您运行任何代码,包括解决您提出的问题。
...