Импорт Go модулей из другого хранилища в одной файловой системе - PullRequest
0 голосов
/ 01 мая 2020

У меня есть два отдельных Go хранилища. Один содержит приложение, другой - общую библиотеку, которую приложение хотело бы использовать. Ни один из них не находится в $ GOPATH.

~/projects/
├── myapplication
│   ├── go.mod
│   └── myapplication.go
└── mylibrary
    ├── go.mod
    └── mylibrary.go

mylibrary / go .mod

module example.com/mylibrary

go 1.14

mylibrary / mylibrary. go

package mylibrary

var Message = "Hello, World!"

myapplication / go .mod

module example.com/myapplication

go 1.14

myapplication / myapplication. go

package myapplication

import (
    "fmt"
    "example.com/mylibrary"
)

func main() {
    fmt.Println(mylibrary.Message)
}

У меня нет оснований полагать, что вышесказанное должно работать, поскольку приложение не может выяснить, где находится библиотека. Как это сделать?

Я попробовал следующее с результатами теперь.

  • добавление ~/projects/mylibrary к GOPATH
  • запуск go install для mylibrary

Запуск go build для приложения дает:

myapplication $ go build
go: finding module for package example.com/mylibrary
myapplication.go:5:2: cannot find module providing package example.com/mylibrary: unrecognized import path "example.com/mylibrary": reading https://example.com/mylibrary?go-get=1: 404 Not Found

Я вижу, что он обращается к example.com, чтобы найти хранилище (понятно). Но как я могу сказать, что сначала нужно искать где-то локально?

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Я попробовал следующее с текущими результатами.

добавление ~ / projects / mylibrary в GOPATH

Так GOPATH работает не так. Под стилем GOPATH исходный код должен жить ниже GOPATH / sr c. Похоже, вы используете модули, так что возиться с GOPATH бесполезно, так как игнорируется.

запуск go установка для mylibrary

Это практически ничего не делает. Ни в GOPATH, ни в Go сборках стиля модуля. На 100% бесполезно заставлять компилятор Go находить исходный код, так как он устанавливает пакеты и исполняемые файлы. Для Go модульных сборок даже установка пакета практически бесполезна.

Что вам нужно сделать, это следовать «Как написать Go код».

Для вашей настройки вы должны скажите module example.com/myapplication где найти module example.com/mylibrary. Это делается с помощью директивы replace в моих приложениях go .mod:

replace example.com/mylibrary => <file-path-to-source-folder>

Dead simple.

Еда на вынос:

  • Вы можете сделать Модули или GOPATH, но не пытайтесь их смешивать.
  • go install (только) полезен для установки исполняемых файлов.
  • Если модуль A хочет использовать локальную версию модуля B: Сообщите модулю A с помощью директивы замены в go .mod.
.
0 голосов
/ 01 мая 2020

Нашел мой ответ в Как использовать модуль, который находится за пределами «GOPATH», в другом модуле? , что указывало на Могу ли я работать полностью вне VCS в моей локальной файловой системе? .

Кажется, немного не элегантно, но похоже, что официальным способом исправления моего примера приложения было бы изменение myapplication/go.mod для поиска и замены имени модуля библиотеки, заменяя его относительным путь к файловой системе.

Таким образом, чтобы этот пример работал, myapplication/go.mod станет:

module example.com/myapplication

go 1.14

replace example.com/mylibrary => ../mylibrary
...