Ссылка на локальный модуль Go

Мне не удалось импортировать пакет из локального проекта (модуль Go). Вот краткое изложение того, что я пытаюсь сделать:

Я создал пакет модуля Go следующим образом:

  $ cd 
  $ mkdir mymodule
  $ cd mymodule
  $ go mod init github.com/Company/mymodule

Затем я добавил hello.go под mymodule с небольшой функцией

// mymodule/hello.go

package mymodule

func sayHello() string {
    return "Hello"
}

go build успешно.

Обратите внимание, что модуль еще не помещен в репозиторий github. Я хочу использовать (и, возможно, протестировать) mymodule, прежде чем нажимать на github. Итак, я создал еще один пакет, например:

  $ cd 
  $ mkdir test
  $ cd test
  $ go mod init github.com/Company/test

Затем создал новый файл test.go в каталоге test, и туда я пытаюсь импортировать mymodule, например:

// test/test.go

import (
    "fmt"
    "github.com/Company/mymodule"
)

func testMyModule() {
    fmt.Println(mymodule.sayHello())
}

Но go build из test выдает ошибку, указанную ниже. Что дает?

cannot load github.com/Company/mymodule: cannot find module providing package github.com/Company/mymodule

person Keerthi    schedule 24.11.2019    source источник
comment
Никогда не вызывайте пакеты или файлы test. Экспортируйте свои вещи. Даже без ошибки модуля ваш код никогда не будет работать.   -  person Volker    schedule 24.11.2019


Ответы (3)


При разрешении зависимостей в вашем go.mod Go попытается разрешить сторонние модули, получая их с предоставленного вами удаленного URL-адреса.

Удаленный URL-адрес, если вы, например, не отправили его на GitHub, не существует. Это когда вы получаете такую ​​ошибку:

cannot load github.com/Company/mymodule: cannot find module providing package github.com/Company/mymodule

Для локальных модулей существует обходной путь: вы можете использовать ключевое слово replace в своем go.mod файле.

replace github.com/Company/mymodule v0.0.0 => ../mymodule

Это позволит Go узнать, где найти вашу локальную зависимость. Просто убедитесь, что вы используете правильный относительный путь к вашему модулю.

После того, как ваши локальные тесты будут завершены и вы поместите свой модуль в репозиторий, вы можете удалить строку replace из своего go.mod и использовать

go get -u github.com/Company/mymodule`

чтобы модуль корректно работал вместе с вашим текущим проектом.

В качестве примечания, функции и переменные в пакетах Go должны начинаться с заглавной буквы, чтобы они были доступны извне самого пакета.

Удачи!

person Nick Corin    schedule 24.11.2019
comment
Можно ли разместить директиву replace в отдельном файле модуля файла? Кажется странным и опасным модифицировать потенциально версионный файл, чтобы выполнить некоторые тесты зависимостей. - person sigz; 03.02.2021

cd в github.com/Company/test,

попробуйте go mod edit --replace=github.com/Company/mymodule=../mymodule

person zzn    schedule 24.11.2019

Go.mod в тестовом модуле может быть:

module github.com/Company/test
require github.com/Company/mymodule v0.0.0
replace github.com/Company/mymodule v0.0.0 => ../mymodule
go 1.12

PS. sayHello имя функции должно быть с заглавной буквы. Затем он становится общедоступным и экспортируется в другие модули.

person Howard    schedule 24.11.2019