Saya sedang mengerjakan aplikasi web kecil di Go yang dimaksudkan untuk digunakan sebagai alat pada mesin pengembang untuk membantu men-debug aplikasi / layanan web mereka. Antarmuka ke program adalah halaman web yang tidak hanya mencakup HTML, tetapi beberapa JavaScript (untuk fungsionalitas), gambar dan CSS (untuk gaya). Saya berencana untuk membuat aplikasi ini menjadi sumber terbuka, jadi pengguna harus dapat menjalankan Makefile dan semua sumber daya akan pergi ke mana pun mereka harus pergi. Namun, saya juga ingin dapat mendistribusikan file yang dapat dieksekusi dengan sesedikit mungkin file / dependensi. Apakah ada cara yang baik untuk memaketkan HTML / CSS / JS dengan yang dapat dieksekusi, sehingga pengguna hanya perlu mengunduh dan mengkhawatirkan satu file?
Saat ini, di aplikasi saya, menyajikan file statis terlihat seperti ini:
// 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
}
Jadi cukup sederhana: jika file yang diminta ada di direktori statis saya, panggil handler, yang akan membuka file tersebut dan mencoba mengatur kebaikan Content-Typesebelum disajikan. Pemikiran saya adalah bahwa tidak ada alasan ini perlu didasarkan pada sistem file yang sebenarnya: jika ada sumber daya yang dikompilasi, saya dapat mengindeksnya dengan URI permintaan dan melayani mereka seperti itu.
Jika tidak ada cara yang baik untuk melakukan ini, atau saya menggonggong pohon yang salah dengan mencoba melakukan ini, beri tahu saya. Saya baru saja membayangkan pengguna akhir akan menghargai sesedikit mungkin file untuk dikelola.
Jika ada lebih banyak tag yang sesuai daripada Pergilah, jangan ragu untuk menambahkannya atau beri tahu saya.
go generateutilitas baris perintah kecil (dikemas dengan kode sumber saya) untuk mengonversi file menjadi []byteirisan yang disematkan sebagai variabel dalam kode, mirip dengan bagaimana stringermelakukannya (lihat blog.golang.org / hasilkan ).