github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/pkg/client/package_extension.go (about) 1 package client 2 3 import ( 4 "context" 5 6 "github.com/pkg/errors" 7 8 "github.com/buildpacks/pack/internal/layer" 9 "github.com/buildpacks/pack/internal/style" 10 "github.com/buildpacks/pack/pkg/buildpack" 11 ) 12 13 // PackageExtension packages extension(s) into either an image or file. 14 func (c *Client) PackageExtension(ctx context.Context, opts PackageBuildpackOptions) error { 15 if opts.Format == "" { 16 opts.Format = FormatImage 17 } 18 19 if opts.Config.Platform.OS == "windows" && !c.experimental { 20 return NewExperimentError("Windows extensionpackage support is currently experimental.") 21 } 22 23 err := c.validateOSPlatform(ctx, opts.Config.Platform.OS, opts.Publish, opts.Format) 24 if err != nil { 25 return err 26 } 27 28 writerFactory, err := layer.NewWriterFactory(opts.Config.Platform.OS) 29 if err != nil { 30 return errors.Wrap(err, "creating layer writer factory") 31 } 32 33 packageBuilder := buildpack.NewBuilder(c.imageFactory) 34 35 exURI := opts.Config.Extension.URI 36 if exURI == "" { 37 return errors.New("extension URI must be provided") 38 } 39 40 mainBlob, err := c.downloadBuildpackFromURI(ctx, exURI, opts.RelativeBaseDir) 41 if err != nil { 42 return err 43 } 44 45 ex, err := buildpack.FromExtensionRootBlob(mainBlob, writerFactory, c.logger) 46 if err != nil { 47 return errors.Wrapf(err, "creating extension from %s", style.Symbol(exURI)) 48 } 49 50 packageBuilder.SetExtension(ex) 51 52 switch opts.Format { 53 case FormatFile: 54 return packageBuilder.SaveAsFile(opts.Name, opts.Config.Platform.OS, map[string]string{}) 55 case FormatImage: 56 _, err = packageBuilder.SaveAsImage(opts.Name, opts.Publish, opts.Config.Platform.OS, map[string]string{}) 57 return errors.Wrapf(err, "saving image") 58 default: 59 return errors.Errorf("unknown format: %s", style.Symbol(opts.Format)) 60 } 61 }