Как создать локальный модуль 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)

Операторы импорта, которые я пробовал в основном проекте:

Я прочитал все документы Расса Кокса. Я искал в Интернете ответы безрезультатно.

Я потерял два дня на этом. Пожалуйста помоги!

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"

мойПример

Другие вопросы по тегам