Что делает команда `go mod tidy` и в каких случаях её нужно использовать?

Ответ

go mod tidy — это стандартная команда Go для управления зависимостями проекта. Она приводит файл go.mod в полное соответствие с исходным кодом проекта.

Основные действия go mod tidy:

  1. Добавляет недостающие зависимости: Сканирует все .go файлы, находит импорты пакетов, которых нет в go.mod, и добавляет их.
  2. Удаляет неиспользуемые зависимости: Если в go.mod есть зависимость, которая больше не импортируется ни в одном файле проекта, она будет удалена.
  3. Синхронизирует go.sum: Обновляет файл go.sum, добавляя контрольные суммы для новых зависимостей и удаляя их для неиспользуемых.

Пример:

Предположим, у нас есть:

Файл main.go

package main

import "fmt"
import "rsc.io/quote/v4" // Новая, еще не добавленная зависимость

func main() {
    fmt.Println(quote.Go())
}

Файл go.mod

module myproject

go 1.18

require github.com/google/uuid v1.3.0 // Старая, больше не используемая зависимость

После выполнения команды go mod tidy файл go.mod будет выглядеть так:

module myproject

go 1.18

require rsc.io/quote/v4 v4.0.1 // Добавлена новая

// Зависимость github.com/google/uuid будет удалена

Когда использовать:

  • Перед коммитом: Чтобы убедиться, что go.mod отражает актуальное состояние проекта.
  • После удаления или добавления кода: Особенно после рефакторинга, когда зависимости могли измениться.
  • Для поддержания чистоты проекта: Регулярное использование помогает избежать раздувания go.mod и go.sum.

Ответ 18+ 🔞

А, ну это же про нашу любимую команду go mod tidy, которая в проекте порядок наводит, как заботливая, но строгая уборщица с тряпкой и ведром!

Вот представь: пишешь ты код, подключаешь какие-то левые библиотеки через go get, потом половину выкидываешь, а в go.mod этот цифровой мусор так и остаётся висеть. Получается бардак, ёпта! Файл зависимостей раздувается, как жаба, и никто не знает, что там реально нужно, а что — исторический артефакт, вроде старого носка под кроватью.

Так вот, go mod tidy — это как раз та волшебная палочка, которая говорит: «Сейчас, сука, я тут всё по полочкам разложу!». Она делает три главные вещи, и делает их жёстко:

  1. Добавляет то, чего не хватает. Она проходит по всем твоим .go файлам, как ревизор с проверкой, смотрит, какие импорты ты используешь, но которых нет в go.mod. Нашла дыру? Хуяк — и тут же добавляет нужную зависимость. Всё честно.
  2. Выпиливает то, что не нужно. А это самое сладкое! Если в go.mod затесалась какая-то библиотека, которую ты уже сто лет не используешь, tidy её безжалостно выкинет на мороз. Чистит проект от цифрового жира, блядь. Красота!
  3. Приводит в порядок go.sum. Этот файл с контрольными суммами она тоже синхронизирует: для новых зависимостей — записи добавит, для удалённых — почистит. Чтобы всё было прозрачно и без сюрпризов.

Вот смотри, как это работает на живом примере:

Допустим, у тебя есть файлик main.go, где ты уже начал использовать какую-то новую библиотеку для цитат:

package main

import "fmt"
import "rsc.io/quote/v4" // Опа, новая фича! Но в go.mod её ещё нет!

func main() {
    fmt.Println(quote.Go())
}

А твой go.mod всё ещё живёт в прошлом и таскает за собой какую-то старую зависимость от UUID, которую ты уже выкинул:

module myproject

go 1.18

require github.com/google/uuid v1.3.0 // Эту штуку мы уже не используем, она тут как манда с ушами торчит

Ты запускаешь go mod tidy и наблюдаешь магию. Команда смотрит на код, видит, что rsc.io/quote/v4 нужен, а github.com/google/uuid — нет. И делает новый, чистый go.mod:

module myproject

go 1.18

require rsc.io/quote/v4 v4.0.1 // Новенькое добавила

// А старый uuid — просто вычеркнула, в рот его чих-пых!

Так когда же эту команду вызывать? Да почти всегда!

  • Перед тем как закоммитить — святое дело. Чтобы не позориться и не тащить в репу хлам.
  • После любого редактирования кода, особенно когда что-то удаляешь или добавляешь новые импорты. Рефакторил? Запусти tidy.
  • Просто для поддержания гигиены проекта. Периодически запускай, как генеральную уборку. Чистота — залог здоровья кодовой базы, а то потом разберёшься, кто тут у тебя неиспользуемый пидарас шерстяной завёлся.

Короче, go mod tidy — это must have, базовый инструмент, чтобы не превратить проект в помойку. Используй на здоровье!