Estou trabalhando em um pequeno aplicativo da web em Go que deve ser usado como uma ferramenta na máquina de um desenvolvedor para ajudar a depurar seus aplicativos / serviços da web. A interface do programa é uma página da web que inclui não apenas o HTML, mas algum JavaScript (para funcionalidade), imagens e CSS (para estilização). Estou planejando abrir o código-fonte deste aplicativo, então os usuários devem simplesmente ser capazes de executar um Makefile e todos os recursos irão para onde precisam. No entanto, também gostaria de poder simplesmente distribuir um executável com o mínimo de arquivos / dependências possível. Existe uma boa maneira de agrupar o HTML / CSS / JS com o executável, de modo que os usuários só tenham que baixar e se preocupar com um arquivo?
Agora, em meu aplicativo, veicular um arquivo estático se parece um pouco com isto:
// called via http.ListenAndServe
func switchboard(w http.ResponseWriter, r *http.Request) {
// snipped dynamic routing...
// look for static resource
uri := r.URL.RequestURI()
if fp, err := os.Open("static" + uri); err == nil {
defer fp.Close()
staticHandler(w, r, fp)
return
}
// snipped blackhole route
}
Portanto, é muito simples: se o arquivo solicitado existe em meu diretório estático, invoque o manipulador, que simplesmente abre o arquivo e tenta definir um bom Content-Type
antes de servir. Meu pensamento era que não há razão para que isso precise ser baseado no sistema de arquivos real: se houvesse recursos compilados, eu poderia simplesmente indexá-los pelo URI de solicitação e servi-los como tal.
Se não houver uma boa maneira de fazer isso ou se eu estiver latindo na árvore errada ao tentar fazer isso, me avise. Achei que o usuário final gostaria de ter o mínimo de arquivos possível para gerenciar.
Se houver tags mais apropriadas do que ir, sinta-se à vontade para adicioná-los ou me avisar.
go generate
um pequeno utilitário de linha de comando (empacotado com meu código-fonte) para converter os arquivos em []byte
fatias que são incorporadas como variáveis no código, semelhante a como stringer
faz (consulte blog.golang.org / gerar ).