Skip to content

宣布为 Windows 内置核心工具

Andrey Nering
Andrey Nering
Creator & Maintainer

当我在 2017 年最初创建 Task 时,我的最大目标之一就是构建一个能在所有主流平台(包括 Windows)上良好运行的任务运行器。那时,我正将 Windows 作为我的主要平台,并且我注意到在 Windows 上获得一个可用的 Make 版本是多么痛苦,例如。

最初阶段

最早的版本看起来非常原型化,但已经支持了 Windows,不过如果系统中没有 bash,它会回退到命令提示符(cmd.exe)来运行命令。这并不意味着你完全不能在 Windows 上运行 Bash 命令,因为如果你在 Git Bash 中使用 Task,它会将 bash.exe 暴露到你的 $PATH 中,这使得 Task 可以使用它。但除此之外,你就没那么幸运了,因为在命令提示符下运行意味着命令实际上并不兼容。

采用 shell 解释器

我没花太多时间就发现 有一个非常可靠的 Go shell 解释器,并迅速采用了它,以确保我们能够在所有平台上一致地运行命令。这很有趣,因为一旦采用,我就有机会 为其做出一些贡献以使其更加稳定,我相信作者对此表示赞赏。

核心工具的缺失

然而,有一个重要的东西缺失了。如果你需要在 Windows 上使用任何核心工具,比如用 cp 复制文件、用 mv 移动文件、用 mkdir -p 创建目录,那很可能会失败 💥。当然,也有变通方法。你可以在 Git Bash 中运行 task,它会在 $PATH 中为你暴露核心工具,或者你也可以手动安装这些核心工具(有许多可供下载的替代实现)。

但这仍然远非理想。我在 Task 上的最大目标之一是它应该“开箱即用”,即使在 Windows 上也是如此。需要额外设置才能让事情正常工作正是我想要避免的。

它们终于来了!

现在,我们来到了 2025 年,也就是初始版本发布 8 年后。我们可能来得有点晚,但我仍然很高兴。从现在开始,以下核心工具将在 Windows 上可用。这只是一个开始。我们希望随着时间的推移添加更多工具。

  • base64
  • cat
  • chmod
  • cp
  • find
  • gzip
  • ls
  • mkdir
  • mktemp
  • mv
  • rm
  • shasum
  • tar
  • touch
  • xargs

我们如何实现这一目标

这是通过与其他 Go 项目维护者的合作实现的。

u-root/u-root

我们使用了 u-root 项目中用 Go 实现的核心工具。这并不像听起来那么简单,因为他们最初将每个核心工具都实现为一个独立的 main 包,这意味着我们不能仅仅将它们作为库导入和使用。我们进行了一些讨论,并商定了一个共同的 接口基础实现。然后,我逐一重构了上面列表中的核心工具。这就是我们没有全部工具的原因:太多了!但好消息是,我们可以随着时间的推移重构更多工具,并将它们包含在 Task 中。

mvdan/sh

另一个合作是与 shell 解释器的维护者进行的。他同意 提供一个官方中间件 来暴露这些核心工具。这意味着使用该 shell 解释器的其他项目也可以从这项工作中受益,并且随着更多工具的加入,这些项目也会受益。

我可以选择是否使用它们吗?

可以。我们添加了一个名为 TASK_CORE_UTILS 的新环境变量来控制是否使用 Go 实现。默认情况下,在 Windows 上为 true,在其他平台上为 false。你可以像这样覆盖它:

bash
# 启用,即使在非 Windows 平台上
env TASK_CORE_UTILS=1 task ...

# 禁用,即使在 Windows 上
env TASK_CORE_UTILS=0 task ...

我们将来会考虑在所有平台上默认启用此功能。同时,我们仍在非 Windows 平台上使用系统核心工具,以避免回归,因为 Go 实现可能无法 100% 与系统工具兼容。

反馈

如果你对此功能有任何反馈,请加入我们的 Discord 服务器 或在 GitHub 上 提交问题

另外,如果 Task 对你或你的公司有用,请考虑 赞助该项目