Как мне решить "не могу найти модуль для пути X", импортируя локальный модуль Go? - PullRequest
0 голосов
/ 01 сентября 2018

В моем проекте Go я хочу разбить некоторые общие функции на модуль Go, отдельный от основного проекта. Я делаю это вне GOPATH в соответствии с будущим го. Я не хочу публиковать модуль на GitHub или где-либо еще.

Все мои попытки импортировать этот модуль в основной проект приводят к:

cannot find module for path X

Я запустил go mod init X в папке модуля. Содержимое его файла go.mod:

module X

Сборка или установка этого модуля, похоже, ничего не делают. Я не нашел никаких признаков этого в $GOPATH/pgk/mod.

Я пробовал различные операторы импорта:

Помощь!

1 Ответ

0 голосов
/ 01 сентября 2018

Итак, вы написали Go "библиотечный" модуль, который:

  • вы не хотите публиковать на GitHub или в другом месте
  • вы хотите импортировать и использовать его в своем проекте («основной» модуль).

Используйте директиву replace для решения этой проблемы.

Учитывая имя модуля "X", как вы его назвали, в свой основной модуль добавьте следующие строки:

require "X" v0.0.0
replace "X" v0.0.0 => "{local path to the X module}"

Путь должен указывать на корневой каталог модуля и может быть абсолютным или относительным.

Для импорта пакета util из модуля X :

import "X/util"

(Вы не импортируете модули. Вы импортируете пакеты из модулей.)


Объяснение

Функциональность модуля Go предназначена для общедоступных модулей. Обычно имя модуля является и его уникальным идентификатором, и путем к его публичному репо. Когда ваш go.mod объявляет зависимость модуля с помощью директивы require, Go автоматически найдет и получит указанную версию модуля по этому пути.

(См. Также в FAQ по модулям Go, Можно ли работать полностью вне VCS в моей локальной файловой системе? )

Если, например, ваш файл go.mod содержит require github.com/some/dependency v1.2.3, Go извлечет модуль из GitHub по этому пути. Но если он содержит require X v0.0.0, «X» не является реальным путем, и вы получите ошибку cannot find module for path X.

Директива replace позволяет вам указать путь замены для данного идентификатора модуля и версии. Есть много причин, по которым вы хотите сделать это , например, чтобы проверить изменения в модуле, прежде чем отправлять их в публичный репозиторий. Но вы также можете использовать его для привязки идентификатора модуля к локальному коду, который вы никогда не собираетесь публиковать.

Надеюсь, это поможет.

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