Как создать локальный модуль Go 1.11 (VGO) и импортировать его?
Я разрабатываю код на Go. Я хочу разбить некоторые общие функции в отдельный vgo
Модуль, который находится в отдельном каталоге от основного проекта. Я делаю это вне GOPATH в соответствии с будущим го. Я не хочу публиковать модуль на GitHub или где-либо еще.
Я не могу понять, как импортировать этот модуль в основной проект. Все, что я пробовал в операторе импорта, приводит к:
cannot find module for path X
Я бегал go mod init X
в папке модуля. Содержание его go.mod
файл:
module X
(Я заметил, что сборка или установка этого модуля, кажется, ничего не делают. Я не нашел никаких признаков этого в $GOPATH/pgk/mod
)
Операторы импорта, которые я пробовал в основном проекте:
import "X"
import "../x"
( относительный путь к каталогу модуля)import "../x/X"
(путь к каталогу + имя модуля)
Я прочитал все документы Расса Кокса. Я искал в Интернете ответы безрезультатно.
Я потерял два дня на этом. Пожалуйста помоги!
5 ответов
Итак, вы написали vgo
модуль, который вы не хотите публиковать на Github, и вы хотите импортировать его, чтобы протестировать в другом главном модуле.
Использовать
replace
Директива для решения этой проблемы.
В вашем основном модуле, где вы проверяете свой локальный модуль, добавьте следующие строки
replace "X" v0.0.0 => "{location To your local module}"
require "X" v0.0.0
И тогда в вашем основном проекте вы можете просто сделать
import "X"
После этого, когда вы будете делать vgo build
он будет искать этот локальный модуль в том месте, которое вы указали в файле мода основного проекта.
Если вы не используете оператор замены, он будет искать онлайн-ресурсы для модуля, он выдаст ошибку, даже если вы поместите свой локальный модуль в $GOPATH/pgk/mod
Надеюсь это поможет.
Если вы не хотите использовать модули Go, в этом нет необходимости. Начиная с Go v1.13 по умолчанию используются модули go. Следовательно, вам нужно явно указать, если вы не хотите этого делать.
Пример:
main.go:
package main
import (
"fmt"
"./pakk"
)
func main() {
fmt.Println("Hello" + pakk.World())
}
pakk / pakk.go:
package pakk
func World() string {
return " world"
}
В этом случае запускается
go run main.go
выведет
build command-line-arguments: cannot find module for path .../pakk
но работает
GO111MODULE=off go run main.go
выведет
Hello world
Потратил 4 дня на выяснение этого. Очень разочарован, но способ импортировать ./X
выглядит следующим образом:
сначала введите эту волшебную команду:
go mod init poop/strawberry/monkey
то вы можете ЛЕГКО импортировать папку ./X:
import (
"poop/strawberry/monkey/X"
)
Структура папки:
./X/X.go
./main.go
./go.mod
содержимое go.mod:
module poop/strawberry/monkey
это отличное решение от создателей модуля go
https://go.dev/ref/mod#go-mod-init
module path: A path that identifies a module and acts as a prefix for package import paths within the module. For example, "golang.org/x/net"
Ошибка ?Go не может определить путь к вашим модулям, возможно, это связано с неправильной настройкой или (ненастройкой) файла «go.mod», используемого для отслеживания зависимостей проекта.
Решение позволяет предположить, что папка вашего проекта выглядит следующим образом:
/ |-- папкаОдин/ |-- папкаДва/ |-- папкаТри/ |-- main.go
And the main.go script imports the modules folderOne,folderTwo and folderFour's script (folderfour.go) imports the module folderThree.
folderOne:
execute in the commandline:
go mod init github.com/../folderOne (i.e path from github.com folder to folderOnes)
The go mod init command creates a go.mod file to track your code's dependencies
folderTwo:
execute in the commandline:
go mod init github.com/../folderTwo (i.e path from github.com folder to folderTwos)
The go mod init command creates a go.mod file to track your code's dependencies
folderThree:
execute in the commandline:
go mod init github.com/../folderThree (i.e path from github.com folder to folderThrees)
The go mod init command creates a go.mod file to track your code's dependencies
folderFour:
execute in the commandline:
go mod init github.com/../folderThree (i.e path from github.com folder to folderFour)
Go to the folderFours script and import the module folderThree i.e
import "github.com/../folderThree"
in folderfours commandline:
$ go mod edit -replace github.com/{pathto}/folderThree=./folderThree**
then execute: go mod tidy
in your projects root folder execute the command: go mod init github.com/../ProjectRootDirectory (i.e path from github.com folder to ProjectRootDirectory)
then to import the modules, i.e folderThree, folderTwo, folderOne
execute the following at the projects root folder(ie folder with main.go)
$ go mod edit -replace github.com/{pathto}/folderOne=./folderOne
$ go mod edit -replace github.com/{pathto}/folderTwo=./folderTwo
$ go mod edit -replace github.com/{pathto}/folderFour=./folderFour
then execute;
$ go mod tidy
and then
$ go run main.go
перейти мод init api.com
// "api.com" назовите ваше приложение, это похоже на идентификатор пакета swift, вы также можете "whatever.youlike"