Как использовать модуль, который находится за пределами «GOPATH» в другом модуле? - PullRequest
0 голосов
/ 14 сентября 2018

Я создал библиотеку как модуль для личного использования за пределами «GOPATH» в папке «database» с этой командой «go mod init database», и я не знаю:

  • Как использовать / импорт этого модуля в другой модуль?

ОС: Windows 7 , Go: v1.11

1 Ответ

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

Самое простое и готовое к работе решение - поместить ваш пакет / модуль database в VCS (например, github.com), чтобы другие пакеты (внутри других модулей) могли просто ссылаться на него, импортируя это как:

import "github.com/someone/database"

Если вы сделаете это, вам даже не придется вручную манипулировать файлами go.mod, все будет позаботиться об инструменте go: он автоматически распознает и разрешит эту зависимость, загрузит и установит необходимый пакет , а также автоматически обновит go.mod.

Оставаясь полностью на локальном диске

Если вы не хотите использовать VCS (например, вы просто экспериментируете или еще не решили, что использовать), тогда вы все равно можете это сделать. как подробно описано в официальном Go Wiki: Могу ли я работать полностью вне VCS на моей локальной файловой системе?

Итак, вы создали папку database вне GOPATH и создали в ней модуль. И вы создали другой модуль, назовем его main, и вы хотите использовать этот пакет database.

Что вы должны сделать, это:

  • go.mod вашего main модуля должен указывать пакет database как «требование». Дайте временное имя VCS вашему пакету database:

    require (
        example.com/me/database v0.0.0
    )
    
  • Вы должны указать инструменту go, где находится этот пакет, потому что полное имя пакета, которое мы использовали, является просто временным / фантазийным. Используйте директиву replace, чтобы этот пакет database указывал на папку на вашем локальном диске; Вы можете использовать абсолютные и относительные пути:

    replace example.com/me/database => ../database
    

И это все.

Рабочий пример

Давайте посмотрим на рабочий пример. Давайте создадим модуль pretty. Создайте папку pretty с двумя файлами в ней:

pretty.go:

package pretty

import "fmt"

func Pretty(v ...interface{}) {
    fmt.Println(v...)
}

go.mod (можно создать, запустив go mod init pretty):

module pretty

Теперь давайте создадим еще один основной модуль. Давайте создадим папку osinf (она может быть любой) рядом с папкой pretty. В нем 2 файла:

osinf.go (обратите внимание, что мы намереваемся использовать наш pretty пакет / модуль, мы импортируем его "example.com/me/pretty"):

package main

import "example.com/me/pretty"

func main() {
    pretty.Pretty("hi")
    pretty.Pretty([]int{1, 3, 5})
}

go.mod:

module main

require example.com/me/pretty v0.0.0

replace example.com/me/pretty => ../pretty

И это все.

Запуск go run osinf.go в папке osinf, вывод:

hi
[1 3 5]
...