请在2024年Clojure调查问卷!中分享您的想法。

欢迎!请参阅关于页面了解更多关于如何使用本站的信息。

0 投票
Clojure CLI
编辑

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

我正在尝试实现类似在Leiningen项目上做的事情,在Cursive中启动REPL,并调用声明component start函数的命名空间。

阅读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 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 Custom REPL Startup详细说明了通用方法

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

Practicalli Project Templates为seancorfield/deps-new提供了生产级别的模板,其中包括包含aero示例的dev/user.clj自定义user命名空间和practicalli/service模板

+1 投票

您可以在命令行中将 -e 与其他“主选项”结合使用,以便在特定命名空间中启动

> 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
我还在思考这个问题,将此作为代码加载和更改命名空间的自定义参数而不是接收的参数,这似乎没有意义?
Clojure总体上遵循小、简单和可组合的方法。Leiningen提供很多可调节的设置,旨在让事情变得“简单”。添加额外的参数可以在牺牲小、简单和可组合的前提下使事情变得更容易。然后,-e选项允许您运行任何代码,包括解决您提出的问题。
...