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

欢迎!请查看关于页面以获取更多关于如何使用本网站的信息。

+5
tools.deps
重新标记

我在 Slack 上对 Powershell Clojure CLI 命令行在 Windows 上引入的问题表达了很多意见。Alex Miller 要求描述这些问题,结合社区反馈,并在某种决策表中提出可能的解决方案。

虽然我不确定这种格式是否符合Alex Miller的要求,但以下是我的尝试
Clojure CLI问题

在本文档中,我提出了两个可能的解决方案。
- 在 Powershell 脚本上使用二进制包装器
- 用可移植二进制重新编写的bash/Powershell脚本

这两个解决方案的编码工作量相对较小,我已经产生了探索性项目。
- Clojure PowerShell CLI包装器。已在Windows上测试。
- 可移植Clojure CLI重写。在Windows和Linux上测试,表明便携式解决方案并不难找到。

我希望收到关于这些问题以及这两个项目的反馈。

相关jira: https://clojure.atlassian.net/browse/TDEPS-136

4个回答

+3

FWIW,我之前开始了一个基于CLJS的多平台实现,并通过npm发布。虽然我不确定这是否是一个好主意,但考虑到node的广泛分布,这可能为许多开发者提供了一种选择。

由于在Windows上出现了令人烦恼的问题,每次按下CTRL+C都会弹出一个提示框要求“终止批处理作业(是/否)”,所以我有点停止对这个项目的工作。我没有找到解决这个问题的方法,这非常令人烦恼。不过,Linux/macOS工作正常。

请参阅:https://github.com/thheller/clojure-cli

感谢您的贡献
是的,这是一个与批处理文件相关的问题,很多人都在抱怨这个问题。据我所知,除了替换命令解释器之外,没有解决这个问题的方法。

我认为便携式Clojure CLI包装器的想法不错,但对于大多数平台,例如Linux、BSD、OSX,bash可能实际上是一个更好的选择,因为它的运行速度足够快。不需要为不同的目标编译,也不需要编译32位和64位版本,也不需要下载适合您平台的适当版本。

如果GraalVM的原生镜像已经退出预览版,特别是在Windows上,我个人会倾向于使用它。根据这个基准:https://github.com/chocolateboy/startup-time,它的速度实际上和bash一样快,甚至更快。

根据上述基准和这个基准:https://github.com/bdrung/startup-time,似乎Pascal的启动时间实际上是最短的,其次是C。它表明Nim的运行速度几乎和C一样快,比Go和Bash都快。

依赖另一种语言似乎有点奇怪,但另一方面,bash也是一种语言,尽管出于某种原因,它似乎不那么奇怪。Windows不支持真正的Bash真的很遗憾。

如果GraalVM原生镜像足够健壮,可以在Windows上工作,我会投票支持它。随着Oracle在这方面的积极工作,它应该会随着时间而不断改进。我不认为Clojure CLI启动脚本所做的任何事情在Graal上不会工作。而且它是纯粹的Clojure。

否则,使用Nim、C、Pascal或Go而不是bash是一个我认为只有维护者应该做出的决定。bash管道是最容易的。只需打包脚本,无需为不同的目标编译,也不需要发布不同的安装程序。这比Graal要容易得多。我理解为什么做出这个选择。Windows的情况确实为倾向于其他东西提供了一个论据。

无论如何,只是想在这里补充一些基准信息,特别是 Graal 本地图像在启动时间方面应该与 bash 有竞争力。

为了使这更像是一个答案,我认为我在回答 bash 提供了所有选项中最简单的包装方式,这让它最初成为一个明智的选择,但是随着 Windows 的加入,我们看到 bash 并不具备足够的可移植性,因此我们需要两个实现,在本例中,一个是 bash,另一个是 powershell,或者一个更可移植的语言如 Java,用 GraalVM 编译,Nim 或者 C,这样可以使单个代码库跨平台运行,但代价是更复杂的编译和打包流程。

