请在2024 状态 Clojure 调查中分享您的想法!

欢迎!请参阅关于页面以获取更多关于如何使用此服务的信息。

+2
Clojure

这感觉像是一个相当基础的工程设置问题。我只是想向大师们学习,并获取一些同时开发库的最佳实践的想法

我写了很多小的程序和脚本在 Clojure,它们自然有很多小的辅助函数。当你写你的主要脚本/应用程序时,你会发现需要调整这些辅助函数,解决你发现的新的边缘情况等等。但这些辅助函数最终会在脚本和应用程序之间随意复制。像是转换格式或制作绘图等功能。很明显,这并不是理想的做法!

我希望将这些独立的辅助函数分割成它们自己的微型库

我看到的其中一种工作流程是 "monorepo" 设置。这是 thing/geom 所使用的模式。然而,我认为从长远来看,这确实有点问题,因为 Karsten Schmidt 添加了大量的精彩功能..但是他们都被打包并隐藏在单 repo 中。他有一个完整的矩阵库,以及用于处理 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

选择
 
最佳答案

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

在app/deps.edn中,你可以添加一个profile:dev-local,并在其中的:override-deps下指定{lib/lib {:local/root "../lib"}}

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

一些编辑器,如cursive,“明白”这种设置,可以为用户提供诸如跳转到定义等功能。

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

在稍微思考了一番之后...

方案1:有两个deps.edn文件。一个用于自己,一个用于他人。这并不理想,因为你实际上只会测试你自己的本地文件 :)

选项2:本地别名使用:override-deps键触发对依赖项的覆盖。有关详细信息,请参阅https://clojure.org/guides/deps_and_cli#override_deps。问题与选项1相似,即不需要同步本地和远程版本,因为它们的哈希值不需要相同。

选项3:只使用远程存储库,并将每个小更改推送那里,同时始终更新SHA哈希值。这有点繁琐,因为你需要持续推送和更新哈希值。此外,通过推送半成品或损坏的项目,你会暴露你的问题。

更深入地思考整个情况,我实际上并不确定如何改进。唯一的微不足道的生活质量改变可能是,如果能指定一个依赖项和一个SHA哈希值,然后有多个后备源。这样,你将首先在本地目录中指定依赖项,其次是远程(GitHub)存储库。这样,本地和远程都必须保持相同的SHA哈希值。但从某种意义上说,这就像是选项3,但没有额外的推送。

唯一万无一失的方法是一个外部守护程序,它会自动更新哈希值——但...这有点糟糕 :)

...