2013-10-25 3 views
20

В моем приложении используются файлы конфигурации json и другие ресурсы. Где я должен поместить их в свою иерархию проектов? я не мог найти ответ в http://golang.org/doc/code.html (Как написать код Go)Где ресурсы должны храниться в golang

UPD: Вопрос не об автоматическом распределении ресурсов с применением, но гораздо проще: Где я должен держать свои ресурсы в иерархии проекта? Есть ли какое-то стандартное место, которое кто-то ожидает от них?

+3

Куда бы вы ни пожелали? Поскольку Go производит (почти) автономные двоичные файлы, это в основном безответный вопрос. Бинарный файл должен найти ресурсы, поэтому укажите флаг командной строки (или переменную среды или соглашение или что-то еще), которое указывает на ваши ресурсы. – Volker

+0

@Volker все, что он хочет, - это решения для управления активами (которые уже есть у самых достойных языков). На данный момент нет такой вещи, но есть запрос на ее https://code.google.com/p/go/issues/detail?id=3035 –

+1

@MateuszDymczyk. Большинство «достойных» языков не включают в себя никакой вид инструментов для упаковки активов в их стандартную библиотеку. Существует не один способ сделать это. Если вы хотите доставить файлы конфигурации вместе с вашим двоичным кодом, включите их в tarball/zip и, возможно, напишите Makefile или небольшой установочный скрипт, который ставит все на место/позволяет пользователю указывать флаг. – elithrar

ответ

9

В настоящее время нет ни одного правильного ответа, ни каких-либо сильных соглашений, которые были приняты или не были применены никакими инструментами Go в это время.

Обычно я начинаю с предположения, что нужные мне файлы находятся в том же каталоге, в котором будет запущена программа. Например, предположим, что мне нужно conf.json для myprog.go; то оба эти файлы живут вместе в одной и той же директории, и она работает просто запустить что-то вроде

go build -o myprog && ./myprog 

Когда я разворачивать код, то myprog двоичную и conf.json живут вместе на сервере. Сценарий run/supervisor должен быть cd в этот каталог, а затем запустить программу.

Это также работает, когда у вас много ресурсов; например, если у вас есть веб-сервер с JS, CSS и изображениями, вы просто предполагаете, что они относятся к cwd в коде и разворачивают каталоги ресурсов вместе с бинарным сервером.

Другой альтернативой предположению, что cwd должен иметь флаг -conf, который пользователь может использовать для указания файла конфигурации. Обычно я использую это для распространения инструментов командной строки и приложений с открытым исходным кодом, для которых требуется один файл конфигурации. Вы даже можете использовать флаг -assets или что-то еще, чтобы указать на все дерево файлов ресурсов, если хотите.

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

+0

На мой взгляд, это плохая идея сохранить источник и ресурсы вместе. Ресурсы в двоичном коде, похоже, тоже имеют множество недостатков. –

Смежные вопросы