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

欢迎!请查阅关于页面了解有关此工作方式的更多信息。

+2
Clojure

这感觉更像是一个相当基本的项目设置问题。我只是想向专家学习,并获得一些关于如何并行开发库的最好方法的想法。

我写了很多小的程序和脚本在 Clojure 中,这些自然有很多小助手函数。当你编写主脚本/应用程序时,你会对这些助手进行微调,解决你暴露的新边界情况等。但这些助手函数最终会在脚本和应用程序之间随意复制。例如,格式转换函数或做绘图等。显然,这不是最佳选择!

我希望将这些独立的助手函数分割成自己的小型库。

我看到的其中一个工作流程是“monorepo”配置。这是thing/geom所使用的架构。然而,我认为从长远来看,这证明是有点问题,因为 Karsten Schmidt 末尾积累了一大堆很酷的特性.. 但它们都被包装起来,隐藏在单一仓库中。他那里有一个整个矩阵库,还有用于处理三维几何等的渲染器等。但我猜这是可发现性问题,也许人们不想拉取整个大杂烩来访问角落里的某个工具。

相反,我正在尝试以优美的 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。

唯一万无一失的方法是一个外部守护程序,它可以自动更新散列——但…这有点糟糕:)

...