Что такое Go (мод) эквивалент npm-устаревшего? - PullRequest
1 голос
/ 26 апреля 2019

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

Что ближе всего к моду Go?

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

1 Ответ

5 голосов
/ 26 апреля 2019

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

Это подробно описано в 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

...