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

欢迎!请访问关于页面以了解有关此内容的一些更多信息。

0
Clojure CLI

这个问题出现在尝试在WSL2上运行一个Clojure项目,该项目最初是在Windoze上构建的。

原始的:local/root路径以"C:/..."开始,但在WSL2(运行Ubuntu 22)上它们需要转换为"/mnt/c/..."才能运行。

手动更改它们可以使其工作,但这很麻烦。甚至不想提到源代码控制的烦恼。

想象自动转换规则感觉令人讨厌,如果我们可以简单地指定操作系统特定的值会更好。也许像这样的东西:

{some.ns/some-lib {:local/root 
                    {:local-path/windows "C:/..." 
                     :local-path/linux "/mnt/c/..." 
                     :local-path/macos "/some/other/dev/path"}}}

在运行时,应基于JVM运行的操作系统选择正确的本地路径值。

当然,这也可能是在MacOS运行Parallels上出现的问题,其中文件系统集成也很紧密,但来宾操作系统可以在主机上具有不同值的相同路径。考虑到Linux发行版、Windows版本和MacOS版本的 Cambrian爆炸,事先知道这些值可能并不实用。开发者将负责根据具体开发设置设置这些值。因此,我认为,可选地提供映射以包含某些高级操作系统选项,以代替字符串,就足够了。

对我来说显然,这些值始终以开发者为中心,并且可能受雇主的DevOps策略的影响。

(是的,这是我实现偏差的一部分,但我将乐意支持任何处理此问题的通用方式。)

1 答案

0

关乎紧要的事,我建议仅仅使用:local/root的相对路径。绝对路径不是必须的,只是会使事情变得复杂。

在我的配置中,所有项目都放在~/code目录下。因此,在deps.edn文件中,我只从项目中使用:local/root "../some-lib",一切工作都非常顺利。无论是执行在WSL/Windows还是其他任何系统上。

我还有其他配置,所有内容都在同一个~/code/project目录及其子目录~/code/project/packages/some-lib中,我同样使用:local/root "packages/some-lib"而不是绝对路径。

(实际上,大多数项目仍然使用project.clj文件,但是同样的方法同样适用)

如果您避免使用绝对路径,所有问题都可以迎刃而解。;)

by
对于本地项目引用,我这样操作(所有操作都在顶级工作目录之下),当然。但是在处理第三方供应商的jar文件时,这可能并不总是那么实用。这些文件通常位于基于标准安装默认值的复杂路径中,尤其是在Windows操作系统上。
by
如果它们是常规的JAR文件,您可以将它们复制到项目中吗?比如一个`vendor`目录?我过去就这样做,对于那些无法通过Maven获得的项目。

您也可以移动东西到一个主机特定的别名,并相应地激活它。所以:`:aliases {:win {:extra-deps ...} :linux {:extra-deps ...}}`
by
大多数情况下,它们除了JAR文件外还涉及其他二进制文件。

然而,您最后一点很有帮助。然后只需使用正确的别名执行它。可以调用多个别名吗?我觉得我从未尝试过。例如,我有一些与JVM相关的自定义别名,当我知道可能需要更多的RAM时才会运行。无论如何,谢谢您的建议!
by
是的,多别名没有问题。只需使用clj -A:foo:bar:etc。
...