Я использовал, GOPATH
но для этой текущей проблемы, с которой я сталкиваюсь, это не помогает. Я хочу иметь возможность создавать пакеты, специфичные для проекта:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
Я пробовал несколько способов, но как мне начать package1.go
работать в binary1.go
или binary2.go
и так далее?
Например; Я хочу иметь возможность, import "package1"
а затем быть в состоянии запустить, go build binary1.go
и все работает нормально, без выдачи ошибки, что пакет не может быть найден GOROOT
или GOPATH
. Причина, по которой мне нужен этот вид функциональности, заключается в крупных проектах; Я не хочу ссылаться на несколько других пакетов или хранить их в одном большом файле.
.go
файлы в одном каталоге являются частью одного и того же пакета, и вам не нужныimport
файлы в одном и том же пакете (то есть в одном и том же каталоге). Вы упомянули работу вне GOPATH, которая является одной из возможностей новой системы модулей Go. Этот ответ охватывает структуру модуля, импорт локальных пакетов, организацию пакетов внутри модуля, наличие или отсутствие нескольких модулей в одном репозитории и т. Д.git/repo/to/my/project
путь? Я просто не вижу причины, по которой кто-то хотел бы такого поведения. Что если вы переместите свой проект в другое место (например, изображение Docker), вам нужно снова изменить все пути? Я ищу ответы, почему это так сложно.Ответы:
Перейти резюме управления зависимостями:
vgo
если ваша версия go:x >= go 1.11
dep
илиvendor
если ваша версия go:go 1.6 >= x < go 1.11
x < go 1.6
Редактировать 3: Go 1.11 имеет функцию,
vgo
которая заменитdep
.Чтобы использовать
vgo
, см. Документацию модулей . TLDR ниже:Этот метод создает файл с именем
go.mod
в каталоге ваших проектов. Затем вы можете построить свой проект сgo build
. ЕслиGO111MODULE=auto
установлен, то ваш проект не может быть в$GOPATH
.Изменить 2: метод вендора все еще действителен и работает без проблем.
vendor
это во многом ручной процесс, из-за этогоdep
иvgo
были созданы.Редактировать 1: Хотя мой старый способ работает, это уже не «правильный» способ сделать это. Вы должны использовать возможности вендора
vgo
илиdep
(пока), которые по умолчанию включены в Go 1.6; см . Вы в основном добавляете свои «внешние» или «зависимые» пакеты вvendor
каталог; после компиляции компилятор сначала будет использовать эти пакеты.Нашел. Я смог импортировать локальный пакет с
GOPATH
помощью создания подпапки,package1
а затем импортировать с помощью сценариевimport "./package1"
inbinary1.go
иbinary2.go
следующим образом:binary1.go
Итак, моя текущая структура каталогов выглядит так:
Я также должен отметить, что относительные пути (по крайней мере, в версии 1.5) также работают; например:
источник
import "../package1"
Там нет такого понятия, как "местный пакет". Организация пакетов на диске ортогональна любым родительским / дочерним отношениям пакетов. Единственная реальная иерархия, образованная пакетами, - это дерево зависимостей, которое в общем случае не отражает дерево каталогов.
Просто используйте
и не боритесь с системой сборки без веской причины. Сохранение дюжины символов на импорт в любой нетривиальной программе не является хорошей причиной, потому что, например, проекты с относительными путями импорта не являются go-gettable.
Концепция путей импорта имеет несколько важных свойств:
Все вышеперечисленное разрушается при использовании относительных путей импорта. Не делать это.
PS: в унаследованном коде мало мест в тестах компилятора Go, в которых используется относительный импорт. ATM, это единственная причина, по которой относительный импорт поддерживается вообще.
источник
import "myproject/packageN"
,myproject
это имя папки, в которой хранится мой проект?Возможно, вы пытаетесь модулировать свой пакет. Я предполагаю , что
package1
иpackage2
есть, таким образом, часть того же пакета , но для удобства чтения вы будете колки те на несколько файлов.Если предыдущий случай был вашим, вы могли бы использовать одно и то же имя пакета в этих файлах, и это будет похоже на наличие одного и того же файла.
Это пример:
add.go
subtract.go
donothing.go
Я не эксперт по Go, и это мой первый пост в StackOveflow, так что если у вас есть какие-то советы, они будут приняты.
источник
У меня похожая проблема, и для решения, которое я сейчас использую, используются модули Go 1.11. У меня следующая структура
И я могу импортировать package1 и package2 из проекта1 и проекта2 с помощью
После запуска
go mod init projects
. Я могу использоватьgo build
из каталогов project1 и project2 илиgo build -o project1/exe project1/*.go
из каталога проектов.Недостатком этого метода является то, что все ваши проекты имеют общий список зависимостей в go.mod. Я все еще ищу решение этой проблемы, но похоже, что оно может быть фундаментальным.
источник
С момента появления go.mod я думаю, что как локальное, так и внешнее управление пакетами становится проще. Используя go.mod , можно также запустить проект за пределами GOPATH.
Импортировать локальный пакет:
Создайте демопроект папки и выполните следующую команду для создания файла go.mod
go mod init demoproject
У меня есть структура проекта, как показано ниже в каталоге demoproject .
Для демонстрационной цели, вставьте следующий код в model.go файл.
В main.go я импортировал модель Employee, ссылаясь на «demoproject / src / model»
Импортировать внешнюю зависимость:
Просто запустите
go get
команду внутри директории проекта.Например:
Он должен включать зависимость модуля в файле go.mod
https://blog.golang.org/using-go-modules
источник
can't load package: package .: no Go files in...
(go build в папке go.mod)Чтобы добавить «локальный» пакет в ваш проект, добавьте папку (например, «имя_пакета»). И поместите ваши файлы реализации в эту папку.
По вашему
package main
сделайте это:Где
package_name
находится имя папки, и оно должно совпадать с именем пакета, используемым в файлах what_name1.go и what_name2.go. Другими словами, все файлы с подкаталогом должны быть одного пакета.Кроме того, вы можете вкладывать больше подкаталогов, если в импорте вы указали полный путь к родительской папке.
источник
package myproject/package_name is not in GOROOT (/usr/lib/go-1.14/src/myproject/package_name)
Ты можешь использовать
replace
Foo / go.mod
Foo / main.go
бар / go.mod
бар / fn.go
Импорт локального пакета аналогичен импорту внешнего пакета
за исключением того, что внутри файла go.mod вы заменяете это имя внешнего пакета локальной папкой.
Путь к папке может быть полным или относительным "/ path / to / bar" или "../bar"
https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive https://thewebivore.com/using-replace-in-go-mod-to-point -в-ваш-местный-модуль /
источник