3

最近、ターミナルウィンドウでnodemonを使用して、変更を保存するたびにNode.jsプログラムを実行することに甘んじてきました。

私が持っているいくつかのC++コードで同様のことをしたいと思います。私の実際のプロジェクトにはたくさんのソースファイルがありますが、次の例を想定すると、、またはmakeに変更を保存するたびに自動的に実行したいと思います。sample.datprogram.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 に答える