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

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

0
Clojure CLI

此问题是在尝试在原始于 Windows 上构建的 Clojure 项目上运行 WSL2 时出现的。

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

手动更改它们会让它们工作,但很繁琐。甚至不愿提及源代码控制的问题。

想象自动转换规则感觉真的很糟糕,如果能简单地指定特定于 OS 的值那就更好了。也许像这样:

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

在运行时,应根据 JVM 运行的 OS 选择正确的本地路径值。

显然,这也可能在运行 Parallels 的 MacOS 上成为问题,其中文件系统集成也很紧密,但在宿主 OS 上同一路径可能有不同的值。鉴于 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,但使用的方法是一样的)

如果你避免使用绝对路径,你的整个问题就会消失。 ;)

by
对于本地项目引用,我这样操作(所有内容都在同一个顶级工作目录下),当然。但这在与第三方供应商的jar文件打交道时并不总是实用的。这些文件常常基于标准安装默认设置而隐藏在很长的路径中,尤其是在Windows系统上。
by
如果它们是常规JAR文件,你可以将它们复制到项目中的?就像一个 `vendor` 目录?我曾经为一些通过Maven不可用的东西这样做过。

你还可以将东西移动到特定于宿主机的别名中,并相应地激活它。所以只:`:aliases {:win {:extra-deps ...} :linux {:extra-deps ...}}`。
by
大多数时候,它们还涉及除了jar文件之外的二进制文件。

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