Użyłem, GOPATH
ale w tym bieżącym problemie, przed którym stoję, nie pomaga. Chcę mieć możliwość tworzenia pakietów specyficznych dla projektu:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
Próbowałem na wiele sposobów, ale jak mam zacząć package1.go
pracować w tym binary1.go
lub innym binary2.go
i tak dalej?
Na przykład; Chcę mieć możliwość, import "package1"
a następnie móc działać go build binary1.go
i wszystko działa dobrze bez wyrzucania błędu, że nie można znaleźć pakietu na GOROOT
lub GOPATH
. Powodem, dla którego potrzebuję tego rodzaju funkcjonalności, są projekty na dużą skalę; Nie chcę odwoływać się do wielu innych pakietów ani przechowywać ich w jednym dużym pliku.
.go
pliki w jednym katalogu są częścią tego samego pakietu i nie potrzebujeszimport
plików w tym samym pakiecie (tj. W tym samym katalogu). Wspomniał Pan o pracy poza GOPATH, co jest jedną z możliwości nowego systemu modułów Go. Ta odpowiedź dotyczy struktury modułu, importowania pakietów lokalnych, organizowania pakietów w module, czy mieć wiele modułów w jednym repozytorium itp.git/repo/to/my/project
ścieżkę? Po prostu nie widzę powodu, dla którego ktokolwiek miałby chcieć takiego zachowania. Co jeśli przeniesiesz swój projekt w inne miejsce (np. Obraz Dockera), będziesz musiał ponownie zmienić wszystkie ścieżki? Szukam odpowiedzi, dlaczego to takie skomplikowane.Odpowiedzi:
Podsumowanie zarządzania zależnościami Idź:
vgo
jeśli twoja wersja go to:x >= go 1.11
dep
lubvendor
jeśli Twoja wersja go to:go 1.6 >= x < go 1.11
x < go 1.6
Edycja 3: Go 1.11 ma funkcję,
vgo
która zastąpidep
.Aby skorzystać
vgo
, zobacz dokumentację modułów . TLDR poniżej:Ta metoda tworzy plik o nazwie
go.mod
w katalogu projektów. Następnie możesz zbudować swój projekt za pomocągo build
. JeśliGO111MODULE=auto
jest ustawiona, Twój projekt nie może być w formacie$GOPATH
.Edycja 2: Metoda sprzedaży jest nadal ważna i działa bez problemu.
vendor
jest w dużej mierze procesem ręcznym, z tego powodudep
ivgo
zostały stworzone.Edycja 1: Chociaż mój stary sposób działa, nie jest to już „poprawny” sposób. Powinieneś używać możliwości dostawcy
vgo
lubdep
(na razie), które są domyślnie włączone w Go 1.6; zobacz . Zasadniczo dodajesz swoje „zewnętrzne” lub „zależne” pakiety wvendor
katalogu; po kompilacji kompilator najpierw użyje tych pakietów.Znaleziony. Udało mi się zaimportować pakiet lokalny za
GOPATH
pomocą, tworząc podfolder,package1
a następnie importując za pomocąimport "./package1"
inbinary1.go
ibinary2.go
skrypty takie jak ten:binary1.go
Więc moja obecna struktura katalogów wygląda następująco:
Powinienem również zauważyć, że ścieżki względne (przynajmniej w go 1.5) również działają; na przykład:
źródło
import "../package1"
Nie ma czegoś takiego jak „pakiet lokalny”. Organizacja pakietów na dysku jest ortogonalna do wszelkich relacji nadrzędny / podrzędny pakietów. Jedyną prawdziwą hierarchią utworzoną przez pakiety jest drzewo zależności, które w ogólnym przypadku nie odzwierciedla drzewa katalogów.
Po prostu użyj
i nie walcz z systemem kompilacji bez powodu. Zapisywanie kilkunastu znaków na import w dowolnym nietrywialnym programie nie jest dobrym powodem, ponieważ na przykład projekty ze względnymi ścieżkami importu nie są dostępne do pobrania.
Pojęcie ścieżek importu ma kilka ważnych właściwości:
Wszystkie powyższe są zrujnowane przez użycie względnych ścieżek importu. Nie rób tego.
PS: Jest kilka miejsc w starszym kodzie testów kompilatora Go, które używają importu względnego. ATM, to jedyny powód, dla którego import względny jest w ogóle obsługiwany.
źródło
import "myproject/packageN"
.myproject
to nazwa folderu zawierającego mój projekt?Być może próbujesz zmodularyzować swój pakiet. Zakładam, że
package1
ipackage2
są w pewnym sensie częścią tego samego pakietu, ale dla czytelności dzielisz je na wiele plików.Jeśli poprzedni przypadek był twój, możesz użyć tej samej nazwy pakietu w tych wielokrotnych plikach i będzie tak, jakby istniał ten sam plik.
To jest przykład:
add.go
subtract.go
donothing.go
Nie jestem ekspertem w Go i to jest mój pierwszy post w StackOveflow, więc jeśli masz jakieś rady, zostanie on dobrze przyjęty.
źródło
Mam podobny problem i rozwiązanie, z którego obecnie korzystam, wykorzystuje moduły Go 1.11. Mam następującą strukturę
Jestem w stanie zaimportować pakiet1 i pakiet2 z projektu1 i projekt2 przy użyciu
Po biegu
go mod init projects
. Mogę korzystaćgo build
z katalogów project1 i project2 lub mogę to zrobićgo build -o project1/exe project1/*.go
z katalogu projektów.Wadą tej metody jest to, że wszystkie projekty kończą na współdzieleniu tej samej listy zależności w go.mod. Wciąż szukam rozwiązania tego problemu, ale wygląda na to, że może to być fundamentalne.
źródło
Myślę , że od czasu wprowadzenia go.mod zarządzanie pakietami zarówno lokalnymi, jak i zewnętrznymi stało się łatwiejsze. Używając go.mod , można mieć projekt go również poza GOPATH.
Importuj pakiet lokalny:
Utwórz folder demoproject i uruchom następujące polecenie, aby wygenerować plik go.mod
go mod init demoproject
Mam strukturę projektu jak poniżej w katalogu demoproject .
W celach demonstracyjnych wstaw następujący kod w pliku model.go .
W main.go zaimportowałem model pracownika, odnosząc się do „demoproject / src / model”
Importuj zależność zewnętrzną:
Po prostu uruchom
go get
polecenie w katalogu projektu.Na przykład:
Powinien zawierać zależność modułów w pliku go.mod
https://blog.golang.org/using-go-modules
źródło
can't load package: package .: no Go files in...
(przejdź do tworzenia w folderze go.mod)Aby dodać pakiet „lokalny” do projektu, dodaj folder (na przykład „nazwa_pakietu”). I umieść pliki implementacji w tym folderze.
W swoim
package main
zrób to:Gdzie
package_name
jest nazwa folderu i musi być zgodna z nazwą pakietu używaną w plikach cokolwiek_nazwa1.go i cokolwiek_nazwa2.go. Innymi słowy, wszystkie pliki z podkatalogami powinny należeć do tego samego pakietu.Możesz dalej zagnieżdżać więcej podkatalogów, o ile w imporcie określisz pełną ścieżkę do folderu nadrzędnego.
źródło
package myproject/package_name is not in GOROOT (/usr/lib/go-1.14/src/myproject/package_name)
Możesz użyć
replace
foo / go.mod
foo / main.go
bar / go.mod
bar / fn.go
Importowanie pakietu lokalnego przypomina importowanie pakietu zewnętrznego
poza tym, że wewnątrz pliku go.mod zastępujesz zewnętrzną nazwę pakietu folderem lokalnym.
Ścieżka do folderu może być pełna lub względna „/ ścieżka / do / bar” lub „../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 -to-your-local-module /
źródło