go 1.16: 如何在 go:embed 中使用 strip 前缀
go 1.16: how to use strip prefix in go:embed
我有一个使用 VueJS
提供网络界面的 go 项目。在构建项目时,我首先使用 npm run build
编译前端代码,它在我的项目目录的 gui/dist
下生成。然后我使用这段代码来提供静态内容:
//go:embed gui/dist/*
var dist embed.FS
gui := http.FileServer(http.FS(dist))
http.Handle("/", gui)
http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
msg := fmt.Sprintf("TODO: %s", r.URL)
http.Error(w, msg, http.StatusNotImplemented)
})
svr := http.Server{
Addr: fmt.Sprintf(":%v", cf.HTTPPort),
ReadTimeout: time.Minute,
WriteTimeout: time.Minute,
}
assert(svr.ListenAndServe())
问题是,当用浏览器打开网站时,显示的是浏览文件的界面,即从gui开始,然后进入dist,然后显示index.html
文件,这是一个空白页面,因为它需要 /css/...
等文件,而 go web 服务器在 /gui/dist/css/...
.
提供它
我尝试使用 http.StripPrefix()
但显然它不是为了处理这种情况,或者我没有正确使用它:
http.Handle("/", http.StripPrefix("/gui/dist", gui))
生成了 404 page not found
.
您可以使用fs.Sub(dist, "gui/dist")
(docs),试试看:
package main
import (
"embed"
"fmt"
"io/fs"
"log"
"net/http"
)
func main() {
http.Handle("/", http.FileServer(getFileSystem()))
http.HandleFunc("/api/", api)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err)
}
}
func getFileSystem() http.FileSystem {
fsys, err := fs.Sub(dist, "gui/dist")
if err != nil {
log.Fatal(err)
}
return http.FS(fsys)
}
func api(w http.ResponseWriter, r *http.Request) {
msg := fmt.Sprintf("TODO: %s", r.URL)
http.Error(w, msg, http.StatusNotImplemented)
}
//go:embed gui/dist/*
var dist embed.FS
我有一个使用 VueJS
提供网络界面的 go 项目。在构建项目时,我首先使用 npm run build
编译前端代码,它在我的项目目录的 gui/dist
下生成。然后我使用这段代码来提供静态内容:
//go:embed gui/dist/*
var dist embed.FS
gui := http.FileServer(http.FS(dist))
http.Handle("/", gui)
http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
msg := fmt.Sprintf("TODO: %s", r.URL)
http.Error(w, msg, http.StatusNotImplemented)
})
svr := http.Server{
Addr: fmt.Sprintf(":%v", cf.HTTPPort),
ReadTimeout: time.Minute,
WriteTimeout: time.Minute,
}
assert(svr.ListenAndServe())
问题是,当用浏览器打开网站时,显示的是浏览文件的界面,即从gui开始,然后进入dist,然后显示index.html
文件,这是一个空白页面,因为它需要 /css/...
等文件,而 go web 服务器在 /gui/dist/css/...
.
我尝试使用 http.StripPrefix()
但显然它不是为了处理这种情况,或者我没有正确使用它:
http.Handle("/", http.StripPrefix("/gui/dist", gui))
生成了 404 page not found
.
您可以使用fs.Sub(dist, "gui/dist")
(docs),试试看:
package main
import (
"embed"
"fmt"
"io/fs"
"log"
"net/http"
)
func main() {
http.Handle("/", http.FileServer(getFileSystem()))
http.HandleFunc("/api/", api)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err)
}
}
func getFileSystem() http.FileSystem {
fsys, err := fs.Sub(dist, "gui/dist")
if err != nil {
log.Fatal(err)
}
return http.FS(fsys)
}
func api(w http.ResponseWriter, r *http.Request) {
msg := fmt.Sprintf("TODO: %s", r.URL)
http.Error(w, msg, http.StatusNotImplemented)
}
//go:embed gui/dist/*
var dist embed.FS