Управлението на зависимостите е проблем за повечето разработчици. Когато 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.