Управлението на зависимостите е проблем за повечето разработчици. Когато Go беше пуснат за първи път, нямаше вградена система за управление на пакети, която да улесни процеса. В резултат на това общността създаде пакети на трети страни, за да компенсира липсата на едно глобално решение. Колкото и голям принос да бяха те, той създаде различни проблеми.
Конкретен проблем беше, че един проект можеше да използва множество системи за управление на зависимости от различни екипи в стека, което в крайна сметка доведе до хаос в хранилището. С пускането на версии 1.11 и 1.12 Go предостави вградено решение за обработка на зависимости с добавяне на модули. Go модулът е колекция от пакети, съхранявани в хранилище с go.mod
файл в неговия корен и дефинира модулния път на всеки пакет, както и всяка друга зависимост, необходима за изграждане.
Разработката в Go версия 1.11 предлага команда go
, за да улесни използването на модули, когато хранилището не включва go.mod
файл и/или е създадено извън $GOPATH/src
директория. Версия 1.13 е пусната с модулен режим по подразбиране като алтернатива на GOPATH
за версии и разпространение на пакети.
Инициализиране на модул
Създайте директория на място по ваш избор от всяко място на вашата локална машина. Този пример илюстрира създаването на модул в хранилище, изпратено до github. cd
във вашето репо и изпълнете следната команда:
$ go mod init github.com/chriskakos/my-repo
Тази команда генерира go.mod файл. Отворете файла:
$ vi go.mod
Импортиране на зависимост
Можете да изпълните $ go get <package_name>
от вашия команден ред, за да импортирате зависимост, но аз избрах да бъда по-ясен в моя пример и го добавих към моя main.go
файл.
Когато добавяте — или премахвате — пакети, най-добрата практика е да изпълните командата $ go mod tidy
, преди да стартирате програмата. Това ще кешира пакета, който се импортира — и всичките му зависимости — във вашия GOPATH
. Ако пакетът вече е кеширан, той пропуска този процес. Ако пакетът е бил изтрит и/или вече не се използва, той ще бъде премахнат.
$ go mod tidy
След като стартирате $ go mod tidy
,отворете отново своя go.mod
файл:
$ vi go.mod
Сега избройте всички файлове от хранилището:
$ ls -la
В допълнение към go.mod
, командата go
поддържа файл с име go.sum
, съдържащ криптографски хешове, които представляват съдържанието на конкретна версия на пакета.
Файлът go.sum
, за да се гарантира, че бъдещите изтегляния на тези модули извличат същите битове като първото изтегляне и че модулите — от които зависи вашият проект — не се променят неочаквано, независимо дали са злонамерени или случайно. Както go.mod
, така и go.sum
трябва да бъдат проверени в контрола на версиите.
$ cat go.sum
За повече информация относно пакет и неговите зависимости можете да изпълните командата `$ go mod why -m ‹package›`:
$ go mod why -m github.com/gorilla/websocket
Изброяване на зависимости
Добавянето на единичен пакет често води до други непреки зависимости. За да изброите всички пакети и техните зависимости, изпълнете командата go list -m all
.
$ go list -m all
Основният модул винаги е първият ред, последван от зависимости, сортирани по пътя на модула.
Можете да изброите всички версии на пакет, като изпълните go list -m -versions <package_name>
.
$ go list -m -versions github.com/bwmarrin/discordgo
Зависимости от доставчици
Продажбата е процес, който изтегля локално копие на всички зависимости във вашето хранилище. Това е най-полезно, когато имате абсорбиращо количество зависимости, които трябва да бъдат импортирани, без да се налага непрекъснато да изтегляте зависимости при всяка компилация. Можете да доставите пакет, като изпълните командата go mod vender
.
$ go mod vendor
Премахване на зависимости
Ще илюстрирам изрично процеса на премахване на зависимост от вашето хранилище. Отворете main.go
и премахнете този пакет от import
.
След това изпълнете командата go mod tidy
:
$ go mod tidy
(ако продавате вашите хранилища, изпълнете отново командата go mod vendor
)
$ go mod vendor
$ ls -la
Заключение
Go modules е стъпка в правилната посока по отношение на гъвкавостта по отношение на версиите и разпространението на пакети. Това беше въведение в работата с модули, тъй като има повече вградени функции, които помагат за улесняване на различни процеси. За по-дълбоко гмуркане предлагам Using Go ModulesотTyler Bui-Palsulich и Eno Compton.