Понадобилась мне небольшая тулза, которая бы перезапускала тесты при изменениях кода, а также уведомляла об ошибках. Проще говоря мне нужено что-то вроде autotest для Rails или watchr.
Накидал небольшой код который мониторит все *.go
файлы и запускает тексты.
Использовал последний свежий Go из репозитория. Использовал команду notify-send
для системных
уведомлений, гарантированно работает на Ubuntu Oneric 11.10. Если есть у кого
желание, то можно форкнуть gist и добавить
функции системного уведомления для вашей системы.
package main import "log" import "os" import "regexp" import "os/exec" import "exp/inotify" func runTests() { cmd := exec.Command("go", "test") cmd.Stdout = os.Stdout if err := cmd.Run(); err != nil { log.Println(err) notifySystem("go test failed") } } // probably will work only for Ubuntu func notifySystem(message string) { cmd := exec.Command("notify-send", message) if err := cmd.Run(); err != nil { log.Fatal(err) } } func setupWatcher() *inotify.Watcher { watcher, err := inotify.NewWatcher() if err != nil { log.Fatal(err) } err = watcher.AddWatch(".", inotify.IN_MODIFY) if err != nil { log.Fatal(err) } return watcher } func main() { watcher := setupWatcher() runTests() for { select { case ev := <-watcher.Event: matched, err := regexp.MatchString(".*\\.go", ev.Name) if err != nil { log.Fatal(err) } if matched { // On my machine it always raised two events // ignore second, prevent twice tests run. // Probably it's depends of test editor. // If so, feel free to // remove line above: <-watcher.Event runTests() } case err := <-watcher.Error: log.Println("error:", err) } } }
UPD: Теперь watcher живёт по адресу: https://bitbucket.org/vladimir_vg/go-retest. Подробнее в следующем посте.