Одна из приятных особенностей 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 ).