从命令行运行的go list -json
命令将告诉您go程序的导入和依赖性(以json格式)。有没有办法在运行时从运行程序中获取此信息,或者通过运行' go list'以某种方式或其他方式命令?
答案 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程序一样:为什么不在访问源代码时记录这些信息呢?