什么是npm过时的Go(mod)等效项?

时间:2019-04-26 11:25:18

标签: go go-modules

我想保持我的go.mod依赖关系为最新。使用Node.js,我运行npm outdated(随后运行npm update)。

Go mod最接近什么?

理想情况下,我会看到我的项目过时依赖项的报告(并非全部都是递归的)。谢谢

1 个答案:

答案 0 :(得分:5)

列出直接和间接依赖项

这在Go 1.11 Modules: How to Upgrade and Downgrade Dependencies Wiki中有详细说明:

  

要查看所有直接和间接依赖项的可用次要和补丁升级,请运行go list -u -m all

     

要针对当前模块的所有直接和间接依赖关系升级到最新版本,请执行以下操作:

     
      
  • 运行go get -u以使用最新的次要版本或修补程序版本
  •   
  • 运行go get -u=patch以使用最新的修补程序版本
  •   

您可以在此处阅读更多详细信息:Command go: List packages or modules

还有一个第三方应用程序: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

另请参阅相关问题:How to list installed go packages