查找go程序的导入和依赖项

时间:2015-03-16 21:27:24

标签: go

从命令行运行的go list -json命令将告诉您go程序的导入和依赖性(以json格式)。有没有办法在运行时从运行程序中获取此信息,或者通过运行' go list'以某种方式或其他方式命令?

3 个答案:

答案 0 :(得分:2)

以下代码使用go/build获取当前工作目录中应用程序的导入。

p, err := build.Default.Import(".", ".", 0)
if err != nil {
   // handle error
}
for _, i := range p.Imports {
   fmt.Println(i)
}

您可以使用简单的递归函数构建所有依赖项的列表。

要获取特定path的导入,请使用:

p, err := build.Default.Import(path, ".", 0)
if err != nil {
   // handle error
}
for _, i := range p.Imports {
   fmt.Println(i)
}

答案 1 :(得分:1)

我不认为你可以不使用go二进制文件,因为需要分析你的源代码。

这很容易,但它必须能够在运行时访问您的源代码。下面是一个简单的例子:

package main

import (
    "encoding/json"
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("go", "list", "-json")
    stdout, err := cmd.Output()
    if err != nil {
        println(err.Error())
        return
    }

    var list GoList
    err = json.Unmarshal(stdout, &list)

    for _, d := range list.Deps {
        fmt.Printf(" - %s\n", d)
    }
}

type GoList struct {
    Dir        string
    ImportPath string
    Name       string
    Target     string
    Stale      bool
    Root       string
    GoFiles    []string
    Imports    []string
    Deps       []string
}

答案 2 :(得分:0)

不,如果没有可靠的方式,我认为这是不可能的。使用不同编译器编译的不同平台上的二进制文件可能会也可能不会(或者可能不会在将来)编译这些信息。

但是正如编译Go程序一样:为什么不在访问源代码时记录这些信息呢?