Подтвердить что ты не робот

Есть ли более разумная альтернатива "часам"?

Я столкнулся с этим полезным советом, что если вы много работаете над файлами и хотите, чтобы они автоматически создавались, вы запускаете:

смотреть

И он перезапускает каждую пару секунд, и все будет построено.

Однако... он все время проглатывает все выходные. Я думаю, что это может быть разумнее - возможно, покажите поток вывода, но подавите ничего, что нужно сделать для "все", чтобы, если ничего не построено, вывод не прокручивается.

Несколько подходов оболочки script приходят на ум, используя цикл и grep... но, возможно, что-то более элегантное там? Кто-нибудь видел что-то?

4b9b3361

Ответ 1

Щебетать Bootstrap использует жемчужину watchr для этого.

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

https://github.com/mynyml/watchr

Edit:

Спустя два года проект watchr, похоже, больше не поддерживается. Посмотрите другое решение среди ответов. Лично, если цель состоит только в том, чтобы иметь лучшую производительность, я бы рекомендовал ответ от wch здесь

Ответ 2

Использование классических gnu make и inotifywait, без опроса на основе интервалов:

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

Этот способ make запускается для каждого файла, записанного в текущем дереве каталогов. Вы можете указать цель, запустив

make watch WATCHMAKE=foo

Ответ 3

Этот однострочный слой должен сделать это:

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

Он будет запускать make один раз в секунду, и он будет выводить только вывод, когда он действительно что-то делает.

Ответ 4

Как насчет

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

?

Таким образом вы можете запустить

делать непрерывно

и получить результат, если что-то не так.

Ответ 5

Я делаю это в моем 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.

Ответ 6

Существует несколько автоматических систем сборки, которые делают это и многое другое - в основном, когда вы проверяете изменение в управлении версиями, они будут создавать/строить - искать непрерывную интеграцию

Простые TeamCity и Hudson

Ответ 7

@Dobes Vandermeer - У меня есть script с именем "mkall", который запускает make в каждом подкаталоге. Я мог бы назначить этот script как задание cron для запуска каждые пять минут или одну минуту или тридцать секунд. Затем, чтобы увидеть результат, я перенаправил gcc-результаты (в каждом отдельном make файле) на журнал в каждом подкаталоге.

Может ли что-то подобное работать для вас?

Это может быть довольно сложным, чтобы избежать того, что ничего не делать. Например, script может сохранить время изменения каждого исходного файла и сделать make, когда этот парень изменится.

Ответ 8

Вы можете попробовать использовать что-то вроде inotify-tools. Это позволит вам просматривать каталог и запускать команду, когда файл будет изменен или сохранен или какие-либо другие события, которые может выполнять inotify. Простой script, который делает часы для сохранения и запускает make, когда файл будет сохранен, вероятно, будет полезен.

Ответ 9

Вы можете изменить файл make для вывода growl (OS X) или notify-send (Linux). Для меня в Ubuntu это покажет пузырь уведомления в правом верхнем углу экрана.

Тогда вы заметили бы сборку только в случае сбоя.

Вероятно, вы захотите установить watch только так быстро, как только эти уведомления могут отображаться (поэтому они не накапливаются).

Ответ 10

Эта оболочка script сама использует make для обнаружения изменений с помощью флага -q, а затем выполняет полную перестройку тогда и только тогда, когда есть изменения.

#!/bin/sh

while true;
do
  if ! make -q "[email protected]";
  then
    echo "#-> Starting build: `date`"
    make "[email protected]";
    echo "#-> Build complete."
  fi
  sleep 0.5;
done
  • У него нет зависимостей, кроме make.

  • Вы можете передать нормальные аргументы make (например, -C mydir), поскольку они передаются команде make.

  • Как было предложено в вопросе, он молчал, если нечего строить, но не проглатывает вывод, когда есть.

  • Вы можете сохранить этот script удобным, например, ~/bin/watch-make для использования в нескольких проектах.