41 lines
1.8 KiB
Go
41 lines
1.8 KiB
Go
package getmodules
|
|
|
|
// PackageFetcher is a low-level utility for fetching remote module packages
|
|
// into local filesystem directories in preparation for use by higher-level
|
|
// module installer functionality implemented elsewhere.
|
|
//
|
|
// A PackageFetcher works only with entire module packages and never with
|
|
// the individual modules within a package.
|
|
//
|
|
// A particular PackageFetcher instance remembers the target directory of
|
|
// any successfully-installed package so that it can optimize future calls
|
|
// that have the same package address by copying the local directory tree,
|
|
// rather than fetching the package from its origin repeatedly. There is
|
|
// no way to reset this cache, so a particular PackageFetcher instance should
|
|
// live only for the duration of a single initialization process.
|
|
type PackageFetcher struct {
|
|
getter reusingGetter
|
|
}
|
|
|
|
func NewPackageFetcher() *PackageFetcher {
|
|
return &PackageFetcher{
|
|
getter: reusingGetter{},
|
|
}
|
|
}
|
|
|
|
// FetchPackage downloads or otherwise retrieves the filesystem inside the
|
|
// package at the given address into the given local installation directory.
|
|
//
|
|
// packageAddr must be formatted as if it were the result of an
|
|
// addrs.ModulePackage.String() call. It's only defined as a raw string here
|
|
// because the getmodules package can't import the addrs package due to
|
|
// that creating a package dependency cycle.
|
|
//
|
|
// PackageFetcher only works with entire packages. If the caller is processing
|
|
// a module source address which includes a subdirectory portion then the
|
|
// caller must resolve that itself, possibly with the help of the
|
|
// getmodules.SplitPackageSubdir and getmodules.ExpandSubdirGlobs functions.
|
|
func (f *PackageFetcher) FetchPackage(instDir string, packageAddr string) error {
|
|
return f.getter.getWithGoGetter(instDir, packageAddr)
|
|
}
|