Задание переменной 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
К сожалению, никакой документации, по-видимому, нет (для получения дополнительной информации смотрите на проблему), но, как отмечает Дейв Чейни в комментарии:
это побочный эффект языкового подхода к реализации