Задание переменной Go с ldflags конфликтует с папкой вендора

В настоящее время я занимаюсь разработкой небольшого приложения Go и хочу установить определенную переменную (например, Version, GitCommit, BuildID... и т. Д.) Во время сборки или выполнения (с go build или же go run) с помощью -ldflags вариант.

Поскольку в моей компании есть несколько проектов с одной и той же базой, я решил извлечь код с этими переменными в отдельный модуль "info", который можно импортировать в каждый проект.

Вот моя проблема, скажем, я запускаю приложение так:

go run -ldflags "-X git.mycompany.com/utils/info.Version=1.0.0" app.go

Это хорошо работает, и переменная установлена ​​правильно, хотя переменная не является частью "основного" приложения, а находится в зависимости.

Тогда я решил развернуть приложение, поэтому я использовал новый dep инструмент для генерации vendor папка. Следовательно, зависимость "информация" теперь находится в: vendor/git.mycompany.com/utils/info

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

Я что-то здесь упускаю? Как только я удаляю папку vendor, все снова работает нормально. Как будто эта папка вендора конфликтует с -ldflags вариант или что-то.

Заранее спасибо!

1 ответ

У нас была точно такая же проблема, после большого количества исследований, мы наткнулись на решение в комментарии к проблеме GitHub: cmd / link: -X не работает для вендорных пакетов.

Решение: полное имя пути относительно $GOPATH должен быть указан.

Работает при разработке git.mycompany.com/utils/info потому что полный путь правильный.
Это не работает для зависимостей вендора, потому что полный путь от $GOPATH было бы как git.mycompany.com/name-of/package/vendor/git.mycompany.com/utils/info.Version=1.0.0

К сожалению, никакой документации, по-видимому, нет (для получения дополнительной информации смотрите на проблему), но, как отмечает Дейв Чейни в комментарии:

это побочный эффект языкового подхода к реализации

Другие вопросы по тегам