2024 Clojure 状况调查! 中分享您的想法。

欢迎!请查看 关于 页面获取更多关于如何使用本网站的详细信息。

+2
img Clojure

这个问题感觉像是一个相当基本的项目设置问题。我只是想向大师们学习,并获取一些关于如何并行开发库的最佳想法

我写了很多 Clojure 的小程序和脚本,这些自然有很多小的辅助函数。当你编写主要的脚本/应用程序时,你最终会对这些辅助函数进行微调,覆盖你暴露的新边缘情况等。但是,这些辅助函数最终在脚本和应用程序之间随意复制。像转换格式或制作图表等函数。显然这不是最佳方案!

我想将这些独立的辅助函数分离开来,形成它们自己的小型库

我见过的一个工作流程是“monorepo”设置。这是 thing/geom 项目采用的设计。然而,我认为从长远来看,这证明是有一些问题的,因为 Karsten Schmidt 最终开发出了一大堆很棒的功能...但是它们都被包裹和隐藏在单一仓库中。那里有一个整个矩阵库,以及用于处理 3D 几何的渲染器等。但是,我猜想存在一个可发现性问题,也许人们不想为了访问一个角落的工具而拉取整个套房。

因此,我正在尝试找到一种很好的 deps.edn 方法来完成这个任务,但我真的不知道语言设计者的预期工作流程是什么。

有一种方法可以处理本地仓库: https://clojure.org/guides/deps_and_cli#_using_local_libraries
还有一种方法可以处理远程仓库: https://clojure.org/guides/deps_and_cli#_using_git_libraries (或者你可以与 Maven 仓库一起工作)

但是你怎么一次做这两件事呢?显然,在我开发应用程序的过程中,我显然需要调整和添加库中的功能和特性 :) 我是否应该有一个指向本地目录的本地开发 deps.edn,然后再有一个指向远程仓库分发 deps.edn?(如果这样,如何使用 Cider 设置它?)

或者我可以有一个外观本地并且在没有找到内容时回退到远程仓库的 deps.edn

或者也许还有我没有考虑的更好的选择?

想知道大家是如何处理这个问题的

(也发布在这里: https://clojureverse.org/t/how-to-developing-multiple-libraries-applications-simultaneously/8660

2 个回答

+1
by
选择 by
 
最佳答案

假设你有两个项目:app 和 lib
app 使用 lib 中的几个函数
你大部分时间都在开发 app,但有时需要修改 lib 中的某些内容。

在 app/deps.edn 中,你可以添加一个 profile:dev-local,其中包含一个:override-deps {lib/lib {:local/root "../lib"}}

然后,你可以直接开发/重新加载 lib 和 app 中的所有函数,而不需要重新启动你的 repl。只需保存文件即可。

一些编辑器,如 cursive,“理解”这种设置,并做一些酷的事情,比如为你进行定义的跳转。

by
谢谢。是的,我认为这是一个相当实用的解决方案。只需将更新推送到线上,并确保您的本地库与远程版本相同
0
by

经过一番思考...

选项 1:有两个 deps.edn 文件。一个供自己使用,一个供他人使用。这样做并不理想,因为您最终可能只会测试您本地的文件 :)

选项 2:有一个本地别名,该别名通过 :override-deps 键覆盖依赖项。有关详细信息,请参阅这里。问题类似于选项 1,您不会被迫同步远程和本地版本,因为它们不需要具有相同的哈希

选项 3:仅使用远程控制台,把每一次的细微改动都推送到那里,并始终更新 SHA 哈希。这样做颇为繁琐,因为你需要不断推送和更新哈希。同时,你也通过推送半成品的问题暴露了自己的不足。

更深入地考虑整个情况,我实际上并不清楚该如何改进。唯一的轻微生活质量提升可能是如果能够指定一个依赖项和 SHA 哈希以及多个备选源。这样你首先有一个本地目录,然后是远程的(GitHub)目录。这样本地和远程目录就必须保持在相同的 SHA 中。但从某种意义上说,这只是一个没有额外推送的选项 3。

唯一万无一失的方法是使用一个外部守护进程,它会自动更新哈希 - 但 ... 这似乎有点“龌龊”:

...