1. Podstawy Go Modules i Zarządzania Pakietami
Go Modules to oficjalny system zarządzania pakietami i kontrolowania wersji zależności dla języka Go, wprowadzony od wersji Go 1.11 i stając się domyślnym mechanizmem zarządzania zależnościami od wersji Go 1.13. Go Modules traktuje każdy projekt jako moduł, który zawiera kod Go w projekcie i wszystkie pakiety, od których zależy.
Zasada działania
Go Modules zarządza zależnościami projektu za pomocą pliku go.mod
. Plik ten znajduje się w głównym katalogu projektu i zawiera listę wszystkich bezpośrednich zależności i ich wersji. Moduł może zawierać wiele pakietów, chociaż zwykle repozytorium stanowi moduł.
Podczas budowania lub wykonywania innych poleceń, jeśli plik go.mod
nie istnieje w bieżącym katalogu, narzędzia Go będą szukać pliku go.mod
w bieżącym katalogu i jego katalogach nadrzędnych, aby określić kontekst modułu dla bieżącej operacji. Jeśli zostanie znaleziony, zostanie użyta informacja o zależnościach w tym pliku do pobrania i budowania pakietów; w przeciwnym razie zostanie użyta metoda zarządzania zależnościami w trybie GOPATH.
Rola w języku Go
- Kontrola wersji: Go Modules umożliwia deweloperom określenie użycia określonych wersji bibliotek osób trzecich, zapewniając powtarzalność kodu.
- Zarządzanie pakietami: Wygodne zarządzanie zależnościami projektu i ich wersjami.
-
Izolacja modułów: Różne projekty mogą zależeć od różnych wersji tego samego pakietu bez konfliktu, ponieważ każdy projekt ma własny plik
go.mod
do zarządzania zależnościami.
Zarządzanie pakietami i modułami stanowi ważny aspekt każdego nowoczesnego języka programowania, ponieważ ułatwia zadania takie jak zarządzanie zależnościami, aktualizacje wersji pakietów i tworzenie powtarzalnych kompilacji dla użytkowników pakietów zależnych. W języku Go, w miarę rosnącej skali projektów i zależności, Go Modules zapewniają niezbędny mechanizm do skutecznego radzenia sobie z wyzwaniami zarządzania zależnościami.
2. Inicjowanie Własnego Modułu Go
Inicjowanie nowego modułu Go jest bardzo proste. Możesz wykonać następujące polecenie w głównym katalogu swojego projektu:
go mod init <nazwa-modułu>
Tutaj <nazwa-modułu>
to zwykle adres repozytorium kodu, na przykład github.com/nazwa-użytkownika/repo
.
Cel pliku go.mod
Po pomyślnym wykonaniu polecenia go mod init
w bieżącym katalogu zostanie utworzony plik go.mod
. Ten plik definiuje następujące rzeczy:
- Nazwę bieżącego modułu.
- Wersję języka Go.
- Konieczne informacje o wszystkich bezpośrednich zależnościach, włączając odpowiednią wersję dla każdego pakietu.
Plik go.mod
jest najważniejszym elementem w mechanizmie Go Modules i będzie automatycznie aktualizowany podczas dodawania lub usuwania zależności.
3. Tworzenie i Strukturyzacja Pakietów Go
3.1 Podstawy Tworzenia Pakietów
W języku Go pakiet to zbiór wielu plików źródłowych Go, zwykle umieszczonych w tym samym katalogu, i zawiera określony zestaw funkcjonalności. Każdy plik Go wskazuje, do którego pakietu należy, używając słowa kluczowego package
.
Aby utworzyć nowy pakiet, musisz:
- Utwórz folder, aby reprezentować katalog pakietu.
- Utwórz pliki
.go
w katalogu i określpackage <nazwa-pakietu>
w pierwszej linii pliku.
Nazwa pakietu zwykle jest związana z nazwą katalogu, ale nie jest obowiązkowe, aby były zgodne. Nazwa pakietu powinna być krótka, zrozumiała i najlepiej unikać użycia podkreśleń.
3.2 Struktura Pakietu
Strukturyzowanie pakietów Go w logiczny sposób jest kluczowe dla zapewnienia czytelności, możliwości utrzymania i ponownego wykorzystania kodu.
- Struktura Katalogów: Podziel katalogi na podstawie funkcjonalności, gdzie każdy katalog reprezentuje pakiet.
-
Konwencje Nazewnictwa: Katalogi takie jak
_test
zwykle zawierają pliki testowe, katalogcmd
jest powszechnie używany do aplikacji wiersza poleceń, a kataloginternal
zawiera kod prywatny, który nie jest przeznaczony do użytku zewnętrznego.
/katalog-główny
/pkg
/pakiet1
pakiet1.go
/pakiet2
pakiet2.go
/cmd
main.go // katalog cmd dla aplikacji wiersza poleceń
/internal
pomocnik.go
Takie strukturalne podejście jasno wskazuje skład kodu i ułatwia zarządzanie, testowanie i kompilację. Tak dobrze zorganizowane pakiety mogą być łatwo importowane i wykorzystywane przez inne projekty.
Przestrzeganie wyżej wymienionych konwencji strukturalnych i nazewnictwa pomoże innym deweloperom szybko zrozumieć strukturę kodu, prowadząc do bardziej efektywnego zarządzania pakietami i utrzymania.
4. Importowanie i Używanie Pakietów
4.1 Importowanie pakietów wewnętrznych
Załóżmy, że masz strukturę projektu jak poniżej:
├── src
│ ├── main.go
│ └── mypackage
│ └── mymodule.go
W tym przykładzie mypackage
jest pakietem wewnętrznym, który utworzyłeś i zawiera plik o nazwie mymodule.go
. Najpierw upewnij się, że plik mymodule.go
deklaruje poprawną nazwę pakietu:
// mymodule.go
package mypackage
// SomeFunction to publiczna funkcja w pakiecie mypackage
func SomeFunction() {
// Implementacja funkcji
}
Teraz, jeśli chcemy użyć funkcji SomeFunction
z pakietu mypackage
w pliku main.go
, musimy go zaimportować:
// main.go
package main
import (
"fmt"
"project/src/mypackage"
)
func main() {
mypackage.SomeFunction()
fmt.Println("Funkcja została wywołana")
}
Instrukcja import
powyżej importuje pakiet mypackage
do pliku main.go
, pozwalając nam na wywoływanie funkcji z tego pakietu za pomocą mypackage.SomeFunction
.
4.2 Użycie pakietów zewnętrznych
Gdy potrzebujemy zaimplementować bardziej skomplikowane funkcjonalności, często polegamy na pakietach zewnętrznych. Pakiety zewnętrzne są napisane i publicznie dostępne przez innych programistów, które możemy łatwo integrować w nasze własne projekty. Aby znaleźć pakiety zewnętrzne, możesz odwiedzić strony internetowe takie jak godoc.org lub szukać na GitHub.
Załóżmy, że chcesz użyć gorilla/mux
w swoim projekcie, który jest popularną biblioteką routera żądań HTTP. Możesz go zaimportować i użyć w następujący sposób:
Najpierw zainstaluj pakiet za pomocą polecenia go get
:
go get -u github.com/gorilla/mux
Następnie zaimportuj i użyj gorilla/mux
w swoim kodzie:
package main
import (
"net/http"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter() // Utwórz instancję routera
// Dodaj reguły trasy
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
w.Write([]byte("Witaj w gorilla/mux!"))
})
// Uruchom serwer HTTP
http.ListenAndServe(":8000", r)
}
W powyższym kodzie importujemy gorilla/mux
, tworzymy router HTTP, definiujemy funkcję obsługi dla ścieżki głównej, a następnie uruchamiamy serwer na porcie 8000 za pomocą http.ListenAndServe
.
5. Zarządzanie zależnościami modułów
W dużym projekcie zarządzanie zależnościami modułów staje się szczególnie ważne. Pomaga to zapewnić, że każda kompilacja lub replika projektu może dokładnie używać tych samych wersji zależności dla spójności.
5.1 Aktualizacja zależności za pomocą go get
Polecenie go get
może nie tylko dodać nowe zależności pakietów, ale także zaktualizować istniejące. Poniżej znajdują się kilka wspólnych opcji dla go get
:
- Zaktualizuj pojedynczy pakiet:
go get -u github.com/some/package
- Zaktualizuj wszystkie zależności tego pakietu:
go get -u github.com/some/package/...
- Zaktualizuj wszystkie zależności w projekcie:
go get -u ./...
- Pobierz, ale nie instaluj:
go get -d github.com/some/package
Podczas wykonywania operacji aktualizacji Go zaktualizuje zależności do najnowszej wersji mniejszej lub poprawkowej (zgodnie z semantyczną wersją), a zmiany zostaną również odzwierciedlone w pliku go.mod
.
5.2 Kontrola wersji i go.mod
Od wersji 1.11, Go udostępnił nowy system zarządzania zależnościami o nazwie Moduły Go
. W katalogu głównym projektu plik go.mod
rejestruje zależności pakietów.
Plik go.mod
zawiera następujące sekcje:
- Module deklaruje ścieżkę modułu dla bieżącego projektu.
- Require deklaruje zależności i ich konkretne wersje.
- Replace może określić ścieżki i wersje zastępcze modułów.
- Exclude służy do wykluczenia określonych wersji.
Przykładowy plik go.mod
może wyglądać tak:
module github.com/my/awesome-project
go 1.14
require (
github.com/gorilla/mux v1.7.4
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975
)
replace (
github.com/old/dependency => github.com/new/dependency v1.2.3
)
exclude (
github.com/old/dependency v1.1.4
)
Podczas wykonywania poleceń takich jak go build
lub go test
w projekcie, Go automatycznie generuje lub aktualizuje plik go.mod
, aby określić wszystkie wymagane zależności dla projektu. Najlepszą praktyką w kontrolowaniu wersji jest regularne zatwierdzanie plików go.mod
i go.sum
(który rejestruje oczekiwane hasze kryptograficzne zależności).
Poprzez zarządzanie za pomocą pliku go.mod
, zapewnia się, że każdy developer w zespole używa tych samych wersji zależności, unikając tym samym niezręcznej sytuacji "u mnie działa".