Компиляция проекта Golang

Обычно мы помещаем проект golang прямо в каталог $GOPATH/src, и пути всех импортируемых пакетов также относятся к GOPATH.

При разработке проекта в последнее время необходимо сделать проект компилируемым в любом каталоге. Вот решение.

В начале проект размещался непосредственно в каталоге $GOPATH/src. Ссылка на сторонний пакет — import github.com/xxx/xxx, а ссылка на внутренний пакет — import xxx/xxx. Таким образом, путь поиска внутреннего пакета на самом деле $GOPATH/src/xxx/xxx.

Позже, поскольку travis-ci использовался для непрерывной интеграции, travis-ci напрямую использовал go get github.com/xxx/xxx, чтобы загрузить код, а затем скомпилировать и запустить его.

Вот где возникает проблема. Локальный путь к исходному коду, загруженному через go get, — $GOPATH/src/github.com/xxx/xxx, и внутренний пакет не может быть найден, что приводит к сбою компиляции.

Используйте эталонный метод, аналогичный сторонним пакетам.

Самый прямой способ решить эту проблему — изменить метод ссылки внутреннего пакета на import github.com/xxx/xxx/xxx, который можно передать при компиляции в travis-ci. В то же время вам нужно обратить внимание на путь вашего локального проекта. Замените его на $GOPATH/src/github.com/xxx/xxx, который используется во многих проектах с открытым исходным кодом для ссылки на внутренние пакеты.

Примечание. Не рекомендуется использовать относительные пути, такие как ./ или ../, для ссылки на внутренние пакеты, что не очень удобно для управления и поиска проблем.

Позже, из-за необходимости совместной разработки других людей, после разветвления моего проекта они также использовали go get для загрузки исходного кода своего разветвленного проекта, так что xxx было заменено их собственным именем пользователя, но имя импортированного пакета в код не изменился, что привело к сбою их компиляции.

Конечно, они могут снова положить проект в нужную директорию, но иметь лишнюю копию всегда неудобно.

Изменить GOPATH.

На самом деле ключ к проблеме кроется в переменной окружения GOPATH, которая определяет абсолютный путь для поиска пакета.

Мы создаем структуру каталогов типа src/xxx в корневом каталоге проекта, а затем помещаем исходный код в этот каталог, а затем меняем метод приложения внутреннего пакета на краткий формат, например import xxx/xxx.

При компиляции добавьте корневой каталог проекта в GOPATH, например GOPATH=`pwd`:${GOPATH}, чтобы он выполнял поиск внутренних пакетов в своем собственном каталоге.

Видно, что в какую бы директорию вы ни положили таким образом проект, его можно успешно скомпилировать. Разумеется, для удобства управления рекомендуется класть его в каталог $GOPATH/src, а для управления сторонними пакетами использовать godep.

Спасибо, что прочитали эту статью.