2015-03-24 3 views
0

Я занимаюсь разработкой легкого веб-сайта в go и сталкиваюсь с проблемой с entr. Я редактирование .go файлов в каталоге, имеяentr и go run не играет хорошо

ls *.go | entr -r go run *.go 

работает в отдельном окне терминала.

Я вижу, что он перезапускает мою программу каждый раз, когда я сохраняю файл, потому что некоторые заявления формата распечатываются на терминал каждый раз, когда я это делаю. Однако всякий раз, когда я перехожу к localhost:8080, я вижу содержимое обработчика, которое присутствовало, когда я начал entr (а не контент последнего изменения). Если I Ctrl+C, затем перезапустите entr, я вижу последние изменения.

Любая идея, что я делаю неправильно?

Вот минимальный пример:

// test.go 
package main 

import (
    "fmt" 
    "net/http" 
) 

func handler (w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello there! I love %s!", r.URL.Path[1:]) 
} 

func main() { 
    fmt.Println("Starting up...") 
    http.HandleFunc("/", handler) 
    http.ListenAndServe(":8080", nil) 
} 

Теперь, если я бегу ls test.go | entr -r go run test.go, я вижу Starting up... напечатанный на терминал, и я могу пойти в localhost:8080/tests увидеть страницу, которая говорит "Hello there! I love tests!". Если изменить функцию handler так, что он читает

func handler (w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "I guess %s are ok...", r.URL.Path[1:]) 
} 

Я вижу Starting up... сообщение снова напечатанное в терминале, но собираюсь localhost:8080/tests все еще дает мне страницу, показывающую "Hello there! I love tests!" (даже в режиме инкогнито). Если я затем убью процесс entr и перезагрузите его, я могу перейти на localhost:8080/tests, чтобы увидеть I guess tests are ok..., как и ожидалось.

Edit:

Получение ошибки из ListenAndServe подтверждает, что это связано с сокетом оборванной.

... 
    err := http.ListenAndServe(":8080", nil) 
    fmt.Printf("ListenAndServe ERR: %s\n", err) 
... 

показывает дополнительные линии

listen tcp :8080: bind: address already in use 

в терминале. Быстрый поиск говорит мне, что нет простого способа остановить прослушиватель, запущенный с ListenAndServe. Есть ли более простой подход, чем this?

+2

Если вы будете обрабатывать ошибки ListenAndServe, вы увидите, что не так (и мы могли бы помочь). Вероятно, ваш порт по-прежнему используется, и вы не можете его сделать, кроме как правильно закрыть приложение. – Volker

+1

В качестве побочного примечания что-то вроде 'go list -f '{{join .GoFiles" "}}' ', вероятно, безопаснее, чем использование' * .go' либо 'ls', либо' go run' (например, это пропускает '* _test.go' и честь [ограничения сборки] (https://golang.org/pkg/go/build/#hdr-Build_Constraints)).Вероятно, вы также должны использовать 'go build' вместо' go run' (или 'go build &&./YourProgName'). –

ответ

0

Проблема: go run запустит сервер в отдельном процессе, который не будет убит.

Решение: Используйте небольшой скрипт, который убивает и запускает сервер

#!/bin/sh 
pkill "$1" 
go run "$1.go" 

и использовать это для entr.