Ответ 1
Я делаю это с большинством моих веб-приложений Go. Я использую go-bindata, чтобы автоматически генерировать исходный код Go из всех файлов, которые я хочу встроить, а затем компилировать их в двоичный файл. Все это делается автоматически во время сборки.
Недостатком является то, что текущие инструменты сборки go не предлагают способа подключиться к процессу сборки, поэтому я использую Makefile для этой цели. Когда вызывается make файл, он запускает go-bindata
, чтобы сгенерировать источники для всех необходимых файлов, затем обычно выполняет некоторые дополнительные биты и бобы генерации кода (в частности, создает исходный файл Go, в котором перечислены все встроенные файлы на карте. A Оглавление, если хотите). Затем он приступает к компиляции фактической программы.
Это может стать немного грязным, но вы должны настроить его всего один раз.
Другим недостатком является то, что использование Makefile означает, что программное обеспечение несовместимо с командой go get
. Но поскольку большинство моих веб-приложений в любом случае не предназначены для совместного использования, это пока не является проблемой.
Когда дело доходит до отладки/разработки такого приложения, возникает другая проблема, возникающая из-за встраивания статического веб-контента: я не могу просто отредактировать файл HTML или CSS и обновить браузер, чтобы увидеть его эффекты. Я должен был бы остановить сервер, перестроить его и перезапустить при каждом редактировании. Это явно не идеально, поэтому я разделил Makefile на режимы debug
и release
. Режим выпуска делает то, что я описал выше. Однако режим отладки не будет встраивать статические файлы. Он генерирует исходные файлы для каждого из них, но вместо того, чтобы они содержали фактические данные файла, он содержит заглушку, которая просто загружает данные из файловой системы.
Что касается кода сервера, в сгенерированном коде нет различий. Все, что он делает, это вызывает функцию для извлечения содержимого данного статического файла. Не имеет значения, встроен ли этот контент в двоичный файл или загружен из внешнего источника. Таким образом, два режима сборки свободно взаимозаменяемы.
Например, одна и та же сгенерированная функция для извлечения статического содержимого файла в режиме выпуска и отладки будет выглядеть следующим образом:
Режим выпуска:
func index_html() []byte {
return []byte {
....
}
}
Режим отладки:
func index_html() []byte {
data, err := ioutil.ReadFile("index.html")
...
return data
}
Интерфейс в обоих случаях идентичен. Это позволяет легко и без заботы разрабатывать и отлаживать.