Перечисление прямых и косвенных зависимостей
Это подробно описано в Go 1.11 Модули: как обновить и понизить зависимости wiki:
Чтобы просмотреть доступные незначительные обновления и обновления для всех прямых и косвенных зависимостей, выполните go list -u -m all
.
Для обновления до последней версии для всех прямых и косвенных зависимостей текущего модуля:
- запустите
go get -u
, чтобы использовать последние минорные или патч-релизы
- запустить
go get -u=patch
, чтобы использовать последние выпуски патчей
Подробнее вы можете прочитать здесь: Команда go: Список пакетов или модулей .
Также есть стороннее приложение: https://github.com/psampaz/go-mod-outdated:
Простой способ найти устаревшие зависимости ваших проектов Go. go-mod-outdated предоставляет табличное представление команды go list -u -m -json all, которая перечисляет все зависимости проекта Go и их доступные незначительные обновления и обновления патчей. Он также предоставляет способ фильтрации косвенных зависимостей и зависимостей без обновлений.
Список только прямых зависимостей
Если вас не интересуют косвенные зависимости, мы можем отфильтровать их. Нет флага для фильтрации косвенных зависимостей, но мы можем сделать это с помощью пользовательского формата вывода.
Флаг -f
указывает альтернативный формат для списка с использованием синтаксиса шаблона пакета.
Таким образом, вы можете указать формат, являющийся шаблонным документом, соответствующий text/template
.
При перечислении модулей флаг -f
по-прежнему указывает шаблон формата, применяемый к структуре Go, но теперь структура Module
:
type Module struct {
Path string // module path
Version string // module version
Versions []string // available module versions (with -versions)
Replace *Module // replaced by this module
Time *time.Time // time version was created
Update *Module // available update, if any (with -u)
Main bool // is this the main module?
Indirect bool // is this module only an indirect dependency of main module?
Dir string // directory holding files for this module, if any
GoMod string // path to go.mod file for this module, if any
Error *ModuleError // error loading module
}
type ModuleError struct {
Err string // the error itself
}
Примечание: эта Module
структура определена во внутреннем пакете команды go: https://godoc.org/cmd/go/internal/modinfo
Так, например, для перечисления прямых и косвенных зависимостей, как и раньше, но теперь также добавьте слово IAMINDIRECT
после косвенных зависимостей, это можно сделать с помощью:
go list -u -m -f '{{.}}{{if .Indirect}} IAMINDIRECT{{end}}' all
Отрицая логику, перечислять прямые и косвенные зависимости, но на этот раз «пометить» только прямые зависимости с помощью IAMDIRECT
:
go list -u -m -f '{{.}}{{if not .Indirect}} IAMDIRECT{{end}}' all
И мы почти у цели. Теперь нам нужно отфильтровать строки, которые не содержат слово IAMDIRECT
:
go list -u -m -f '{{.}}{{if not .Indirect}} IAMDIRECT{{end}}' all | grep IAMDIRECT
Альтернативный
Приведенное выше решение основано на команде grep
. Но на самом деле нам это не нужно. Если указанный шаблон приводит к пустому документу, строка пропускается из выходных данных.
Таким образом, мы можем достичь того же, что и это:
go list -u -m -f '{{if not .Indirect}}{{.}}{{end}}' all
В основном мы называем Module.String()
(мы включаем только зависимость), если она не является косвенной. В качестве дополнительной выгоды, это решение также работает на Windows.
Список только зависимостей, которые имеют обновления
Аналогично тому, как мы отфильтровывали косвенные зависимости, это тоже «кусок пирога», поскольку структура Module
содержит поле Update
для пакетов / модулей, которые имеют обновления:
go list -u -m -f '{{if .Update}}{{.}}{{end}}' all
Также см. Связанный вопрос: Как просмотреть список установленных пакетов go