许多 Shell 命令架构

many Shell Commands architecture

在工作中,我们正在使用docker和docker-compose,我们的开发人员需要在本地启动很多容器并导入一个大型数据库,有很多服务需要运行 共同开发成功和容易。

所以我们将可重用函数定义为 make 命令以使代码更易于维护,是否有另一种方法可以比 make 更好地定义和重用许多 shell 命令。

由于网络限制,对我们来说 运行在本地 docker 是唯一的选择。

我们设法解决了这一挑战,并通过抽象出多个 make 目标背后的复杂 shell 命令,并为了拆分这些众多 make 目标,使我们的开发人员的生活更轻松为了控制我们的 docker 基础设施和容器,我们决定将目标拆分为许多扩展名为 .mk 的文件。

有多个 make 命令,大约有 40 个,其中一些是低级别的,一些是供开发人员调用以执行某些任务。

make launch_app
make import_db_script
make build_docker_images

但最近事情开始变得有点慢,make 命令在内部调用其他 make 命令,每个 make 调用都占用大量时间,因为每个较低的级别 make 调用必须遍历所有已定义的 .mk 文件,并进行一些计算,正如我们 运行 make -d 所示,因此它开始加起来相当大开销。

有什么方法可以使用 make 以外的任何方法来管理一组复杂的 shell 命令,同时仍然让我们的开发人员能够轻松调用。

提前致谢。

好吧,您总是可以在 shell 脚本而不是 makefile 中编写 shell 命令。使用shell 函数,shell 变量等可以对其进行管理。您没有举例说明您对 make 构造的使用有多复杂。

Whosebug 并不是一个可以提出诸如“什么是最好的 XYZ”之类的开放式问题的地方。因此,我会将这个问题视为“我怎样才能加快我的 makefile 的速度”。

对我来说,这听起来像是您的 makefile 编写得不好。同样,您没有显示任何示例,但听起来您的规则正在调用很多子制作(例如,您的规则食谱 运行 $(MAKE) 等)这意味着调用了很多流程,很多已解析的 makefile 等。为什么不只有一个 make 实例并使用先决条件,而不是子 make 到 运行 其他目标?您仍然可以将 makefile 拆分成单独的文件,然后使用 include ... 将它们全部收集到一个 make 实例中。

另外,如果您不需要自己重建 makefile,您应该确保禁用可能尝试这样做的内置规则。事实上,如果你只是对 运行 docker 东西使用 make,你可以禁用 all 内置规则并加快速度。只需将此添加到您的 makefile 中:

MAKEFLAGS += -r

(有关此选项的详细信息,请参阅 Options Summary)。

预计到达时间

您没有说明您使用的是什么版本的 GNU,或者您 运行正在使用什么操作系统。您没有显示您正在使用的食谱的任何示例,因此我们可以了解它们的结构。

问题是您的问题“运行缓慢”无法操作,甚至无法定义。例如,我每天使用的软件有 41 个包含 22,500 行的 makefile(从 cmake 生成,这意味着它们没有达到应有的效率:它们是通用的 makefile,不使用 GNU make 功能)。当实际上没有什么可做的时候,我的构建到 运行 所花费的时间(因此,基本上整个时间都花在了解析 makefile 上),是 0.35 秒。

在您的评论中,您建议您有 10 个 makefile 和 50 个变量...我无法想象如此大的 makefile 会导致任何可检测到的缓慢。鉴于此信息,-r 没有太大区别,我并不感到惊讶。

因此,您的特定 makefile 一定有某些原因导致了缓慢:缓慢并不是 make 固有的。显然,我们不能只是猜测那可能是什么。您将不得不对此进行调查。

使用time make launch_app。这需要多长时间?

现在使用 time make -n launch_app。这将读取所有 makefile 但实际上 运行 不读取任何命令。这需要多长时间?

如果 make -n 没有花费明显的时间,那么问题不在于 make,而在于你编写的食谱并切换到不同的工具来 运行 这些相同的食谱不会帮助。

如果 make -n 花费大量时间,那么您的 makefile 中的某些内容很慢。您应该检查它是否使用了 $(shell ...),可能还有 $(wildcard ...);这些是缓慢发生的地方。您可以在它们周围添加 $(info ...) 语句以获得它们前后的输出 运行:也许它们 运行 出乎意料地出现了很多次。

如果没有具体的缓慢示例,我们将无能为力。