loov / goda

Go Dependency Analysis toolkit
MIT License
1.37k stars 45 forks source link

Allow to use the package as library #70

Open dcu opened 1 year ago

dcu commented 1 year ago

there are some cases where using as library would be preferable than using as cli

is there a reason to not allow it? thanks

egonelbre commented 1 year ago

Mostly, I don't want to put the effort into a stable API. I could provide an unstable one.

Is there a concrete problem you are finding difficult to solve? I'm mostly interested in which parts of the system you are interested in being exposed.

Sometimes using golang.org/x/tools/go/packages directly might be more easier.

dcu commented 1 year ago

I would use pkgset.Calc to find all dependencies of a package

egonelbre commented 1 year ago

If you just want all the packages, then this would be sufficient:

package main

import (
    "golang.org/x/tools/go/packages"
)

func Dependencies(pkgs ...string) (map[string]*packages.Package, error) {
    roots, err := packages.Load(&packages.Config{
        Mode: packages.NeedName | packages.NeedImports,
        // Tests: true, // if you need tests
    }, pkgs...)
    if err != nil {
        return nil, fmt.Errorf("failed to load packages %v: %w", pkgs, err)
    }

    r := map[string]*packages.Package{}
    include(r, roots)
    return r, nil
}

func include(r map[string]*packages.Package, pkgs []*packages.Package) {
    for _, pkg := range pkgs {
        if _, added := r[pkg.ID]; added {
            continue
        }
        r[pkg.ID] = pkg
        include(r, pkg.Imports)
    }
}