@darknefrit

Как правильно использовать модули Go?

Не пойму как использовать модули без публикации их в системе контроля версий ?
Например создаю папку

c:/Project
в ней папку для модулей
c:/Project/Modules.pack
дальше папку для подлуля
c:/Project/Modules.pack/mod1

делаю в ней go mod init Modules.pack/mod1
затем go get
всё ок вроди бы, подягивает заивисмости и добавляет из go.mod

теперь хочу сделать модуль который будет использовать mod1

c:/Project/Modules.pack/mod2
в файле mod2.go

package mod2
import (
	. "Modules.pack/mod1"	
)
....


делаю в go mod init Modules.pack/mod2
go get
и получаю ошибку
Modules.pack/mod2 imports
Modules.pack/mod1: cannot find module providing package Modules.pack/mod1

Не пойму как правильно и где размещать и как указывать пути в import для своих модулей

Не пойму как использовать эти модули в программе? как правильно их импортировать
  • Вопрос задан
  • 236 просмотров
Пригласить эксперта
Ответы на вопрос 1
2ord
@2ord
продвинутый чайник
Если нужен пример как использовать локально, то можете посмотреть пример в репозиторие go-openvz-api. Это первая фиксация кода (commit), до использования go modules.
Далее в истории фиксаций впоследствии перешел на go modules.

main.go
package main
import "./package1"
...


package1/file1.go
package package1
import (
  "fmt"
)
...


package1/file2.go
package package1
...


Если изначально применять схему именования пакета как для хранения на удаленных хранилищах, то можно сделать так:

go mod init example.org/user/mypackage
Это означает, что префикс при импорте в пакетах всегда будет начинаться с example.org/user/mypackage. Все что в поддиректориях проекта, при импорте должно быть указано как example.org/user/mypackage/название_подпапки (например, example.org/user/mypackage/package1).

И важные дополнения, без которых ничего не будет работать:
1. Проект должен располагаться вне пути GOPATH.
2. Отредактировать go.mod, добавив строку
replace example.org/user/mypackage => ./
Эта инструкция укажет на локальную папку, находящуюся по тому же пути, где и корень проекта. Таким образом, go не будет искать на хостинге http: //example.org/user/mypackage

Это сработает для Linux, где пути указаны косой чертой (точка в начале - текущая директория). В Windows используется обратная косая черта. Как в Go работают с путями в Windows - не знаю.

То есть можно работать локально и никуда не закачивать код, будет все работать локально.
И когда все же закачаете код на хранилище, поменяйте везде example.org/user/mypackage на истинное расположение репозитория, а строку с replace удалите с go.mod, иначе будет искать код только локально.

Замечания:
1. Не исключено, что название Modules.pack проблематично из-за точки внутри.
2. . "Modules.pack/mod1"так неправильно. Точку вначале убрать
Можно так:
"./Modules.pack/mod1"
или так:
"example.org/user/Modules.pack/mod1"
или так:
"qqw example.org/user/Modules.pack/mod1" // а в самом коде ниже писать qqw вместо mod1


Вместо go get использую go mod tidy.
Сам с Go модулями не так давно работаю, но думаю что так надо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы