Bash 许多Shell命令都是基于体系结构的

Bash 许多Shell命令都是基于体系结构的,bash,docker,shell,makefile,gnu-make,Bash,Docker,Shell,Makefile,Gnu Make,在工作中,我们使用docker和docker compose,我们的开发人员需要在本地启动许多容器并导入一个大型数据库,有许多服务需要一起运行,以便开发成功且简单 因此,我们将可重用函数定义为make命令,以使代码更易于维护,是否有其他方法比make更好地定义和重用许多shell命令 对于我们来说,由于网络限制,在本地运行docker是唯一的选择 通过将复杂的shell命令抽象到多个make目标之后,我们成功地解决了这一挑战,并使开发人员的生活更加轻松,为了分割这些控制docker基础设施和容器

在工作中,我们使用docker和docker compose,我们的开发人员需要在本地启动许多容器并导入一个大型数据库,有许多服务需要一起运行,以便开发成功且简单

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

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

通过将复杂的shell命令抽象到多个
make
目标之后,我们成功地解决了这一挑战,并使开发人员的生活更加轻松,为了分割这些控制docker基础设施和容器的众多
make
目标,我们决定将目标分割到扩展名为
.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构造的使用有多复杂

StackOverflow并不是一个提出开放式问题的地方,比如“什么是最好的XYZ”。因此,我将把这个问题视为“如何加快生成文件的速度”

对我来说,听起来你只是有一些写得很糟糕的makefile。同样,您没有显示任何示例,但听起来您的规则调用了很多子MAKE(例如,您的规则配方运行
$(MAKE)
等),这意味着调用了很多进程,解析了很多MAKE文件,等等。为什么不只使用MAKE的单个实例并使用前提条件,而不是子MAKE来运行其他目标?您仍然可以将make文件拆分为单独的文件,然后使用
include…
将它们收集到make的单个实例中

此外,如果您不需要重新生成makefile本身,那么您应该确保禁用可能尝试这样做的内置规则。事实上,如果你只是使用make来运行docker的东西,你可以禁用所有的内置规则,并加快速度。只需将其添加到makefile中:

MAKEFLAGS += -r
(有关此选项的详细信息,请参阅)

ETA

你不会说你使用的是什么版本的GNU,或者你运行的是什么操作系统。你没有展示你正在使用的食谱的任何例子,所以我们可以看到它们是如何构造的

问题是,你的问题“进展缓慢”,无法采取行动,甚至无法定义。例如,我每天使用的软件有41个makefile,其中包含22500行(由cmake生成,这意味着它们没有可能的效率:它们是通用makefile,没有使用GNU make特性)。我的构建在没有实际操作的情况下运行所需的时间(因此,基本上整个时间都是通过解析makefile来完成的),是0.35秒

在你的评论中,你建议你有10个makefile和50个变量。。。我无法想象这样大的makefile怎么会导致任何可检测的慢度。考虑到这些信息,
-r
并没有产生多大影响,我并不感到惊讶

因此,您的特定makefile一定有某种原因导致了这种缓慢:这种缓慢不是make固有的。显然,我们不能仅仅猜测那可能是什么。你必须对此进行调查

使用
time make launch\u应用程序
。需要多长时间

现在使用
time make-n launch\u应用程序
。这将读取所有makefile,但不会实际运行任何命令。需要多长时间

如果
make-n
不需要明显的时间,那么问题不在于make,而在于您编写的配方,切换到不同的工具来运行这些相同的配方是没有帮助的

如果
make-n
花费了相当长的时间,那么您的makefile中的某些内容会变慢。您应该检查它是否使用了
$(shell…
,可能还有
$(通配符…
;这些都是缓慢将发生的地方。您可以在它们周围添加
$(info…
语句,以在它们运行之前和之后获得输出:可能它们意外地运行了很多次


如果没有具体的慢的例子,我们就无能为力了。

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

StackOverflow并不是一个提出开放式问题的地方,比如“什么是最好的XYZ”。因此,我将把这个问题视为“如何加快生成文件的速度”

对我来说,听起来你只是有一些写得很糟糕的makefile。同样,您没有显示任何示例,但听起来您的规则调用了很多子MAKE(例如,您的规则配方运行
$(MAKE)
等),这意味着调用了很多进程,解析了很多MAKE文件,等等。为什么不只使用MAKE的单个实例并使用前提条件,而不是子MAKE来运行其他目标?您仍然可以将生成文件拆分为单独的文件,然后使用
i