【问题标题】:Make: stop compilation on errorMake:出错时停止编译
【发布时间】:2016-02-29 23:59:10
【问题描述】:

我开始使用 GNU Make 作为我的前端构建工具,而且大多数东西都很好用。唯一令人讨厌的是,当其中一个步骤出现错误时,编译似乎并没有停止。 Makefile 的相关部分:

js_files=$(filter-out $(ignore_js),$(wildcard \
             js/ll/*.js js/ll/**/*.js))
ignore_js=js/ll/dist% js/ll/%.min.js

%.min.js: %.js
    @echo ">>> Uglifying $?"
    @$(BABELJS) $(BABELJSFLAGS) $? | $(UGLIFYJS) --source-map $(UGLIFYJSFLAGS) > $@

min_js_files=$(js_files:%.js=%.min.js)
main.js: $(min_js_files)
    @echo ">>> Concatenating JavaScript"
    mkdir -p $(DIST_DIR)
    cat $^ > $(DIST_DIR)$@

prod: main.js clean

运行make prod 得到的输出如下所示:

>>> Uglifying js/ll/DateEx.js              
SyntaxError: js/ll/DateEx.js: Invalid number (22:36)
  20 |     day = today.getDate();          
  21 |   }                                 
> 22 |   return new Date(year, month, day, 01, 0, 0);
     |                                     ^
  23 | }
  24 |
  25 | function newDateS(s)
>>> Uglifying js/ll/Anonymization.js
>>> Uglifying js/ll/DummyStorage.js
(...)

我觉得这是因为这些步骤是并行运行的,但我对 Make 一无所知以支持这一点。当其中一个步骤返回非零时,如何停止编译?

【问题讨论】:

    标签: makefile gnu-make babeljs


    【解决方案1】:

    您所要求的是 Make 完善的默认行为。您的构建链中的某些内容未正确设置失败时的非零退出代码,或者您将其屏蔽掉。

    特别是,shell 管道的退出代码始终是管道中最终命令的退出代码。换句话说,您的配方中来自BABELJS 的任何错误都将丢失。

    也许重构不使用管道,也许是这样的:

    %.min.js: %.js.tmp
        $(UGLIFYJS) --source-map $(UGLIFYJSFLAGS) <$< >$@
    %.js.tmp: %.js
        $(BABELJS) $(BABELJSFLAGS) $< >$@
    
    .PHONY: clean
    clean:
        rm *.js.tmp
    

    使用临时文件有点麻烦,第一步是否使用单独的配方的选择是任意的。我更喜欢这种风格,因为它更符合 Make 的精神(显式声明依赖关系,让 Make 跟踪),但如果您想对流程进行细粒度控制,则可以采用其他方式。

    我还从BABELJS 规则中删除了@ 前缀。这有点像我的私人圣战——在你的 Makefile 中乱扔这些东西会使调试变得困难,如果你想要和平与安静,正确的解决方案是使用make -s

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2016-09-02
      • 1970-01-01
      相关资源
      最近更新 更多