2014-12-17 1 views
4

Освобождение инструмента 'generate' открывает множество интересных возможностей. Я пытался улучшить свои тесты. У меня есть функция, которая запрашивает внешний API, расположение этого API определено в глобальной переменной. Одна часть головоломки заменяет это значение значением, определяемым в «время генерации».сгенерируйте с помощью gofmt, заменив значение переменной

у меня есть:

//go:generate gofmt -w -r "var apiUrl = a -> var apiUrl = \"http://example.com\"" $GOFILE 

Запуск идут генерировать то ошибки с помощью:

parsing pattern var apiUrl = a at 1:1: expected operand, found 'var' 

Это не вариант использовать держатель место так:

gofmt -r 'API_GOES_HERE -> "http://example.com"' -w 

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

Я понимаю, что я злоупотребляю gofmt, но я бы предпочел не вернуться к sed. Что было бы действительным заявлением go:generate?

+0

После обширного поиска, я довольно уверен, что это невозможно с помощью только gofmt. Хорошей новостью является то, что сгенерируйте can, AFAIK, запустите произвольные скрипты в вашей $ PATH, чтобы вы могли получить возможность генерировать, чтобы запускать sed или что-то еще просто отлично. – LinearZoetrope

+0

Я боялся, что вы пришли к такому выводу. Вернемся к 'sed'. Благодарю. – harm

+0

Да, я думаю, что единственный реальный способ - написать собственный сценарий генерации и шаблон, используя os.Expand или что-то в этом роде, и если вы можете сделать то же самое с sed, вы можете также просто sed. – LinearZoetrope

ответ

3

Для этого вы можете использовать флаг компоновщика -X. Например,

go build -ldflags "-X main.APIURL 'http://example.com'" 

будет строить свою программу с APIURL набора переменных в http://example.com.

More info in the linker docs.


Go 1,5 редактировать: начиная с Go 1.5, это recommended использовать новый формат:

go build -ldflags "-X main.APIURL=http://example.com" 

(. Обратите внимание, что знак равенства)

1

В тестовом файле говорят api_test.go добавить генерировать команду, которая производит другой файл с именем api_endpoint_test.go, который находится в том же пакете и только определяет или inits (с помощью функции init) переменную, которую нужно. Это значение переменной будет использоваться только во время тестирования.


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

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

  • Нет связанных вопросов^_^