Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to use the package as library #70

Open
dcu opened this issue Jun 29, 2023 · 3 comments
Open

Allow to use the package as library #70

dcu opened this issue Jun 29, 2023 · 3 comments

Comments

@dcu
Copy link

dcu commented Jun 29, 2023

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
Copy link
Member

egonelbre commented Jul 3, 2023

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
Copy link
Author

dcu commented Jul 3, 2023

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

@egonelbre
Copy link
Member

egonelbre commented Jul 3, 2023

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)
	}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants