Я занимаюсь разработкой легкого веб-сайта в 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?
Если вы будете обрабатывать ошибки ListenAndServe, вы увидите, что не так (и мы могли бы помочь). Вероятно, ваш порт по-прежнему используется, и вы не можете его сделать, кроме как правильно закрыть приложение. – Volker
В качестве побочного примечания что-то вроде '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'). –