使用非常规目录结构在同一页面上提供HTML模板和CSS?

时间:2019-02-09 15:43:02

标签: go fileserver

我一直试图弄清楚几次如何在同一页面上提供CSS和html,但我总是最终感到沮丧并使用引导程序。我真的很想让我的下一个项目拥有我自己的手写CSS。我的源代码树看起来像这样。

 - cmd
     - main.go 
 - static
     - css
     - templates

之所以这样,我的源代码树之所以如此,是因为我想在cmd中拥有两个软件包:一个用于提供模拟数据,另一个用于运行实际应用程序。我看过其他使用http.FileServer的帖子,但是项目结构与目录根目录中的main.go文件有很大不同。我尝试做类似的事情:

fs := http.FileServer(http.Dir("../static/css"))
http.Handle("/signup/", http.StripPrefix("/static/css", fs))

1 个答案:

答案 0 :(得分:0)

如上面注释中提到的,放置文件的目录将相对于编译后的二进制文件。

go run main.go将在当前目录中编译,然后运行可执行文件,因此,应用程序中的所有路径都将来自已编译的位置,而不是整个项目结构。我将尝试在下面显示一个示例:

// Current working directory
/your-github-username/project-folder

// Folder with entry point (main.go)
/your-github-username/project-folder/cmd

// Folder with static files (css file)
/your-github-username/project-folder/static

如果您在go run ./cmd/main.go中运行/your-github-username/project folder,那么您在问题中的编写方式将使应用程序尝试从/your-github-username/static加载静态文件。即从您运行go run命令的位置开始的一个文件夹。

但是,如果您构建和部署应用程序,则相对于您放置编译后的二进制文件的位置,都需要重新创建/static文件夹。

main.go中要做的一件好事是拥有某种初始化功能,该功能可以检查所需的文件夹,创建它们,然后在它们为空时输出指令,等等。作为部署过程的一部分。

如果您想要一个非常好的静态文件托管示例,我建议您查看 go-chi路由器库示例,因为其中有些很棒,其中包括静态文件托管示例:

go-chi static file example