yarn 构建的 Makefile 规则 - 如何表达对复制部署工件的依赖性

Makefile rule for yarn build - how to express a dependency for copy deployment artefacts

我正在为网络摄像机构建图像,其中应用程序是用 C 编写的,但输出图像还包含捆绑的 web-app 如果部署到相机的嵌入式网络服务。

我们使用 make 构建图像,我使用 yarn 构建网络应用程序。我想创建一个 makefile 规则,这样我就不会在每次构建图像​​时都执行 yarn build。目前我有:

$(WEBAPP_PATH)/build: $(WEBAPP_PATH)
    @echo Building web-app...
    @pushd $(WEBAPP_PATH); yarn build; popd;

$(PACKAGE_PATH)/html: $(WEBAPP_PATH)/build $(PACKAGE_PATH)/.dir
    @echo Copy html...
    mkdir -p $@
    cp -r $(WEBAPP_PATH)/build/index.html $@/
    cp -r $(WEBAPP_PATH)/build/js $@/

但是我如何编写更精细的检查来确定是否需要构建捆绑包?

更新:我的问题实际上是如何检测网络应用程序构建工件是否已更新,因为它们的名称是随机的。

根据评论,似乎以下可能会产生您想要的效果:

1) 在运行s yarn 的规则中添加一个步骤:使其touch 成为一个文件。然后将该规则的目标设为触摸文件。应该更新此规则的依赖项以列出所有在 yarn 需要再次 运行 时发出信号的输入。 (注意:如果 index.html 的时间戳在每次 yarn 运行s 时都会发生变化,那么您可以使用它来代替 touchfile 和 touch 步骤。)

$(WEBAPP_PATH)/touchfile: $(WEBAPP_PATH) $(YARN_INPUTS)
    @echo Building web-app...
    @pushd $(WEBAPP_PATH); yarn build; popd;
    touch $(WEBAPP_PATH)/touchfile

2) 然后更新您的捆绑复制规则,以依赖触摸文件的时间戳作为所有随机命名文件的代理。同时将此规则的目标更新为它生成的 index.html 的副本。

$(PACKAGE_PATH)/html/index.html: $(WEBAPP_PATH)/touchfile $(PACKAGE_PATH)/.dir
    @echo Copy html...
    mkdir -p $@
    cp -r $(WEBAPP_PATH)/build/index.html $@/
    cp -r $(WEBAPP_PATH)/build/js $@/

3) 执行 link 步骤的规则可以将 $(WEBAPP_PATH)/build/index.html 指定为依赖项,因为 copy 将更新其时间戳,从而触发 link规则。