Одна из приятных особенностей golang заключается в том, что вы можете просто распространять свои программы через исполняемые файлы, что означает, что пользователю не нужны специальные библиотеки для установки / запуска вашего программного обеспечения: просто скачайте исполняемый файл, и вы перезагрузить.

На самом деле Go объединяет все ваши *.go файлы в единый, зависящий от платформы исполняемый файл, который можно запустить одним щелчком мыши - что отлично работает в 99% наших случаев использования.

Все это кажется отличным, пока вам не придется объединять в приложение разные типы файлов, например, .yml файл конфигурации или файл перевода .xliff.

Как бы вы к этому подойти? Введите трюк года.

Идея

Идея состоит в том, что вы можете создать исходный файл go, который содержит все файлы, не относящиеся к Go, которые вам нужно объединить, что-то в этом роде:

package something
func GetAssetContents(string asset) string {
  if asset = "file.txt" {
    return "1234"
  }
  if asset = "file.css" {
    return "hello { display: block; }"
  }
  // ...
}

и в своем коде вы можете потребовать эти файлы, просто выполнив GetAssetContents("file.txt"); тогда при выполнении go build все ваши активы будут «включены» в ваш окончательный двоичный файл.

Введите го-биндата

Теперь вы можете возразить, что написание такого кода не идеально, и это правда - вот почему вы найдете go-bindata полезным, поскольку он генерирует весь код автоматически:

go get jteeuwen/go-bindata
echo "1234" > sample.txt
go-bindata -pkg something -o sample.go ./sample.txt

и вот результат: как видите, go-bindata сгенерировала новый файл go в пакете something и встроила в него содержимое sample.txt.

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

import (
  "github.com/you/library/something";
  "fmt"
)
func main () {
  fmt.Println(Asset("sample.txt")) // 1234
}

Довольно аккуратно, а?

Я обернул все это вместе в репозиторий github, где вы можете увидеть актив и то, как его можно включить в код go с помощью go-bindata: это то, что мне пришлось сделать в одной из моих библиотек, Обидчивый, и это я автоматизировал с помощью Makefile (нет go-generate для меня, слишком ленив :)).

PS: Кстати, вы слышали о nexe? Это инструмент компиляции для узла, который, кажется, облегчает распространение исполняемых файлов узла.

Первоначально опубликовано на odino.org ( 30 июня 2016 ).