Что такое Go (мод), эквивалент npm-outdated?

Я хочу поддерживать свои go.mod зависимости в актуальном состоянии. С Node.js я запускаю npm outdated (а позже npm update).

Какой мод для Go ближе всего?

В идеале я бы увидел отчет об устаревших зависимостях моего проекта (не все рекурсивно). Спасибо


person Luís Soares    schedule 26.04.2019    source источник


Ответы (1)


Список прямых и косвенных зависимостей

Это подробно описано в Модули Go 1.11: как обновить и зависимости от более ранней версии вики:

Чтобы просмотреть доступные второстепенные обновления и исправления для всех прямых и косвенных зависимостей, запустите 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

person icza    schedule 26.04.2019
comment
проблема в том, что он рекурсивно перечисляет все зависимости. Мне нужно знать только первые уровни; те, которые я упомянул в go.mod - person Luís Soares; 26.04.2019
comment
Разве зависимость от вашего модуля не является зависимостью от вашего модуля? Это косвенно, но все же. - person icza; 26.04.2019
comment
@ LuísSoares См. Отредактированный ответ для фильтрации косвенных зависимостей. - person icza; 26.04.2019
comment
большой! что, если я хочу отфильтровать только устаревшие? как в npm outdated - person Luís Soares; 26.04.2019
comment
@ LuísSoares Это тоже легко. См. Обновленный ответ. - person icza; 26.04.2019
comment
Возможно, вам понадобится go list -u -m -f '{{if and .Update (not .Indirect)}}{{.}}{{end}}' all, в нем перечислены все обновляемые прямые зависимости. - person Christian Hujer; 27.06.2020