2024 Clojure状态调查!上发表您的观点。

欢迎!请参阅关于页面,了解更多关于如何使用本网站的信息。

+5
tools.deps
重新标记

我在Slack上关于PowerShell Clojure CLI命令行在Windows上引入的问题表示过强烈意见。Alex Miller要求描述这些问题,并附加社区反馈,同时以某种决策表的形式提供可能的解决方案。

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

在此文档中,我提出了两种可能的解决方案。
- Windows PowerShell脚本的二进制包装程序
- 可移植二进制重写bash/Powershell脚本

这两个解决方案都需要较低的开发成本,并已生产了探索性项目。
- Clojure Powershel CLI包装程序。在Windows上进行了测试。
- 可移植Clojure CLI重写。在Windows和Linux上进行了测试,证明获取一个可移植解决方案并不太困难。

我希望收到关于所提出问题和这两个项目反馈。

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

4个答案

+3

一些时间以前,我开始编写了一个跨平台实现,采用CLJS编写并通过npm分发。不确定这是否是一个好主意,但考虑到目前node的广泛分布,这可能成为很多人的一种选择。

由于Windows上存在一个问题,每次在CTRL+C时都会弹出一个提示结束批处理作业 (Y/N)?,所以我停止了开发。我找不到解决问题的方法,这非常烦恼。而Linux/macOS运行良好。

查看https://github.com/thheller/clojure-cli


编辑了评论
感谢你的意见
是的,这是一个批处理文件的问题,很多人在抱怨这个问题。据我所知,除了更换命令解释器之外,没有解决这个问题的方法。
+1 投票

我认为一个便携式Clojure CLI包装器的想法听起来不错,但就大多数平台而言:Linux、BSD、OSX,可能是bash更好的选择,因为它既高效又快,无需编译到不同的目标,也不需要32位和64位版本,也不需要为你的平台下载适当的版本。

如果Windows上GraalVM的原生镜像已脱离预览阶段,我会个人倾向于使用它。基于这个基准: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,这将允许单个代码库跨平台运行,但这会带来更复杂的编译和打包流程。

by
感谢您的反馈。
- 选择 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端),看起来运行得非常好。
+1 投票

我在现有的Nim实现中添加了Rust实现。这个比我想的要难,可能是因为我是新手。但一旦工作,它确实工作了!

以下是关于这个项目的更多思考。

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

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

  • 如果选择重写,我建议从mac开始构建,执行提供的docker构建,这样就可以使用同一台机器覆盖所有3个平台。
  • 对于mac构建,项目中的代码不应进行任何更改(尽管我并不能完全确定)
  • 如果我们只想做Windows,我们仍然可以从Windows、Linux、带有docker的Linux或带有docker的mac来完成。

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

Nim与Rust

两个项目都有相同的功能

Nim
- 使用愉快 -> 推荐
- 学习、阅读、编写简单 -> 推荐
- 发现了zip文件实现中的bug(该bug用于规避 TDEP-120) -> 解决了这个问题,但不够好
- 社区小 -> 反对
- 容易交叉编译 -> 推荐
- 并非最佳选择 -> 不推荐
- 精简 -> 推荐
- VS code支持良好 -> 推荐
Rust
- 绑定和纪律 -> 两面之策:好与不好
- 稳定 -> 推荐
- 编写较难 -> 不推荐
- 可读性一般 -> 大概可以
- 使用困难 -> 不理想
- 容易交叉编译 -> 推荐
- 好选择 -> 推荐
- VS code支持良好 -> 推荐
- emacs支持出色 -> 只有我知道

尽管Rust更有责任感,但我不得不回到Nim实现以进行一些修复,感觉就像在Rust之后呼吸新鲜的空气。

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

当然,我会继续维护并更新这个包装器和这两个重写,但这就是我在这个项目上的工作停止的地方。

0

现在有了一个Clojure实现,它使用GraalVM作为Linux、Mac和Windows的原生可执行文件: https://github.com/borkdude/deps.clj

在我看来,这是前进的最佳路径。

...