34

我遇到了这个有用的提示,如果您经常处理文件并且希望它们自动构建,您可以运行:

手表制作

它每隔几秒钟就会重新运行一次,然后事情就会建立起来。

然而......它似乎一直在吞噬所有的输出。我认为它可能更聪明 - 可能会显示输出流,但会抑制“所有”都没有做任何事情,这样如果没有构建任何内容,输出就不会滚动。

使用循环和 grep 会想到一些 shell 脚本方法……但也许还有更优雅的方法?有人看到了吗?

4

11 回答 11

54

使用经典的 gnumakeinotifywait,没有基于间隔的轮询:

watch:
    while true; do \
        make $(WATCHMAKE); \
        inotifywait -qre close_write .; \
    done

这种方式会在当前目录树中的每个文件写入时触发。您可以通过运行指定目标

make watch WATCHMAKE=foo
于 2014-05-19T09:42:34.280 回答
13

这个单线应该做到这一点:

while true; do make --silent; sleep 1; done

它每秒运行make一次,并且仅在实际执行某些操作时才打印输出。

于 2014-12-25T02:21:27.517 回答
13

这是一个单行:

while true; do make -q || make; sleep 0.5; done

使用make -q || make而不是make仅在有事情要做时才运行构建,否则不会输出任何消息。

您可以将此作为规则添加到项目的 Makefile 中:

watch:
    while true; do $(MAKE) -q || $(MAKE); sleep 0.5; done

然后使用make watch来调用它。

这种技术将防止 Make 用“make:Nothing to be done for TARGET”消息填充终端。

它也不像某些文件观察器解决方案那样保留一堆打开的文件描述符,这可能导致 ulimit 错误。

于 2018-01-29T07:56:03.100 回答
7

怎么样

# In the makefile:
.PHONY: continuously
continuously:
    while true; do make 1>/dev/null; sleep 3; done  

?

这样你可以运行

不断地制作

并且仅在出现问题时才获得输出。

于 2011-11-24T13:08:37.113 回答
6

Twitter Bootstrapwatchr为此使用了 ruby​​ gem。

https://github.com/twbs/bootstrap/blob/v2.3.2/Makefile

https://github.com/mynyml/watchr

编辑:

两年后,该watchr项目似乎不再维护。请在答案中寻找另一种解决方案。就个人而言,如果目标只是获得更好的输出,我会推荐这里的答案wch

于 2013-05-06T15:39:45.963 回答
2

我在我的 Makefile 中这样做:

watch:
    (while true; do make build.log; sleep 1; done) | grep -v 'make\[1\]'

build.log: ./src/*
    thecompiler | tee build.log

所以,它只会在我的源代码比我的 build.log 更新时构建,并且“grep -v”的东西会删除一些不必要的 make 输出。

于 2014-04-07T15:26:02.277 回答
1

有几个自动构建系统可以做到这一点,甚至更多——基本上,当你检查对版本控制的更改时,他们将制作/构建——寻找持续集成

简单的是TeamCityHudson

于 2011-09-24T14:21:06.443 回答
1

@Dobes Vandermeer——我有一个名为“mkall”的脚本,它在每个子目录中运行 make 。我可以将该脚本指定为每五分钟、一分钟或三十秒运行一次的 cron 作业。然后,为了查看输出,我将 gcc 结果(在每个单独的 makefile 中)重定向到每个子目录中的日志。

类似的东西对你有用吗?

它可能非常复杂,以避免使其无能为力。例如,脚本可以节省每个源文件的修改时间,并在那个人发生变化时进行制作。

于 2011-09-24T14:23:40.407 回答
1

您可以尝试使用类似 inotify-tools 的工具。当文件更改或保存或 inotify 可以监视的任何其他事件时,它将让您监视目录并运行命令。一个监视保存并在保存文件时启动制作的简单脚本可能会很有用。

于 2011-09-26T22:06:25.347 回答
1

这个 shell 脚本使用make自己来检测-q标志的变化,然后当且仅当有变化时才进行完全重建。

#!/bin/sh

while true;
do
  if ! make -q "$@";
  then
    echo "#-> Starting build: `date`"
    make "$@";
    echo "#-> Build complete."
  fi
  sleep 0.5;
done
  • 除了make.

  • 您可以将普通make参数(例如-C mydir)传递给它,因为它们被传递给make命令。

  • 如问题中所要求的,如果没有要构建的内容但不吞下输出,则它是沉默的。

  • 您可以方便地保存此脚本,例如~/bin/watch-make跨多个项目使用。

于 2016-12-05T09:04:24.883 回答
0

您可以更改您的制作文件以输出咆哮(OS X)或通知发送(Linux)通知。对于 Ubuntu 中的我来说,这会在我的屏幕右上角显示一个通知气泡。

然后你只会在构建失败时注意到它。

您可能希望设置watch为仅以这些通知可以显示的速度循环(这样它们就不会堆积)。

于 2012-02-25T15:18:19.480 回答