感谢您的反馈。
- 选择 Nim 的一部分原因是能够从单个操作系统跨编译到所有目标。无论如何,任何语言都可以,完整代码只有 3 或 400 行,这没什么大不了的,可以随时重写。
- 我同意您的看法,bash 在 Posix 系统上非常好。
- GraalVM 似乎是个好主意,但它有两个问题
   - 它在 Windows 上还没有准备好投入实际使用
   - 根据我的知识,目前无法获取用于调用 Java 程序的完整命令行,这在 Windows 上是必须的,以以与 Posix 兼容的方式解释它。我需要在这方面做更多的研究。
- 我同意 GraalVM 可执行文件的启动时间似乎足够好,二进制文件大小可能是另一个问题,但我们真的那么关心吗?
- 最后我同意您的观点,最后的决定取决于 Clojure 团队。尽管这有点紧急。人们每天都在评估工具,可能会因为 Powershell CLI 的不足而放弃这些工具。这可能会影响 deps.edn 项目的采用,至少在 Windows 用户的群体中是这样。
ah-a ! https://github.com/profesorfalken/jProcesses 可以获取命令行...
之前不知道Nim的这个功能。不过这确实是一个很好的观点,因为选择本地编译的工具链的缺点之一就是构建和打包需求更加复杂。如果Nim能够为所有平台进行构建和打包,而无需在这些平台上运行构建步骤,那么这可以让事情变得容易很多。实际上,我并不清楚GraalVM是否是这样。
作为一个测试,我增加了交叉编译到便携性重写(Linux端),看起来像是一切顺利。

我在现有的Nim实现中添加了一个Rust实现。这个实现比我想象的要困难得多,可能是因为我在Rust方面是新手。但是一旦它运行,它就确实运行了!

以下是关于这项工作的更多想法。

关于构建过程复杂性的担忧

交叉编译是解决这个问题的关键。我对此进行了深入研究。尽管我没有做Darwin,这是这个社区中非常重要的一个,但我没有Mac!这两个项目都是从Linux创建Windows安装程序和Linux二进制文件。还提供了一个Docker文件和构建脚本来以平台无关的方式、可重复的方式执行此操作。

  • 如果选择重写,我建议从Mac进行构建,然后执行提供的Docker构建,这样就可以从同一台机器开始涵盖所有三个平台。
  • 对于Mac构建,这两个项目的代码应该不会有任何变化(尽管我实际上并不能确定)
  • 如果我们只想做Windows,我们仍然可以从Windows、Linux、使用Docker的Linux或使用Docker的Mac进行操作。

因此,为了解决这一问题:一个可工作的Docker即可完成所有设置,然后调用提供的docker_build脚本来执行所有构建、打包,甚至构建Windows安装程序。

Nim vs Rust

这两个项目具有相同的功能

Nim
- 使用起来很愉快 -> 好
- 容易学习、阅读、编写 -> 好
- 在zip文件实现中发现了错误(我用它来规避TDEP-120)-> 我已绕过它,但这不是很好
- 小众社区 -> 不是很好
- 容易交叉编译 -> 好
- 并非理想的选择 -> 很难
- 简洁 -> 好
- VS Code支持很好 -> 好
Rust
- 约束和纪律 -> 都好且不好
- 非常稳固 -> 好
- 难以编写 -> 不好
易于阅读 → 我认为不错
难以处理 → 很糟糕
- 容易交叉编译 -> 好
负责任的选择 → 很好
- VS Code支持很好 -> 好
Emacs 支持 很棒 → 除了我,还有谁知道?

尽管 Rust 更负责任,但我不得不回到 Nim 的实现来解决几个问题,用 Rust 后像呼吸新鲜空气一样再次感觉很好。

Rust 版本的测试显然没有 Nim 版本广泛。

我当然会保持包装以及这些 2 个重写维护和更新,但这就是我在这个项目上的工作停止。

0

现在有一个使用 GraalVM 作为本机可执行文件构建的 Clojure 实现,适用于 Linux、Mac 和 Windows:https://github.com/borkdude/deps.clj

我认为这是最佳前进道路。

...