Uwaga: to pytanie jest związane z tym , ale dwa lata to bardzo długi czas w historii Go.
Jaki jest standardowy sposób organizacji projektu Go podczas programowania?
Mój projekt to jeden pakiet mypack
, więc chyba wszystkie pliki .go umieściłem w mypack
katalogu.
Ale potem chciałbym to przetestować podczas programowania, więc potrzebuję przynajmniej pliku deklarującego main
pakiet, aby móc to zrobićgo run trypack.go
Jak mam to zorganizować? Czy muszę to robić za go install mypack
każdym razem, gdy chcę to wypróbować?
Odpowiedzi:
Polecam przejrzenie tej strony na temat pisania kodu Go
Dokumentuje zarówno sposób przyjaznej strukturyzacji projektu
go build
, jak i pisanie testów. Testy nie muszą być cmd przy użyciumain
pakietu. Mogą być po prostu nazwanymi funkcjami TestX jako część każdego pakietu, a następniego test
je odkryją.Struktura sugerowana w tym łączu w twoim pytaniu jest nieco nieaktualna, teraz wraz z wydaniem Go 1. Nie będziesz już musiał umieszczać
pkg
katalogu podsrc
. Jedyne 3 katalogi związane ze specyfikacją to 3 w katalogu głównym GOPATH: bin, pkg, src. Pod src możesz po prostu umieścić swój projektmypack
, a pod nim wszystkie twoje pliki .go, w tym mypack_test.gogo build
następnie wbuduje się w pkg i bin poziom root.Twój GOPATH może wyglądać następująco:
export GOPATH=$HOME/projects
Aktualizacja: od> = Go 1.11, system modułowy jest teraz standardową częścią oprzyrządowania, a koncepcja GOPATH jest już prawie przestarzała.
źródło
~
podczas ustawiania zmiennych środowiskowych , podobnie jak na przykład powłoka bourne busybox. Spróbuj sam:export BOB=~ && env | grep ^BOB
przyniesieBOB=/your/homedir
$HOME
pracuje wtedy w większej ilości pocisków~
, na przykład infish
jdi ma właściwe informacje dotyczące korzystania z
GOPATH
. Dodałbym, że jeśli zamierzasz mieć również plik binarny, możesz chcieć dodać jeden dodatkowy poziom do katalogów.uruchomiony
go build myproj/mypack
zbudujemypack
pakiet wraz z jego zależnościami działago build myproj/myapp
zbudujemyapp
binarny wraz z nim w zależności, która prawdopodobnie zawiera sięmypack
biblioteka.źródło
Przebadałem wiele projektów Go i istnieje spora różnorodność. Możesz powiedzieć, kto pochodzi z C, a kto z Javy, ponieważ pierwszy zrzut prawie wszystko w katalogu głównym projektów w
main
pakiecie, a drugi zwykle umieszcza wszystko wsrc
katalogu. Jednak żadne nie jest optymalne. Każda z nich ma konsekwencje, ponieważ wpływa na ścieżki importu i sposób, w jaki inni mogą z nich korzystać ponownie.Aby uzyskać najlepsze wyniki, opracowałem następujące podejście.
Gdzie
mypack.go
jestpackage mypack
imain/mypack.go
jest (oczywiście)package main
.Jeśli potrzebujesz dodatkowych plików pomocniczych, masz dwie możliwości. Albo zachowaj je wszystkie w katalogu głównym, albo umieść prywatne pliki pomocy w
lib
podkatalogu. Na przykładLub
Pliki umieść w
lib
katalogu tylko wtedy, gdy nie są przeznaczone do zaimportowania przez inny projekt. Innymi słowy, jeśli są to prywatne pliki wsparcia. Taki jest pomysł posiadanialib
- w celu oddzielenia interfejsów publicznych od prywatnych.Robienie tego w ten sposób da ci dobrą ścieżkę importu,
myproj.org/mypack
aby ponownie wykorzystać kod w innych projektach. Jeśli używaszlib
wtedy wewnętrzne pliki pomocnicze będzie miał ścieżkę importu, który wskazuje, żemyproj.org/lib/mysupport
.Budując projekt, użyj
main/mypack
npgo build main/mypack
. Jeśli masz więcej niż jeden plik wykonywalny, możesz również oddzielić je od siebiemain
bez konieczności tworzenia osobnych projektów. np .main/myfoo/myfoo.go
imain/mybar/mybar.go
.źródło
cmd/nameOfMyExecutable
podkatalogu dla pakietu głównego (potrzebne tylko,cmd/…
jeśli masz wiele poleceń; zobaczgolang.org/x/tools/cmd
; w przeciwnym razie często jest to zamieniane i ma tomain.go
na najwyższym poziomie). W ten sposóbgo install
utworzysz plik wykonywalny „main” (lub „main.exe”). Ponadto, idiomatic ma używaćinternal
podkatalogu dla sub-pakietu wewnętrznego dla pakietu / programu, który nie powinien być używany gdzie indziej (oczekuje się, że przyszłe wersje Go nie będą wymuszać, aby nikt inny importowałinternal
pakiety w ten sposób).Bardzo przydatne jest zrozumienie, jak zorganizować kod w Golang w tym rozdziale http://www.golang-book.com/11 książki napisanej przez Caleba Doxseya
źródło
Wydaje się, że nie ma standardowego sposobu organizowania projektów Go, ale https://golang.org/doc/code.html określa najlepszą praktykę dla większości projektów. Odpowiedź jdi jest dobra, ale jeśli używasz github lub bitbucket i masz także dodatkowe biblioteki, powinieneś utworzyć następującą strukturę:
Robiąc to w ten sposób, możesz mieć osobne repozytorium dla mylib, które może być używane do innych projektów i może być odzyskane przez „go get”. Twój projekt mypack może zaimportować bibliotekę za pomocą „github.com/username/mylib”. Po więcej informacji:
http://www.alexvictorchan.com/2014/11/06/go-project-structure/
źródło
Przechowuj pliki w tym samym katalogu i używaj
package main
we wszystkich plikach.Następnie uruchomić:
źródło
Zobaczmy, w jaki sposób
go get repository_remote_url
polecenie zarządza strukturą projektu$GOPATH
. Jeśli to zrobimygo get github.com/gohugoio/hugo
, sklonuje repozytorium podTo dobry sposób na utworzenie początkowej ścieżki projektu . Teraz zbadajmy, jakie są typy projektów i jak są zorganizowane ich wewnętrzne struktury. Wszystkie projekty golang w społeczności można podzielić na kategorie
Libraries
(brak wykonywalnych plików binarnych)Single Project
(zawiera tylko 1 plik wykonywalny)Tooling Projects
(zawiera wiele wykonywalnych plików binarnych)Zasadniczo pliki projektów golang można spakować zgodnie z dowolnymi zasadami projektowania, takimi jak DDD , POD
Większość dostępnych projektów go jest zgodna z tym pakietowym projektem
Projektowanie zorientowane na pakiet zachęca dewelopera do utrzymywania implementacji tylko w swoich własnych pakietach, innych niż
/internal
pakiet, którego te pakiety nie mogą się ze sobą komunikowaćBiblioteki
/internal
Pakiet służy głównie do ukrywania implementacji przed innymi projektami.Pojedynczy projekt
Projekty narzędzi
cmd/
pakiet zarządza liczbą plików binarnych (narzędzi), które chcemy zbudowaćźródło