3

我最近被在终端窗口中使用nodemon宠坏了,每当我保存更改时运行我的 Node.js 程序。

我想对我拥有的一些 C++ 代码做类似的事情。我的实际项目有很多源文件,但如果我们假设以下示例,我希望make在保存更改时自动运行sample.dat,program.cheader.h.

test: program sample.dat
    ./program < sample.dat

program: program.c header.h
    gcc program.c -o program

是否有现有的解决方案可以做到这一点?

(无需启动 IDE。我知道很多 IDE 可以在您更改文件时重新构建项目。)

4

1 回答 1

5

如果您在一个支持的平台上inotifywait(据我所知,只有 Linux;但由于您询问了 Make,看来您很有可能在 Linux 上;对于 OS X,请参阅此问题),您可以执行以下操作:

inotifywait --exclude '.*\.swp|.*\.o|.*~' --event MODIFY -q -m -r . |
while read
do make
done

打破它:

inotifywait

监听文件系统事件。

--exclude '.*\.swp|.*\.o|.*~'

.swp排除以,.o或结尾的文件~(您可能希望添加到此列表中)。

--event MODIFY

当您找到一个打印出事件发生的文件的文件路径时。

-q

不要打印启动消息(因此不会过早调用 make)。

-m

连续聆听。

-r .

递归监听当前目录。然后它被输送到一个简单的循环中,该循环为读取的每一行调用 make。

根据您的需求量身定制。您可能会发现inotifywait --help联机帮助页很有帮助。


这是一个更详细的脚本。我没有对其进行太多测试,因此请谨慎使用。它旨在防止构建一次又一次不必要地发生,例如在 Git 中切换分支时。

#!/bin/sh
datestampFormat="%Y%m%d%H%M%S"
lastrun=$(date +$datestampFormat)
inotifywait --exclude '.*\.swp|.*\.o|.*~' \
            --event MODIFY \
            --timefmt $datestampFormat \
            --format %T \
            -q -m -r . |
while read modified; do
    if [ $modified -gt $lastrun ]; then
        make
        lastrun=$(date +$datestampFormat)
    fi
done
于 2013-12-07T02:00:54.520 回答