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,并在组件启动函数声明的命名空间中调用它。

阅读nREPL文档https://nrepl.org/nrepl/usage/server.html,Leiningen中有:init-ns,这可以完成这个工作。

在Clojure slack线程中有几次讨论https://clojurians.slack.com/archives/C0744GXCJ/p1681750400843819,以及我们尝试在Cursive REPL和Clojure CLI中加载一个命名空间并尝试了很多次后,我们理解这可能是一些可能添加到Clojure CLI的功能。

Colin帮助我找到了在Leiningen中实现此功能的代码位置:https://github.com/technomancy/leiningen/blob/24fb93936133bd7fc30c393c127e9e69bb5f2392/src/leiningen/repl.clj#L175-L195

我怀疑这是否有意义,如果它是,我非常激动能够帮助实现这个功能,并开始为Clojure社区贡献。

2 个回答

+1
by
被选中 by
 
最佳答案

在开始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重新加载详细介绍了我所使用的特定开发工具(门户、热加载、命名空间重新加载、事件记录等)

Practicalli项目模板提供了seancorfield/deps-new的production级模板,包括自定义 dev/user.clj user 命名空间,以及包含aero的 practicalli/service 模板的Integrant REPL示例

+1
by

您可以将 -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=>
by
它对我来说不起作用。我得到了以下结果


➜  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=>
by
我弄明白了。我在 -e 命令之前输入了 -r,所以它不起作用 :D
by
仍在思考这个问题,作为接收此参数的参数而不是加载数代码和更改命名空间代码,这没有意义吗?
by
Clojure 通常遵循小而简单、可组合的方法。Leiningen 提供了许多旋钮和控制器,旨在使事情变得“简单”。添加额外的参数可以让事情变得更容易,但会牺牲小而简单、可组合的特点。然后 -e 选项让您可以运行任何代码,包括解决您提出的问题。
...