【问题标题】:How to use wc in Makefile to watch for changes and run a command at each update?如何在 Makefile 中使用 wc 来监视更改并在每次更新时运行命令?
【发布时间】:2015-06-29 15:30:01
【问题描述】:

我正在尝试让这个在 Gnu Make 中工作。

我正在 Makefile 中测试 wc watch。

我有一个文件,只要检测到更改,就需要对其进行编译,并且它应该在运行 2 个并行命令的规则中运行配方。一个编译css,另一个重新加载浏览器。

如果我使用cssnext --watch 的内置监视命令,我的设置可以正常工作,但我想使用wc 进行设置

这里是代码

BIN := node_modules/.bin

all: assets/css/style.css
assets/css/style.css: sources/style.css
    @mkdir -p $(@D)
    @set -e ; \
    while true;\
    do \
        $(shell wc -c "sources/style.css")\
        $(BIN)/cssnext $^ $@& $(BIN)/instant 3000;\
        sleep 1;\
    done

当我执行make all 时,它会显示

"D:/Program Files (x86)/Git/bin/sh.exe": line 4: 343: command not found
 •∙ listening on port 3000 and waiting for changes

我是 GNU Make 的新手,我无法理解它。

更新: 如果我使用 bash 脚本。使用以下代码创建一个watchfile.sh 文件:

#!/bin/bash
clearline="\b\033[2K\r"

command=$@

while sleep 1;
do
    # watch each character change
    eval "wc -c $command"
    echo -n -e "$clearline"
done

然后将Makefile中的代码替换为

    ./watchfile.sh $^
    $(BIN)/cssnext $^ $@& $(BIN)/instant 3000;

我在 shell 中得到以下内容

 •∙ listening on port 3000 and waiting for changes     344 sources/style.css
    284 node_modules/.bin/cssnext
    344 sources/style.css
    263 assets/css/style.css
   1235 total

我不知道为什么它还要查看其他文件,我只指定了sources/styles.css

如果我在 css 文件中进行更改,它会显示字符数发生变化。但是 source/style.css 文件没有编译到目标。 shell 只显示 wc 命令一次又一次地循环。

我做了一个小改动,它反映在 wc shell 中

322 sources/style.css
284 node_modules/.bin/cssnext
322 sources/style.css
263 assets/css/style.css
1191 total

但现在的问题是它没有编译甚至重新加载浏览器。

另一个问题是现在 wc 命令不会停止循环。即使我做了CTRL+C。我必须关闭终端

另外,我宁愿不使用 watchfile.sh 脚本,而是在 Makefile 中执行。

【问题讨论】:

  • 为什么不直接使用 grunt 或 gulp 呢?这些看起来更适合您的需求。
  • 我不想使用 grunt 或 gulp,我正在尝试让它与 Makefile 一起使用。
  • 嗯,make 并不适合监视文件的变化和重建——它只构建一次然后退出。此外,wc 不是检查是否发生更改的可靠方法,尽管它可能在大多数情况下都有效。
  • @IbnSaeed 有什么特别的理由不使用提到的 grunt 或 gulp 等 easy2use 工具吗?
  • 我使用 NPM 作为构建工具,它可以很好地满足我的所有需求。我正在用 Makefile 尝试一些新的东西。 Grunt 和 Gulp,当我们有 NPM 脚本时,我看不出它们有用的原因。

标签: css shell compilation makefile gnu-make


【解决方案1】:

如果您坚持使用 make,只需编写一个编译您的 CSS 等的 Makefile - 这就是 make 的用途,您运行 make 它会编译所有更改的内容。

要使编译自动进行,您可以使用watch 实用程序,它会定期运行make

watch make

这应该可以满足您的需求。此问题的更多信息:Is there a smarter alternative to "watch make"?

【讨论】:

  • 我在 Windows 上,我没有手表。我有 Gnuwin32 工具附带的 wc
  • 那么我看到的最简单的解决方案是使用watchr,这在我引用的问题中有所提及。另外,watch 是 Cygwin 的一部分,您可能也想看看。
  • 我正在使用 msysgit。无法切换到 cygwin。
【解决方案2】:

我让它与 Makefile + NPM 一起工作。虽然我需要一个完整的 Makefile 解决方案。无论如何,它现在可以工作了。

【讨论】:

    猜你喜欢
    • 2023-01-04
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2020-04-20
    • 1970-01-01
    • 2013-06-26
    • 2017-01-27
    相关资源
    最近更新 更多