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

欢迎!请查看关于页面了解更多关于这个网站的信息。

0票数
Clojure CLI

这个问题是在尝试在WSL2(运行Ubuntu 22)上运行一个在Windoze上构建的Clojure项目时出现的。

原始的: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运行的操作系统选择正确的local-path值。

当然,这也可能是在macOS运行Parallels上出现的问题,其中文件系统集成也很紧密,但虚拟机可以有不同的值来表示主机上的相同路径。鉴于Linux发行版、Windows版本和macOS版本的 Cambrian 爆炸,预先知道这些值可能并不实际。这应该是开发者的责任,根据具体开发环境设置这些值。因此,我认为,提供一种选择,即提供一个包含某些高级OS选项的映射而不是字符串就足够了。

在我看来,这些值总是以开发者为中心,并且可能受雇主的DevOps政策约束。

(是的,这是我的实现偏颇,但我愿意支持任何处理此问题的通用方法。)

1 个答案

0票数

顺便说一句,我建议使用相对路径代替:local/root的绝对路径。绝对路径是不必要的,只会使事情变得复杂。

在我的配置中,所有项目均位于~/code目录下。因此,~/code/project~/code/some-lib,在deps.edn文件中,我只需使用从项目中的:local/root "../some-lib"即可,一切正常工作。无论是WSL/Windows还是其他任何环境。

我还有其他配置,所有内容都位于~/code/project~/code/project/packages/some-lib目录下,那里我同样使用:local/root "packages/some-lib"而不是绝对路径。

(实际上,大部分项目仍然使用project.clj,但使用的方法相同)

如果您避免绝对路径,您的问题就迎刃而解了。😉

对于本地项目引用,我这样做(所有内容都在同一顶级工作目录下),当然。但处理第三方供应商的jar文件时并不总是方便。这些文件往往嵌入在基于标准安装默认值的长路径中,尤其是在Windows系统上。
如果它们是常规JAR文件,您可以将它们复制到项目中吗?比如一个`vendor`目录?我过去曾经这样做过,因为某些东西无法通过Maven获得。

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

不过,您最后一点很有帮助。然后就是按照正确的别名运行它。能否调用多个别名?我不认为我尝试过。例如,我有一些与自定义别名中内存相关的JVM设置,当我知道可能需要更多的RAM时,我会这样运行它。无论如何,非常感谢这个建议!
是的,多别名没有任何问题。只需使用 clj -A:foo:bar:etc。
...