如何解析Go web应用程序的根?

如何解析Go web应用程序的根?,web,go,relative-path,static-files,Web,Go,Relative Path,Static Files,我正在使用go的net/http库提供web应用程序。当用户访问该站点时,他们只需转到/,它提供index.html(与任何站点一样) 这是通过以下方式实现的: r.PathPrefix("/").Handler(http.FileServer(http.Dir("./"))) 然而,有两种方法可以构建这样的应用程序。首先,您可以将所有文件打包到同一目录中。在我看来,这是一个不稳定的解决方案(如果我直接运行go文件,它就会失败) 或者,更“传统”的样式,其中index.html是顶层 src/

我正在使用go的
net/http
库提供web应用程序。当用户访问该站点时,他们只需转到/,它提供index.html(与任何站点一样)

这是通过以下方式实现的:

r.PathPrefix("/").Handler(http.FileServer(http.Dir("./")))
然而,有两种方法可以构建这样的应用程序。首先,您可以将所有文件打包到同一目录中。在我看来,这是一个不稳定的解决方案(如果我直接运行go文件,它就会失败)

或者,更“传统”的样式,其中index.html是顶层

src/bin/app.go
index.html
  • 在go web应用程序中,index.html或其他静态资源的正确位置在哪里
  • 一旦我们将go文件打包成二进制文件,/的位置是如何确定的
  • go二进制文件能否保留非go资源的目录结构,以便在开发环境和生产环境之间保持一致
更新(下面的答案是正确的,我通过下面的Not_a_golfer实现了这个建议,我的dir树如下所示,通过服务器中的conf或动态逻辑在任何环境中都很容易维护)


由于Go不会将资产捆绑到二进制文件中,因此将代码和资产捆绑在一起肯定不是一个好主意

我建议采取以下措施之一:

首先,在这两种情况下-使您的应用程序可配置,以便它通过命令行标志或配置文件接受静态资产的保存位置。它应该是一个绝对路径,因为它与可执行文件的存储位置无关

以及:

  • 为静态资产保留一个完全独立的项目,作为构建步骤,确保它们打包在一起。事实上,您可以将它们单独部署到服务器上,因此,如果您仅部署HTML/JS/image更改,则不必重新启动Go应用程序

  • 将它们的源代码放在同一个项目中,但是创建一个名为“html”或“static”的顶级目录。此目录下不允许使用Go文件。部署过程应与#1中相同


  • 由于Go不会将资产捆绑到二进制文件中,因此将代码和资产捆绑在一起肯定不是一个好主意

    我建议采取以下措施之一:

    首先,在这两种情况下-使您的应用程序可配置,以便它通过命令行标志或配置文件接受静态资产的保存位置。它应该是一个绝对路径,因为它与可执行文件的存储位置无关

    以及:

  • 为静态资产保留一个完全独立的项目,作为构建步骤,确保它们打包在一起。事实上,您可以将它们单独部署到服务器上,因此,如果您仅部署HTML/JS/image更改,则不必重新启动Go应用程序

  • 将它们的源代码放在同一个项目中,但是创建一个名为“html”或“static”的顶级目录。此目录下不允许使用Go文件。部署过程应与#1中相同


  • 对于这个建议,我非常喜欢通过配置文件so+1配置静态文件位置。@jayunit100谢谢。不过,我通常不会将我的代码保存在/src下,这样导入到我的代码中就不会像“github.com/me/foo/src/bar”一样。我非常喜欢通过配置文件so+1配置静态文件位置,这是我的建议。@jayunit100谢谢。但我通常不会将代码保存在/src下,这样导入到代码中的内容就不会像“github.com/me/foo/src/bar”
    src/bin/app.go
    index.html
    
    ├── src
    │   └── main
    │       └── app.go
    └── static
        ├── index.html
        ├── script.js
        └── style.css