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

欢迎!请参阅关于页面以了解有关此功能的更多信息。

0
Clojure CLI

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

原始的: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上出现的问题,那里文件系统集成也很紧密,但来宾操作系统在同一主机上的路径可能具有不同的值。鉴于Linux发行版、Windows版本和MacOS版本的剑桥爆炸,事先知道这些可能不切实际。因此,根据具体开发设置设置这些值是开发者的责任。在我看来,至少提供一些能力来提供具有高度OS选项的映射以替代字符串就足够了。

对我来说,这些值显然都是以开发为中心的,并可能受到雇主DevOps政策的约束。

(是的,这是我的实现偏见,但我将高兴地支持任何处理此问题的通用方法。)

1 答案

0

FWIW,我建议只使用相对路径: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 的内存设置。无论如何,谢谢这个建议!
  by
是的,多个别名没有问题。只需使用 clj -A:foo:bar:etc.
...