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  }