请在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上进行了几次讨论后,我们了解到这可能是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详细说明了我使用的特定开发工具(门户、热加载、命名空间重新加载、事件日志等)

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

+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
还在思考这个问题,将其作为接收此参数的 argument 而不是加载和更改命名空间的代码,这有意义吗?
总的来说,Clojure遵循小型、简单且可组合的方法。Leiningen提供很多旋钮和开关,旨在使事情“变得更简单”。添加额外的参数可以在牺牲小型、简单和可组合的同时使事情变得更容易。然后-e选项允许您运行任何代码,包括解决您提出的那个问题。
...