Подтвердить что ты не робот

Как встроить файл для последующего использования при анализе

Я по существу пытаюсь пройти через папку html файлов. Я хочу внедрить их в двоичный файл и иметь возможность анализировать их по запросу для целей создания шаблона. (Пожалуйста, извините меня, если я не сформулировал это правильно).

Любые идеи, советы, трюки или лучший способ добиться этого очень ценятся.

// Template Files
type TempFiles struct {
    Files map[string]string
}

// Loop through view files and load them
func LoadTempFiles() {
    t := new(TempFiles)

    // Load template files
    filepath.Walk("application/views", func(path string, info os.FileInfo, err error) error {
    if !info.IsDir() {
        content, _ := ioutil.ReadFile(path)
        t.Files[path] = string(content)
    }
    return nil
    })
}

func ViewTemp(w http.ResponseWriter, path string) {
    t := new(TempFiles)

    temp, err := template.New().Parse(t.Files[path])
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    } else {
        temp.Execute(w, nil)
    }
}
4b9b3361

Ответ 1

Я делаю это с большинством моих веб-приложений Go. Я использую go-bindata, чтобы автоматически генерировать исходный код Go из всех файлов, которые я хочу встроить, а затем компилировать их в двоичный файл. Все это делается автоматически во время сборки.

Недостатком является то, что текущие инструменты сборки go не предлагают способа подключиться к процессу сборки, поэтому я использую Makefile для этой цели. Когда вызывается make файл, он запускает go-bindata, чтобы сгенерировать источники для всех необходимых файлов, затем обычно выполняет некоторые дополнительные биты и бобы генерации кода (в частности, создает исходный файл Go, в котором перечислены все встроенные файлы на карте. A Оглавление, если хотите). Затем он приступает к компиляции фактической программы.

Это может стать немного грязным, но вы должны настроить его всего один раз. Другим недостатком является то, что использование Makefile означает, что программное обеспечение несовместимо с командой go get. Но поскольку большинство моих веб-приложений в любом случае не предназначены для совместного использования, это пока не является проблемой.

Когда дело доходит до отладки/разработки такого приложения, возникает другая проблема, возникающая из-за встраивания статического веб-контента: я не могу просто отредактировать файл HTML или CSS и обновить браузер, чтобы увидеть его эффекты. Я должен был бы остановить сервер, перестроить его и перезапустить при каждом редактировании. Это явно не идеально, поэтому я разделил Makefile на режимы debug и release. Режим выпуска делает то, что я описал выше. Однако режим отладки не будет встраивать статические файлы. Он генерирует исходные файлы для каждого из них, но вместо того, чтобы они содержали фактические данные файла, он содержит заглушку, которая просто загружает данные из файловой системы.

Что касается кода сервера, в сгенерированном коде нет различий. Все, что он делает, это вызывает функцию для извлечения содержимого данного статического файла. Не имеет значения, встроен ли этот контент в двоичный файл или загружен из внешнего источника. Таким образом, два режима сборки свободно взаимозаменяемы.

Например, одна и та же сгенерированная функция для извлечения статического содержимого файла в режиме выпуска и отладки будет выглядеть следующим образом:

Режим выпуска:

func index_html() []byte {
    return []byte {
        ....
    }
}

Режим отладки:

func index_html() []byte {
   data, err := ioutil.ReadFile("index.html")
   ...
   return data
}

Интерфейс в обоих случаях идентичен. Это позволяет легко и без заботы разрабатывать и отлаживать.

Ответ 2

Еще один инструмент для рассмотрения: Еще один хороший хороший инструмент исходит из esc: Вложение статических активов в Go (GitHub repo)

программа, которая:

  • может принимать некоторые каталоги и рекурсивно встраивать все файлы в них способом, который был совместим с http.FileSystem
  • может быть необязательно отключен для использования с локальной файловой системой для локальной разработки
  • не будет изменять выходной файл при последующих запусках
  • имеет разницу в разумных размерах при изменении файлов.
  • является продавцом

Vendoring-friendly означает, что при запуске godep или участника статический файл вставки не изменится.
Это означает, что у него не должно быть сторонних импортных товаров (поскольку их путь импорта будет перезаписан в течение goimports и, следовательно, отличается от того, что сам инструмент производит), или для конкретного места для необходимых импортных сторонних поставщиков.

Он генерирует хорошие строки gzipped, по одному на файл.
Существует простой флаг, чтобы включить режим локальной разработки, который достаточно умен, чтобы не стирать префиксы каталога от имен файлов (иногда это необходимо в esc).
Вывод включает весь необходимый код и не зависит от каких-либо сторонних библиотек для совместимости с http.FileSystem.

Ответ 3

Я сделал пакет, который упрощает переключение между отладкой и производством. Он также предоставляет реализацию http.FileSystem, облегчая серверу файлов. И он имеет несколько способов добавления файлов в двоичный файл (генерировать код go или добавлять как zip). https://github.com/GeertJohan/go.rice