Как включить файл в процесс компиляции в Go?

Добрый день! У меня возник вопрос: при компиляции и последующем использовании exe-файла (например, на Windows) есть проблема с тем, что он не открывается в другой директории. Я нашел способ сохранить json-файл, записав его в переменную (не судите строго, я все еще учусь), но у меня также есть html-файл, который я подтягиваю. 

Вот моя функция serveHTTP:

```go
func serveHTTP() {
    router := gin.Default()
    router.LoadHTMLGlob("./web/templates/*")
    router.GET("/", HTTPAPIServerIndex)
    router.GET("/stream/player/:uuid", HTTPAPIServerStreamPlayer)
    router.POST("/stream/receiver/:uuid", HTTPAPIServerStreamWebRTC)
    router.GET("/stream/codec/:uuid", HTTPAPIServerStreamCodec)
}
```

Мой вопрос заключается в том, можно ли избежать этой проблемы? Или есть возможность встроить html-файл прямо в код, как я это сделал с json? Мне кажется, что html можно экранировать.
  • 14 декабря 2024 г. 20:53
Ответы на вопрос 2
Да, в Go есть возможность встраивать файлы, включая HTML, в исполняемый файл. Это можно сделать с использованием пакета `embed`, который был добавлен в Go 1.16. С его помощью вы можете включить HTML-файлы непосредственно в ваш бинарный файл во время компиляции.

Вот как это можно сделать:

1. Добавьте в ваш проект пакет `embed`, если вы еще этого не сделали. Убедитесь, что вы используете Go версии 1.16 или выше.

2. Используйте директиву `//go:embed`, чтобы встроить HTML-файлы (или другие ресурсы) в ваш код. Например:

```go
package main

import (
    "embed"
    "github.com/gin-gonic/gin"
    "net/http"
)

//go:embed web/templates/*
var templates embed.FS

func serveHTTP() {
    router := gin.Default()

    // Используйте встроенную файловую систему
    router.SetFuncMap(template.FuncMap{
        // Здесь вы можете добавить свои функции-шаблоны, если нужно
    })

    router.LoadHTMLFiles(templates, "web/templates/index.html") // Замените на ваши HTML-файлы
    router.GET("/", HTTPAPIServerIndex)
    router.GET("/stream/player/:uuid", HTTPAPIServerStreamPlayer)
    router.POST("/stream/receiver/:uuid", HTTPAPIServerStreamWebRTC)
    router.GET("/stream/codec/:uuid", HTTPAPIServerStreamCodec)

    // Остальной код вашего сервера
}
```

### Обратите внимание:

1. Директива `//go:embed` обязательна и должна быть написана перед объявлением переменной, в которой вам нужно хранить встраиваемые файлы.

2. В примере кода выше я использовал `LoadHTMLFiles`, чтобы загрузить HTML-файлы из встраиваемой файловой системы. Правильный путь к файлам зависит от их расположения, и вам может потребоваться адаптировать пример к вашим конкретным шаблонам.

3. Убедитесь, что все ваши HTML-файлы находятся в указанной папке или папках, чтобы они были встроены в ваш бинарный файл.

Используя этот метод, вам не нужно беспокоиться о том, в какой директории находится ваш исполняемый файл, потому что все необходимые файлы будут встроены в него.
через https://pkg.go.dev/embed можно запихнуть один файл в строку и слайс байт или один или несколько файлов в "файловую систему"
Похожие вопросы