Go модуль для нескольких пакетов, с новым основным номером> 1 - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь перенести существующий проект Go на модули, но не могу определить правильную структуру каталогов. Репозиторий содержит два обычных пакета (p1, p2) и примеры программ, демонстрирующих, как использовать пакеты. Я использую Go 1.13.

Текущий макет

<reponame>
   |
   +---  p1
   |     |
   |     +-- p1a.go
   |     +-- p1b.go
   |
   +---  p2
   |     |
   |     +-- p2a.go
   |     +-- p2b.go
   |
   +--  examples
         |
         +-- e1.go (which refers to packages p1 and p2)

Репозиторий github уже опубликован c с тегом версии> 1. Я знаю, что мне нужна новая основная номер v5, так что, похоже, мне нужно перейти к v5 где-нибудь на пути к пакетам.

Но должно ли это быть <repo>/v5/p1 или <repo>/p1/v5? Откуда go .mod файлы go? Я подозреваю, что мне нужен один, чтобы покрыть два пакета, и один для примеров программ.

Все примеры, которые я могу найти для версии> 1, похоже, содержат только один пакет в модуле.

И что важно, как мне получить примеры для компиляции и запуска? Я попробовал все виды перестановок файла go .mod для примеров, но все они продолжают давать сбой с ошибкой типа "нет подходящих версий для запроса 'v5'", даже с директивой replace, чтобы попытаться указать на местные каталоги.

Похоже, он ожидает, что версия v5 уже будет опубликована на github, прежде чем я проведу локальное тестирование.

1 Ответ

1 голос
/ 29 апреля 2020
  1. Модули о версиях. Если p1, p2 и example версированы вместе , тогда поместите go .mod на уровне репо. Вероятно, это то, что вам нужно.

  2. Убедитесь, что модуль правильно объявляет себя, т. Е. module <repo>/v5 в файле go .mod.

  3. Вам не нужно v5 в пути файловой системы. Есть три основных способа: папка v5, содержащая материал v5, ветка v5, содержащая материал v5, или ни один из двух, в этом случае ваше репо будет только v5.

  4. Убедитесь, что пути импорта правильные. Например, в примерах пакетов вы должны импортировать p1 через import "<repo>/v5/p1". (То же самое для p2 или даже p1, импортирующего p2 и т. Д. c.)

Thats all.

cd в папку примера и go build: Go найдет дерево файловой системы для go .mod и найдет его в репозитории root. Таким образом, он знает, что этот пакет принадлежит модулю <repo>/v5 и, таким образом, где найти все пакеты из модуля <repo>/v5 и может импортировать <repo>/v5/p1 без необходимости какой-либо директивы замены. Таким образом, вы можете работать локально на v5 без необходимости делать pu sh для удаленного репо.

(Распространенная ошибка - не объявлять модуль как v5: в go .mod файл, у вас должна быть строка module github.com/<user>/<repo>/v5. Если вы ложно просто пишете модуль github.com/<user>/<repo>, то при компиляции, например, примеров, компилятор считает "хорошо, пакет examples принадлежит модулю github.com/<user>/<repo>, и я должен импортировать github.com/<user>/<repo>/v5/p1 так что давайте заглянем на github.com//, чтобы увидеть, что мы там находим ... "и не будем ничего искать и жаловаться.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...