【问题标题】:Extend make commands扩展 make 命令
【发布时间】:2015-12-19 19:29:51
【问题描述】:

我使用make 进行前端开发。我的问题可能通过示例更好地解释。使用npm,我可以在我的package.json 中拥有:

"html_dev": "jade --pretty --hierarchy ./src-dir --out ./dev-dir",
"html_watch": "npm run html:dev -- --watch"

这意味着html_watchhtml_dev 基本相同添加了--watch 标志。好处很明显:更改html_dev,并自动在html_watch 中获取这些更改。

但是,make 我没有这样的运气,似乎需要重复命令:

html_dev:
    jade --pretty --hierarchy ./src-dir --out ./dev-dir
html_watch:
    jade --pretty --hierarchy ./src-dir --out ./dev-dir --watch

我可以通过使用变量来解决这个问题:

htm_dev_command := jade --pretty --hierarchy ./src-dir --out ./dev-dir

html_dev:
    $(html_dev_command)
html_watch:
    $(html_dev_command) --watch

这行得通,但会很快变得丑陋,因为我有一堆我想扩展的命令。

有没有办法做到这一点?

【问题讨论】:

    标签: node.js makefile npm


    【解决方案1】:

    是的,你想要Phony TargetsTarget-specific Variables

    您可以为命令的参数使用一个变量,然后在 html_watch 目标的特定于目标的变量中附加/前置它,然后将 html_dev 列为其先决条件。

    html_dev 的配方将只使用该变量。

    您还可以使用可扩展变量并按目标名称加载变量。

    common_ARGS := --pretty --hierarchy ./src-dir --out ./dev-dir
    html_watch_ARGS := --watch
    
    html_watch html_dev:
        jade $(common_ARGS) $($@_ARGS)
    

    或者在对html_watch_ARGS 的赋值中包含$(common_ARGS)(同时也赋值为html_dev_ARGS),然后在配方中使用那个变量。

    【讨论】:

    • 这行得通,但我宁愿不必使用变量来做到这一点。对我来说,它的可读性不如各种命令。
    • 我能想到的 make 无法避免这种情况。如果一切都建立在公共参数的基础上,您可以编写一个 html_dev 目标,并在最后用 $(EXTRA_ARGS) 写出完整的命令,然后在每个扩展命令中使用 EXTRA_ARGS := ....,如果这对您来说更好的话。 npm 是否允许每个“目标”使用任意数量的命令?如果是这样,它如何处理并添加参数? (这就是为什么make 没有简洁的方法来做到这一点,它不知道在哪里添加参数。)
    猜你喜欢
    • 2020-09-27
    • 2016-09-07
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多