packaging

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 4, 2025 License: MIT Imports: 25 Imported by: 0

Documentation

Overview

Package packaging provides NuGet package extraction functionality.

Package packaging provides read and write access to NuGet packages (.nupkg files).

Index

Constants

View Source
const (
	// DefaultLockTimeout is the maximum time to wait for file lock acquisition
	DefaultLockTimeout = 2 * time.Minute

	// LockRetryDelay is the retry delay for lock acquisition
	LockRetryDelay = 100 * time.Millisecond

	// LockFileExtension is the lock file extension
	LockFileExtension = ".lock"
)
View Source
const (
	LibFolder             = "lib/"
	RefFolder             = "ref/"
	RuntimesFolder        = "runtimes/"
	ContentFolder         = "content/"
	ContentFilesFolder    = "contentFiles/"
	BuildFolder           = "build/"
	BuildTransitiveFolder = "buildTransitive/"
	ToolsFolder           = "tools/"
	NativeFolder          = "native/"
	AnalyzersFolder       = "analyzers/"
	EmbedFolder           = "embed/"
)

Common package folder constants

View Source
const (
	ManifestExtension       = ".nuspec"
	SignatureFile           = ".signature.p7s"
	PackageRelationshipFile = "_rels/.rels"
	ContentTypesFile        = "[Content_Types].xml"
	PSMDCPFile              = "package/services/metadata/core-properties/"
)

Package metadata files

View Source
const (
	// NuspecNamespaceV1 - Baseline schema (2010/07)
	NuspecNamespaceV1 = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"

	// NuspecNamespaceV2 - Added copyrights, references and release notes (2011/08)
	NuspecNamespaceV2 = "http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"

	// NuspecNamespaceV3 - Used if the version is a semantic version (2011/10)
	NuspecNamespaceV3 = "http://schemas.microsoft.com/packaging/2011/10/nuspec.xsd"

	// NuspecNamespaceV4 - Added 'targetFramework' attribute for 'dependency' elements (2012/06)
	// Allow framework folders under 'content' and 'tools' folders
	NuspecNamespaceV4 = "http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"

	// NuspecNamespaceV5 - Added 'targetFramework' attribute for 'references' elements (2013/01)
	// Added 'minClientVersion' attribute
	NuspecNamespaceV5 = "http://schemas.microsoft.com/packaging/2013/01/nuspec.xsd"

	// NuspecNamespaceV6 - Allows XDT transformation (2013/05) - most recent
	NuspecNamespaceV6 = "http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"
)

Nuspec schema namespaces Reference: ManifestSchemaUtility.cs in NuGet.Client

View Source
const (
	OPCContentTypesPath   = "[Content_Types].xml"
	OPCRelationshipsPath  = "_rels/.rels"
	OPCCorePropertiesPath = "package/services/metadata/core-properties/"
	OPCManifestRelType    = "http://schemas.microsoft.com/packaging/2010/07/manifest"
)

OPC file paths

View Source
const (
	OPCContentTypesNamespace   = "http://schemas.openxmlformats.org/package/2006/content-types"
	OPCRelationshipsNamespace  = "http://schemas.openxmlformats.org/package/2006/relationships"
	OPCCorePropertiesNamespace = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"
	DCNamespace                = "http://purl.org/dc/elements/1.1/"
	DCTermsNamespace           = "http://purl.org/dc/terms/"
	XSINamespace               = "http://www.w3.org/2001/XMLSchema-instance"
)

OPC namespaces

View Source
const (
	RelationshipContentType   = "application/vnd.openxmlformats-package.relationships+xml"
	CorePropertiesContentType = "application/vnd.openxmlformats-package.core-properties+xml"
	DefaultContentType        = "application/octet"
)

OPC content types

View Source
const (
	// MaxPackageIDLength is the maximum allowed package ID length
	// Reference: PackageIdValidator.cs
	MaxPackageIDLength = 100
)
View Source
const SignaturePath = ".signature.p7s"

SignaturePath is the path to the signature file in a signed package. Reference: SigningSpecificationsV1.cs

Variables

View Source
var (
	// ErrPackageNotSigned indicates the package does not contain a signature
	ErrPackageNotSigned = errors.New("package is not signed")

	// ErrInvalidPackage indicates the package structure is invalid
	ErrInvalidPackage = errors.New("invalid package structure")

	// ErrNuspecNotFound indicates no .nuspec file was found
	ErrNuspecNotFound = errors.New("nuspec file not found")

	// ErrMultipleNuspecs indicates multiple .nuspec files were found
	ErrMultipleNuspecs = errors.New("multiple nuspec files found")

	// ErrInvalidPath indicates an invalid file path (e.g., path traversal)
	ErrInvalidPath = errors.New("invalid file path")
)

Functions

func CopySatelliteFilesIfApplicableV2

func CopySatelliteFilesIfApplicableV2(
	packageReader *PackageReader,
	identity *PackageIdentity,
	pathResolver *PackagePathResolver,
	saveMode PackageSaveMode,
	logger Logger,
) (bool, error)

CopySatelliteFilesIfApplicableV2 checks if the package is a satellite package and copies files to runtime package (V2 layout). Returns true if satellite files were copied, false otherwise.

func CopySatelliteFilesIfApplicableV3

func CopySatelliteFilesIfApplicableV3(
	packageReader *PackageReader,
	identity *PackageIdentity,
	versionResolver *VersionFolderPathResolver,
	saveMode PackageSaveMode,
	logger Logger,
) (bool, error)

CopySatelliteFilesIfApplicableV3 checks if the package is a satellite package and copies files to runtime package (V3 layout).

func CopyToFile

func CopyToFile(stream io.Reader, fileFullPath string) (string, error)

CopyToFile copies stream to file with optimizations. Reference: StreamExtensions.CopyToFile in NuGet.Packaging

func CreateFile

func CreateFile(path string) (*os.File, error)

CreateFile creates a file with platform-specific permissions. Reference: NuGetExtractionFileIO.CreateFile in NuGet.Packaging

func ExtractPackageV2

func ExtractPackageV2(
	ctx context.Context,
	source string,
	packageStream io.ReadSeeker,
	pathResolver *PackagePathResolver,
	extractionContext *PackageExtractionContext,
) ([]string, error)

ExtractPackageV2 extracts package using V2 (packages.config) directory layout. Reference: PackageExtractor.ExtractPackageAsync (Stream-based) in NuGet.Packaging

func GenerateNuspecXML

func GenerateNuspecXML(metadata PackageMetadata) ([]byte, error)

GenerateNuspecXML generates nuspec XML from package metadata.

func GenerateRelationshipID

func GenerateRelationshipID() string

GenerateRelationshipID generates a unique relationship ID.

func GetFileExtension

func GetFileExtension(filePath string) string

GetFileExtension returns the file extension (lowercase, with dot)

func InstallFromSourceV3

func InstallFromSourceV3(
	ctx context.Context,
	source string,
	packageIdentity *PackageIdentity,
	copyToAsync func(string) error,
	versionFolderPathResolver *VersionFolderPathResolver,
	extractionContext *PackageExtractionContext,
) (bool, error)

InstallFromSourceV3 installs package using V3 (PackageReference) layout with file locking. Reference: PackageExtractor.InstallFromSourceAsync in NuGet.Packaging

func IsAnalyzerFile

func IsAnalyzerFile(filePath string) bool

IsAnalyzerFile checks if a file is in the analyzers/ folder

func IsAssembly

func IsAssembly(filePath string) bool

IsAssembly checks if file is a managed assembly

func IsBuildFile

func IsBuildFile(filePath string) bool

IsBuildFile checks if a file is in the build/ folder

func IsContentFile

func IsContentFile(filePath string) bool

IsContentFile checks if a file is in the content/ folder

func IsDllOrExe

func IsDllOrExe(filePath string) bool

IsDllOrExe checks if file is a .dll or .exe

func IsLibFile

func IsLibFile(filePath string) bool

IsLibFile checks if a file is in the lib/ folder

func IsManifestFile

func IsManifestFile(filePath string) bool

IsManifestFile checks if a file is a .nuspec manifest

func IsPackageMetadataFile

func IsPackageMetadataFile(filePath string) bool

IsPackageMetadataFile checks if a file is package metadata

func IsRefFile

func IsRefFile(filePath string) bool

IsRefFile checks if a file is in the ref/ folder

func IsRuntimesFile

func IsRuntimesFile(filePath string) bool

IsRuntimesFile checks if a file is in the runtimes/ folder

func IsToolsFile

func IsToolsFile(filePath string) bool

IsToolsFile checks if a file is in the tools/ folder

func UpdateFileTimeFromEntry

func UpdateFileTimeFromEntry(fileFullPath string, modTime time.Time, logger Logger) error

UpdateFileTimeFromEntry updates file timestamp with retry logic. Reference: ZipArchiveExtensions.UpdateFileTimeFromEntry in NuGet.Packaging

func ValidateDependencies

func ValidateDependencies(packageID string, packageVersion *version.NuGetVersion, groups []PackageDependencyGroup) error

ValidateDependencies validates all dependency groups Reference: PackageBuilder.cs ValidateDependencies

func ValidateFiles

func ValidateFiles(files []PackageFile) error

ValidateFiles validates all files in the package

func ValidateFrameworkReferences

func ValidateFrameworkReferences(groups []PackageFrameworkReferenceGroup) error

ValidateFrameworkReferences validates framework reference groups

func ValidateIcon

func ValidateIcon(metadata PackageMetadata, files []PackageFile) error

ValidateIcon validates icon file reference Reference: PackageBuilder.cs ValidateIconFile

func ValidateLicense

func ValidateLicense(metadata PackageMetadata, files []PackageFile) error

ValidateLicense validates license metadata Reference: PackageBuilder.cs ValidateLicenseFile

func ValidatePackageID

func ValidatePackageID(id string) error

ValidatePackageID validates a package ID Reference: PackageIdValidator.cs IsValidPackageId

func ValidatePackagePath

func ValidatePackagePath(filePath string) error

ValidatePackagePath checks for path traversal attacks. Reference: PackageBuilder validation logic

func ValidateReadme

func ValidateReadme(metadata PackageMetadata, files []PackageFile) error

ValidateReadme validates readme file reference Reference: PackageBuilder.cs ValidateReadmeFile

func WithFileLock

func WithFileLock(ctx context.Context, targetPath string, fn func() error) error

WithFileLock executes a function while holding an exclusive file lock. This is a convenience wrapper for acquireFileLock.

func WriteContentTypes

func WriteContentTypes(zipWriter *zip.Writer, files []PackageFile) error

WriteContentTypes writes [Content_Types].xml to the ZIP archive.

func WriteCoreProperties

func WriteCoreProperties(zipWriter *zip.Writer, metadata PackageMetadata) (string, error)

WriteCoreProperties writes core properties to the ZIP archive.

func WriteRelationships

func WriteRelationships(zipWriter *zip.Writer, nuspecFileName string, corePropertiesPath string) error

WriteRelationships writes _rels/.rels to the ZIP archive.

Types

type ContentFilesEntry

type ContentFilesEntry struct {
	Include      string `xml:"include,attr"`
	Exclude      string `xml:"exclude,attr"`
	BuildAction  string `xml:"buildAction,attr"`
	CopyToOutput string `xml:"copyToOutput,attr"`
	Flatten      string `xml:"flatten,attr"`
}

ContentFilesEntry represents content files metadata.

type ContentTypeDefault

type ContentTypeDefault struct {
	Extension   string `xml:"Extension,attr"`
	ContentType string `xml:"ContentType,attr"`
}

ContentTypeDefault maps file extension to content type.

type ContentTypeOverride

type ContentTypeOverride struct {
	PartName    string `xml:"PartName,attr"`
	ContentType string `xml:"ContentType,attr"`
}

ContentTypeOverride maps specific file to content type.

type ContentTypesXML

type ContentTypesXML struct {
	XMLName   xml.Name              `xml:"Types"`
	Xmlns     string                `xml:"xmlns,attr"`
	Defaults  []ContentTypeDefault  `xml:"Default"`
	Overrides []ContentTypeOverride `xml:"Override,omitempty"`
}

ContentTypesXML represents [Content_Types].xml structure.

func GenerateContentTypes

func GenerateContentTypes(files []PackageFile) (*ContentTypesXML, error)

GenerateContentTypes generates [Content_Types].xml based on package files.

type CorePropertiesXML

type CorePropertiesXML struct {
	XMLName        xml.Name `xml:"http://schemas.openxmlformats.org/package/2006/metadata/core-properties coreProperties"`
	XmlnsDC        string   `xml:"xmlns:dc,attr"`
	XmlnsDCTerms   string   `xml:"xmlns:dcterms,attr"`
	XmlnsXSI       string   `xml:"xmlns:xsi,attr"`
	Creator        string   `xml:"http://purl.org/dc/elements/1.1/ creator,omitempty"`
	Description    string   `xml:"http://purl.org/dc/elements/1.1/ description,omitempty"`
	Identifier     string   `xml:"http://purl.org/dc/elements/1.1/ identifier,omitempty"`
	Version        string   `xml:"version,omitempty"`
	Keywords       string   `xml:"keywords,omitempty"`
	LastModifiedBy string   `xml:"lastModifiedBy,omitempty"`
}

CorePropertiesXML represents package/services/metadata/core-properties/*.psmdcp.

func GenerateCoreProperties

func GenerateCoreProperties(metadata PackageMetadata) *CorePropertiesXML

GenerateCoreProperties generates core properties metadata.

type DependenciesElement

type DependenciesElement struct {
	Groups []DependencyGroup `xml:"group"`
	// Legacy: dependencies without groups (applies to all frameworks)
	Dependencies []Dependency `xml:"dependency"`
}

DependenciesElement represents the dependencies container.

type Dependency

type Dependency struct {
	ID      string `xml:"id,attr"`
	Version string `xml:"version,attr"` // Version range string
	Include string `xml:"include,attr"` // Asset include filter
	Exclude string `xml:"exclude,attr"` // Asset exclude filter
}

Dependency represents a package dependency.

type DependencyGroup

type DependencyGroup struct {
	TargetFramework string       `xml:"targetFramework,attr"`
	Dependencies    []Dependency `xml:"dependency"`
}

DependencyGroup represents dependencies for a specific framework.

type FileIOMode

type FileIOMode uint32

FileIOMode represents Unix file permissions.

const (
	// UnixFileMode is the default permission for extracted files (0766 octal = rwxrw-rw-)
	// Reference: NuGetExtractionFileIO.cs DefaultFileMode
	// Matches .NET Core 1.x behavior for backward compatibility
	UnixFileMode FileIOMode = 0766
)

type FileLock

type FileLock struct {
	// contains filtered or unexported fields
}

FileLock represents an exclusive file lock for package extraction. This prevents concurrent extractions from corrupting the same package.

Reference: NuGet.Client ConcurrencyUtilities.cs ExecuteWithFileLocked

type FrameworkAssembly

type FrameworkAssembly struct {
	AssemblyName    string `xml:"assemblyName,attr"`
	TargetFramework string `xml:"targetFramework,attr"`
}

FrameworkAssembly represents a legacy framework assembly reference.

type FrameworkReference

type FrameworkReference struct {
	Name string `xml:"name,attr"`
}

FrameworkReference represents a reference to a framework assembly.

type FrameworkReferenceGroup

type FrameworkReferenceGroup struct {
	TargetFramework string               `xml:"targetFramework,attr"`
	References      []FrameworkReference `xml:"frameworkReference"`
}

FrameworkReferenceGroup represents framework references for a TFM.

type FrameworkReferencesElement

type FrameworkReferencesElement struct {
	Groups []FrameworkReferenceGroup `xml:"group"`
}

FrameworkReferencesElement represents framework references container.

type LicenseMetadata

type LicenseMetadata struct {
	Type    string `xml:"type,attr"`    // "expression" or "file"
	Version string `xml:"version,attr"` // SPDX license version
	Text    string `xml:",chardata"`    // License expression or file path
}

LicenseMetadata represents license information.

type Logger

type Logger interface {
	Info(format string, args ...any)
	Warning(format string, args ...any)
	Error(format string, args ...any)
}

Logger interface for extraction logging.

type NupkgMetadataFile

type NupkgMetadataFile struct {
	Version     int    `json:"version"`     // Format version (currently 2)
	ContentHash string `json:"contentHash"` // Base64-encoded SHA512 hash
	Source      string `json:"source"`      // Source URL
}

NupkgMetadataFile represents .nupkg.metadata file content. Reference: NupkgMetadataFile class in NuGet.Packaging

func NewNupkgMetadataFile

func NewNupkgMetadataFile(contentHash, source string) *NupkgMetadataFile

NewNupkgMetadataFile creates metadata with current version.

func ReadNupkgMetadataFile

func ReadNupkgMetadataFile(path string) (*NupkgMetadataFile, error)

ReadNupkgMetadataFile reads metadata from JSON file.

func (*NupkgMetadataFile) WriteToFile

func (m *NupkgMetadataFile) WriteToFile(path string) error

WriteToFile writes metadata as JSON.

type Nuspec

type Nuspec struct {
	XMLName  xml.Name       `xml:"package"`
	Xmlns    string         `xml:"xmlns,attr,omitempty"`
	Metadata NuspecMetadata `xml:"metadata"`
	Files    []NuspecFile   `xml:"files>file"`
}

Nuspec represents a parsed .nuspec manifest.

func ParseNuspec

func ParseNuspec(r io.Reader) (*Nuspec, error)

ParseNuspec parses a .nuspec XML document.

func ParseNuspecFile

func ParseNuspecFile(path string) (*Nuspec, error)

ParseNuspecFile parses a nuspec from a file path.

func (*Nuspec) GetAuthors

func (n *Nuspec) GetAuthors() []string

GetAuthors returns the list of authors.

func (*Nuspec) GetDependencyGroups

func (n *Nuspec) GetDependencyGroups() ([]ParsedDependencyGroup, error)

GetDependencyGroups returns all dependency groups with parsed frameworks.

func (*Nuspec) GetFrameworkReferenceGroups

func (n *Nuspec) GetFrameworkReferenceGroups() ([]ParsedFrameworkReferenceGroup, error)

GetFrameworkReferenceGroups returns all framework reference groups.

func (*Nuspec) GetOwners

func (n *Nuspec) GetOwners() []string

GetOwners returns the list of owners.

func (*Nuspec) GetParsedIdentity

func (n *Nuspec) GetParsedIdentity() (*PackageIdentity, error)

GetParsedIdentity returns the package identity from nuspec.

func (*Nuspec) GetTags

func (n *Nuspec) GetTags() []string

GetTags returns the list of tags.

type NuspecFile

type NuspecFile struct {
	Source  string `xml:"src,attr"`
	Target  string `xml:"target,attr"`
	Exclude string `xml:"exclude,attr"`
}

NuspecFile represents a file entry in the nuspec.

type NuspecMetadata

type NuspecMetadata struct {
	// Required fields
	ID          string `xml:"id"`
	Version     string `xml:"version"`
	Description string `xml:"description"`
	Authors     string `xml:"authors"`

	// Optional fields
	Title                    string           `xml:"title"`
	Owners                   string           `xml:"owners"`
	ProjectURL               string           `xml:"projectUrl"`
	IconURL                  string           `xml:"iconUrl"`
	Icon                     string           `xml:"icon"`
	LicenseURL               string           `xml:"licenseUrl"`
	License                  *LicenseMetadata `xml:"license"`
	RequireLicenseAcceptance bool             `xml:"requireLicenseAcceptance"`
	DevelopmentDependency    bool             `xml:"developmentDependency"`
	Summary                  string           `xml:"summary"`
	ReleaseNotes             string           `xml:"releaseNotes"`
	Copyright                string           `xml:"copyright"`
	Language                 string           `xml:"language"`
	Tags                     string           `xml:"tags"`
	Serviceable              bool             `xml:"serviceable"`
	Readme                   string           `xml:"readme"`

	// Version constraints
	MinClientVersion string `xml:"minClientVersion,attr"`

	// Complex elements
	Dependencies        *DependenciesElement        `xml:"dependencies"`
	FrameworkReferences *FrameworkReferencesElement `xml:"frameworkReferences"`
	FrameworkAssemblies []FrameworkAssembly         `xml:"frameworkAssemblies>frameworkAssembly"`
	References          *ReferencesElement          `xml:"references"`
	ContentFiles        []ContentFilesEntry         `xml:"contentFiles>files"`
	PackageTypes        []PackageType               `xml:"packageTypes>packageType"`
	Repository          *RepositoryMetadata         `xml:"repository"`
}

NuspecMetadata represents the metadata section.

type PackageBuilder

type PackageBuilder struct {
	// contains filtered or unexported fields
}

PackageBuilder builds .nupkg files.

func NewPackageBuilder

func NewPackageBuilder() *PackageBuilder

NewPackageBuilder creates a new package builder.

func NewPackageBuilderFromNuspec

func NewPackageBuilderFromNuspec(nuspecPath string) (*PackageBuilder, error)

NewPackageBuilderFromNuspec creates a builder from a nuspec file.

func (*PackageBuilder) AddDependency

func (b *PackageBuilder) AddDependency(fw *frameworks.NuGetFramework, id string, versionRange *version.Range) *PackageBuilder

AddDependency adds a dependency to a specific framework (or nil for "any").

func (*PackageBuilder) AddDependencyGroup

func (b *PackageBuilder) AddDependencyGroup(group PackageDependencyGroup) *PackageBuilder

AddDependencyGroup adds a dependency group.

func (*PackageBuilder) AddFile

func (b *PackageBuilder) AddFile(sourcePath, targetPath string) error

AddFile adds a file from disk to the package.

func (*PackageBuilder) AddFileFromBytes

func (b *PackageBuilder) AddFileFromBytes(targetPath string, content []byte) error

AddFileFromBytes adds a file from in-memory bytes.

func (*PackageBuilder) AddFileFromReader

func (b *PackageBuilder) AddFileFromReader(targetPath string, reader io.Reader) error

AddFileFromReader adds a file from an io.Reader.

func (*PackageBuilder) AddFrameworkReferenceGroup

func (b *PackageBuilder) AddFrameworkReferenceGroup(group PackageFrameworkReferenceGroup) *PackageBuilder

AddFrameworkReferenceGroup adds a framework reference group.

func (*PackageBuilder) AddPackageType

func (b *PackageBuilder) AddPackageType(packageType PackageTypeInfo) *PackageBuilder

AddPackageType adds a package type.

func (*PackageBuilder) GetFiles

func (b *PackageBuilder) GetFiles() []PackageFile

GetFiles returns the current file list.

func (*PackageBuilder) GetMetadata

func (b *PackageBuilder) GetMetadata() PackageMetadata

GetMetadata returns the current package metadata.

func (*PackageBuilder) PopulateFromNuspec

func (b *PackageBuilder) PopulateFromNuspec(nuspec *Nuspec) error

PopulateFromNuspec populates builder metadata from a parsed nuspec.

func (*PackageBuilder) Save

func (b *PackageBuilder) Save(writer io.Writer) error

Save writes the package to a stream.

func (*PackageBuilder) SaveToFile

func (b *PackageBuilder) SaveToFile(path string) error

SaveToFile writes the package to a file.

func (*PackageBuilder) SetAuthors

func (b *PackageBuilder) SetAuthors(authors ...string) *PackageBuilder

SetAuthors sets the package authors.

func (*PackageBuilder) SetCopyright

func (b *PackageBuilder) SetCopyright(copyright string) *PackageBuilder

SetCopyright sets the copyright.

func (*PackageBuilder) SetDescription

func (b *PackageBuilder) SetDescription(description string) *PackageBuilder

SetDescription sets the package description.

func (*PackageBuilder) SetDevelopmentDependency

func (b *PackageBuilder) SetDevelopmentDependency(isDev bool) *PackageBuilder

SetDevelopmentDependency sets whether this is a development dependency.

func (*PackageBuilder) SetID

func (b *PackageBuilder) SetID(id string) *PackageBuilder

SetID sets the package ID.

func (*PackageBuilder) SetIcon

func (b *PackageBuilder) SetIcon(icon string) *PackageBuilder

SetIcon sets the icon file path in the package.

func (*PackageBuilder) SetIconURL

func (b *PackageBuilder) SetIconURL(urlStr string) error

SetIconURL sets the icon URL.

func (*PackageBuilder) SetLanguage

func (b *PackageBuilder) SetLanguage(language string) *PackageBuilder

SetLanguage sets the language.

func (*PackageBuilder) SetLicenseMetadata

func (b *PackageBuilder) SetLicenseMetadata(license *LicenseMetadata) *PackageBuilder

SetLicenseMetadata sets license metadata.

func (*PackageBuilder) SetLicenseURL

func (b *PackageBuilder) SetLicenseURL(urlStr string) error

SetLicenseURL sets the license URL.

func (*PackageBuilder) SetMinClientVersion

func (b *PackageBuilder) SetMinClientVersion(ver *version.NuGetVersion) *PackageBuilder

SetMinClientVersion sets the minimum client version.

func (*PackageBuilder) SetOwners

func (b *PackageBuilder) SetOwners(owners ...string) *PackageBuilder

SetOwners sets the package owners.

func (*PackageBuilder) SetProjectURL

func (b *PackageBuilder) SetProjectURL(urlStr string) error

SetProjectURL sets the project URL.

func (*PackageBuilder) SetReadme

func (b *PackageBuilder) SetReadme(readme string) *PackageBuilder

SetReadme sets the readme file path in the package.

func (*PackageBuilder) SetReleaseNotes

func (b *PackageBuilder) SetReleaseNotes(releaseNotes string) *PackageBuilder

SetReleaseNotes sets the release notes.

func (*PackageBuilder) SetRepository

func (b *PackageBuilder) SetRepository(repo *PackageRepositoryMetadata) *PackageBuilder

SetRepository sets repository metadata.

func (*PackageBuilder) SetRequireLicenseAcceptance

func (b *PackageBuilder) SetRequireLicenseAcceptance(required bool) *PackageBuilder

SetRequireLicenseAcceptance sets whether license acceptance is required.

func (*PackageBuilder) SetServiceable

func (b *PackageBuilder) SetServiceable(serviceable bool) *PackageBuilder

SetServiceable sets whether the package is serviceable.

func (*PackageBuilder) SetSummary

func (b *PackageBuilder) SetSummary(summary string) *PackageBuilder

SetSummary sets the summary.

func (*PackageBuilder) SetTags

func (b *PackageBuilder) SetTags(tags ...string) *PackageBuilder

SetTags sets the package tags.

func (*PackageBuilder) SetTitle

func (b *PackageBuilder) SetTitle(title string) *PackageBuilder

SetTitle sets the package title.

func (*PackageBuilder) SetVersion

func (b *PackageBuilder) SetVersion(ver *version.NuGetVersion) *PackageBuilder

SetVersion sets the package version.

func (*PackageBuilder) Validate

func (b *PackageBuilder) Validate() error

Validate performs comprehensive package validation

type PackageDependency

type PackageDependency struct {
	ID           string
	VersionRange *version.Range
	Include      []string // Asset include filters
	Exclude      []string // Asset exclude filters
}

PackageDependency represents a single package dependency.

type PackageDependencyGroup

type PackageDependencyGroup struct {
	TargetFramework *frameworks.NuGetFramework
	Dependencies    []PackageDependency
}

PackageDependencyGroup represents dependencies for a target framework.

type PackageExtractionContext

type PackageExtractionContext struct {
	// PackageSaveMode controls what files to extract
	PackageSaveMode PackageSaveMode

	// XMLDocFileSaveMode controls XML documentation handling
	XMLDocFileSaveMode XMLDocFileSaveMode

	// CopySatelliteFiles enables satellite package file merging
	CopySatelliteFiles bool

	// SignatureVerifier for signed package validation (optional)
	SignatureVerifier SignatureVerifier

	// Logger for extraction progress (optional)
	Logger Logger

	// ParentID for telemetry correlation (optional)
	ParentID string
}

PackageExtractionContext configures extraction behavior. Reference: PackageExtractionContext class in NuGet.Packaging

func DefaultExtractionContext

func DefaultExtractionContext() *PackageExtractionContext

DefaultExtractionContext returns context with sensible defaults.

type PackageFile

type PackageFile struct {
	SourcePath string    // Path on disk (or empty for in-memory)
	TargetPath string    // Path in .nupkg
	Content    []byte    // In-memory content (if SourcePath is empty)
	Reader     io.Reader // Stream content (if SourcePath is empty and Content is nil)
}

PackageFile represents a file to be added to the package.

type PackageFileExtractor

type PackageFileExtractor struct {
	// contains filtered or unexported fields
}

PackageFileExtractor handles file extraction with XML doc compression. Reference: PackageFileExtractor class in NuGet.Packaging

func NewPackageFileExtractor

func NewPackageFileExtractor(packageFiles []string, saveMode XMLDocFileSaveMode) *PackageFileExtractor

NewPackageFileExtractor creates file extractor.

func (*PackageFileExtractor) ExtractPackageFile

func (e *PackageFileExtractor) ExtractPackageFile(
	source string,
	target string,
	stream io.Reader,
) (string, error)

ExtractPackageFile extracts a single file with special handling. Returns extracted path or empty string if skipped.

type PackageFrameworkAssembly

type PackageFrameworkAssembly struct {
	AssemblyName     string
	TargetFrameworks []*frameworks.NuGetFramework
}

PackageFrameworkAssembly represents a framework assembly reference.

type PackageFrameworkReferenceGroup

type PackageFrameworkReferenceGroup struct {
	TargetFramework *frameworks.NuGetFramework
	References      []string
}

PackageFrameworkReferenceGroup represents framework references for a TFM.

type PackageIdentity

type PackageIdentity struct {
	ID      string
	Version *version.NuGetVersion
}

PackageIdentity represents a package ID and version.

func IsSatellitePackage

func IsSatellitePackage(reader *PackageReader, identity *PackageIdentity) (bool, *PackageIdentity, error)

IsSatellitePackage checks if a package is a satellite package based on NuGet rules: 1. Has a <language> element in .nuspec metadata 2. Package ID ends with ".<language>" suffix (e.g., "MyLib.ja-jp") 3. Has exactly one dependency with exact version match to the runtime package

Reference: NuGet.Client PackageExtractor.cs IsSatellitePackage

func (*PackageIdentity) String

func (p *PackageIdentity) String() string

String returns "ID Version" format.

type PackageMetadata

type PackageMetadata struct {
	// Required
	ID          string
	Version     *version.NuGetVersion
	Description string
	Authors     []string

	// Optional
	Title                    string
	Owners                   []string
	ProjectURL               *url.URL
	IconURL                  *url.URL
	Icon                     string
	LicenseURL               *url.URL
	LicenseMetadata          *LicenseMetadata
	RequireLicenseAcceptance bool
	DevelopmentDependency    bool
	Summary                  string
	ReleaseNotes             string
	Copyright                string
	Language                 string
	Tags                     []string
	Serviceable              bool
	Readme                   string

	// Version constraints
	MinClientVersion *version.NuGetVersion

	// Complex elements
	DependencyGroups         []PackageDependencyGroup
	FrameworkReferenceGroups []PackageFrameworkReferenceGroup
	FrameworkAssemblies      []PackageFrameworkAssembly
	PackageTypes             []PackageTypeInfo
	Repository               *PackageRepositoryMetadata
}

PackageMetadata represents package metadata for building.

type PackagePathResolver

type PackagePathResolver struct {
	// contains filtered or unexported fields
}

PackagePathResolver resolves paths for V2 (packages.config) layout. Reference: PackagePathResolver class in NuGet.Packaging

func NewPackagePathResolver

func NewPackagePathResolver(rootDirectory string, useSideBySidePaths bool) *PackagePathResolver

NewPackagePathResolver creates a V2 path resolver.

func (*PackagePathResolver) GetInstallPath

func (r *PackagePathResolver) GetInstallPath(identity *PackageIdentity) string

GetInstallPath returns full installation path. Format: {rootDirectory}/{ID}.{Version} or {rootDirectory}/{ID}

func (*PackagePathResolver) GetManifestFileName

func (r *PackagePathResolver) GetManifestFileName(identity *PackageIdentity) string

GetManifestFileName returns the .nuspec file name. Format: {ID}.nuspec (preserves original casing)

func (*PackagePathResolver) GetPackageDirectoryName

func (r *PackagePathResolver) GetPackageDirectoryName(identity *PackageIdentity) string

GetPackageDirectoryName returns the directory name for a package. Format: {ID}.{Version} (if useSideBySidePaths) or {ID} (otherwise)

func (*PackagePathResolver) GetPackageDownloadMarkerFileName

func (r *PackagePathResolver) GetPackageDownloadMarkerFileName(identity *PackageIdentity) string

GetPackageDownloadMarkerFileName returns download marker filename. Format: {ID}.packagedownload.marker

func (*PackagePathResolver) GetPackageFileName

func (r *PackagePathResolver) GetPackageFileName(identity *PackageIdentity) string

GetPackageFileName returns the .nupkg file name. Format: {ID}.{Version}.nupkg

func (*PackagePathResolver) GetPackageFilePath

func (r *PackagePathResolver) GetPackageFilePath(identity *PackageIdentity) string

GetPackageFilePath returns full path to .nupkg file.

type PackageReader

type PackageReader struct {
	// contains filtered or unexported fields
}

PackageReader provides read access to .nupkg files.

func OpenPackage

func OpenPackage(path string) (*PackageReader, error)

OpenPackage opens a .nupkg file from a file path.

func OpenPackageFromReaderAt

func OpenPackageFromReaderAt(r io.ReaderAt, size int64) (*PackageReader, error)

OpenPackageFromReaderAt opens a package from a ReaderAt.

func (*PackageReader) Close

func (r *PackageReader) Close() error

Close closes the package reader.

func (*PackageReader) CopyFileTo

func (r *PackageReader) CopyFileTo(zipPath string, writer io.Writer) error

CopyFileTo copies a file from the package to the provided writer.

func (*PackageReader) ExtractFile

func (r *PackageReader) ExtractFile(zipPath, destPath string) error

ExtractFile extracts a single file from the package to the destination path. The ZIP path is validated to prevent directory traversal attacks.

func (*PackageReader) ExtractFiles

func (r *PackageReader) ExtractFiles(files []*zip.File, destDir string) error

ExtractFiles extracts multiple files to a destination directory. File paths are preserved relative to the package root.

func (*PackageReader) Files

func (r *PackageReader) Files() []*zip.File

Files returns the list of files in the ZIP.

func (*PackageReader) GetBuildFiles

func (r *PackageReader) GetBuildFiles() []*zip.File

GetBuildFiles returns all files in build/ folders.

func (*PackageReader) GetContentFiles

func (r *PackageReader) GetContentFiles() []*zip.File

GetContentFiles returns all files in content/ folders.

func (*PackageReader) GetFile

func (r *PackageReader) GetFile(filePath string) (*zip.File, error)

GetFile finds a file by path (case-insensitive).

func (*PackageReader) GetFiles

func (r *PackageReader) GetFiles(prefix string) []*zip.File

GetFiles returns files matching a path prefix.

func (*PackageReader) GetIdentity

func (r *PackageReader) GetIdentity() (*PackageIdentity, error)

GetIdentity returns the package identity from the nuspec. Reference: PackageArchiveReader.GetIdentity

func (*PackageReader) GetLibFiles

func (r *PackageReader) GetLibFiles() []*zip.File

GetLibFiles returns all files in the lib/ folder.

func (*PackageReader) GetNuspec

func (r *PackageReader) GetNuspec() (*Nuspec, error)

GetNuspec reads and parses the .nuspec file.

func (*PackageReader) GetNuspecFile

func (r *PackageReader) GetNuspecFile() (*zip.File, error)

GetNuspecFile finds and returns the .nuspec file entry. Nuspec should be at the root level with .nuspec extension.

func (*PackageReader) GetPackageFiles

func (r *PackageReader) GetPackageFiles() []*zip.File

GetPackageFiles returns all files excluding package metadata. This filters out .nuspec, signatures, and OPC files.

func (*PackageReader) GetPrimarySignature

func (r *PackageReader) GetPrimarySignature() (*signatures.PrimarySignature, error)

GetPrimarySignature returns the primary signature if package is signed

func (*PackageReader) GetRefFiles

func (r *PackageReader) GetRefFiles() []*zip.File

GetRefFiles returns all files in the ref/ folder.

func (*PackageReader) GetSignatureFile

func (r *PackageReader) GetSignatureFile() (*zip.File, error)

GetSignatureFile returns the signature file if package is signed.

func (*PackageReader) GetToolsFiles

func (r *PackageReader) GetToolsFiles() []*zip.File

GetToolsFiles returns all files in the tools/ folder.

func (*PackageReader) HasFile

func (r *PackageReader) HasFile(filePath string) bool

HasFile checks if a file exists in the package.

func (*PackageReader) IsAuthorSigned

func (r *PackageReader) IsAuthorSigned() (bool, error)

IsAuthorSigned checks if package has an author signature

func (*PackageReader) IsRepositorySigned

func (r *PackageReader) IsRepositorySigned() (bool, error)

IsRepositorySigned checks if package has a repository signature

func (*PackageReader) IsSigned

func (r *PackageReader) IsSigned() bool

IsSigned checks if the package contains a signature file. Reference: PackageArchiveReader.cs

func (*PackageReader) OpenNuspec

func (r *PackageReader) OpenNuspec() (io.ReadCloser, error)

OpenNuspec opens the .nuspec file for reading.

type PackageRepositoryMetadata

type PackageRepositoryMetadata struct {
	Type   string
	URL    string
	Branch string
	Commit string
}

PackageRepositoryMetadata represents repository metadata.

type PackageSaveMode

type PackageSaveMode int

PackageSaveMode controls what gets extracted (flags). Reference: PackageSaveMode enum in NuGet.Packaging

const (
	// PackageSaveModeNone indicates no save mode.
	PackageSaveModeNone PackageSaveMode = 0
	// PackageSaveModeNuspec extracts .nuspec files.
	PackageSaveModeNuspec PackageSaveMode = 1 << 0
	// PackageSaveModeNupkg saves .nupkg files.
	PackageSaveModeNupkg PackageSaveMode = 1 << 1
	// PackageSaveModeFiles extracts package files.
	PackageSaveModeFiles PackageSaveMode = 1 << 2

	// PackageSaveModeDefaultV2 is the default for packages.config projects (V2).
	PackageSaveModeDefaultV2 = PackageSaveModeNupkg | PackageSaveModeFiles

	// PackageSaveModeDefaultV3 is the default for PackageReference projects (V3).
	PackageSaveModeDefaultV3 = PackageSaveModeNuspec | PackageSaveModeNupkg | PackageSaveModeFiles
)

func (PackageSaveMode) HasFlag

func (m PackageSaveMode) HasFlag(flag PackageSaveMode) bool

HasFlag checks if a specific flag is set.

type PackageType

type PackageType struct {
	Name    string `xml:"name,attr"`
	Version string `xml:"version,attr"`
}

PackageType represents the type of package.

type PackageTypeInfo

type PackageTypeInfo struct {
	Name    string
	Version *version.NuGetVersion
}

PackageTypeInfo represents a package type.

type ParsedDependency

type ParsedDependency struct {
	ID           string
	VersionRange *version.Range
	Include      []string // Asset include patterns
	Exclude      []string // Asset exclude patterns
}

ParsedDependency represents a dependency with parsed version range.

func (*ParsedDependency) ToPackageDependency

func (d *ParsedDependency) ToPackageDependency() PackageDependency

ToPackageDependency converts a ParsedDependency to PackageDependency.

type ParsedDependencyGroup

type ParsedDependencyGroup struct {
	TargetFramework *frameworks.NuGetFramework
	Dependencies    []ParsedDependency
}

ParsedDependencyGroup represents a dependency group with parsed framework.

func (*ParsedDependencyGroup) ToPackageDependencyGroup

func (g *ParsedDependencyGroup) ToPackageDependencyGroup() PackageDependencyGroup

ToPackageDependencyGroup converts a ParsedDependencyGroup to PackageDependencyGroup.

type ParsedFrameworkReferenceGroup

type ParsedFrameworkReferenceGroup struct {
	TargetFramework *frameworks.NuGetFramework
	References      []string
}

ParsedFrameworkReferenceGroup represents framework references with parsed TFM.

func (*ParsedFrameworkReferenceGroup) ToPackageFrameworkReferenceGroup

func (g *ParsedFrameworkReferenceGroup) ToPackageFrameworkReferenceGroup() PackageFrameworkReferenceGroup

ToPackageFrameworkReferenceGroup converts to PackageFrameworkReferenceGroup.

type PathResolver

type PathResolver interface {
	GetInstallPath(packageID string, ver *version.NuGetVersion) string
}

PathResolver interface for V2/V3 path resolution.

type Reference

type Reference struct {
	File string `xml:"file,attr"`
}

Reference represents a reference to an assembly in the package.

type ReferenceGroup

type ReferenceGroup struct {
	TargetFramework string      `xml:"targetFramework,attr"`
	References      []Reference `xml:"reference"`
}

ReferenceGroup represents references for a specific framework.

type ReferencesElement

type ReferencesElement struct {
	Groups []ReferenceGroup `xml:"group"`
}

ReferencesElement represents package assembly references.

type Relationship

type Relationship struct {
	Type   string `xml:"Type,attr"`
	Target string `xml:"Target,attr"`
	ID     string `xml:"Id,attr"`
}

Relationship represents a single relationship.

type RelationshipsXML

type RelationshipsXML struct {
	XMLName       xml.Name       `xml:"Relationships"`
	Xmlns         string         `xml:"xmlns,attr"`
	Relationships []Relationship `xml:"Relationship"`
}

RelationshipsXML represents _rels/.rels structure.

func GenerateRelationships

func GenerateRelationships(nuspecFileName string, corePropertiesPath string) *RelationshipsXML

GenerateRelationships generates _rels/.rels for the package.

type RepositoryMetadata

type RepositoryMetadata struct {
	Type   string `xml:"type,attr"`
	URL    string `xml:"url,attr"`
	Branch string `xml:"branch,attr"`
	Commit string `xml:"commit,attr"`
}

RepositoryMetadata represents repository information.

type SignatureVerifier

type SignatureVerifier interface {
	VerifySignatureAsync(ctx context.Context, reader *PackageReader) error
}

SignatureVerifier interface for package signature verification.

type VersionFolderPathResolver

type VersionFolderPathResolver struct {
	// contains filtered or unexported fields
}

VersionFolderPathResolver resolves paths for V3 (PackageReference) layout. Reference: VersionFolderPathResolver class in NuGet.Packaging

func NewVersionFolderPathResolver

func NewVersionFolderPathResolver(rootPath string, isLowercase bool) *VersionFolderPathResolver

NewVersionFolderPathResolver creates a V3 path resolver.

func (*VersionFolderPathResolver) GetHashPath

func (r *VersionFolderPathResolver) GetHashPath(packageID string, ver *version.NuGetVersion) string

GetHashPath returns full path to hash file. Format: {rootPath}/{id}/{version}/{id}.{version}.nupkg.sha512

func (*VersionFolderPathResolver) GetInstallPath

func (r *VersionFolderPathResolver) GetInstallPath(packageID string, ver *version.NuGetVersion) string

GetInstallPath returns full installation path.

func (*VersionFolderPathResolver) GetManifestFilePath

func (r *VersionFolderPathResolver) GetManifestFilePath(packageID string, ver *version.NuGetVersion) string

GetManifestFilePath returns full path to .nuspec file. Format: {rootPath}/{id}/{version}/{id}.nuspec

func (*VersionFolderPathResolver) GetNupkgMetadataPath

func (r *VersionFolderPathResolver) GetNupkgMetadataPath(packageID string, ver *version.NuGetVersion) string

GetNupkgMetadataPath returns full path to metadata file. Format: {rootPath}/{id}/{version}/.nupkg.metadata

func (*VersionFolderPathResolver) GetPackageDirectory

func (r *VersionFolderPathResolver) GetPackageDirectory(packageID string, ver *version.NuGetVersion) string

GetPackageDirectory returns package version folder. Format: {rootPath}/{id}/{version}

func (*VersionFolderPathResolver) GetPackageFilePath

func (r *VersionFolderPathResolver) GetPackageFilePath(packageID string, ver *version.NuGetVersion) string

GetPackageFilePath returns full path to .nupkg file. Format: {rootPath}/{id}/{version}/{id}.{version}.nupkg

func (*VersionFolderPathResolver) GetVersionListDirectory

func (r *VersionFolderPathResolver) GetVersionListDirectory(packageID string) string

GetVersionListDirectory returns package ID folder. Format: {rootPath}/{id} (lowercase if configured)

type XMLDocFileSaveMode

type XMLDocFileSaveMode int

XMLDocFileSaveMode controls XML documentation file handling. Reference: XmlDocFileSaveMode enum in NuGet.Packaging

const (
	// XMLDocFileSaveModeNone extracts XML documentation files normally.
	XMLDocFileSaveModeNone XMLDocFileSaveMode = 0
	// XMLDocFileSaveModeSkip skips extracting XML documentation files.
	XMLDocFileSaveModeSkip XMLDocFileSaveMode = 1
	// XMLDocFileSaveModeCompress compresses XML documentation files as .xml.zip.
	XMLDocFileSaveModeCompress XMLDocFileSaveMode = 2
)

Directories

Path Synopsis
Package assets implements NuGet's pattern-based asset selection engine.
Package assets implements NuGet's pattern-based asset selection engine.
Package signatures provides PKCS#7/CMS signature reading and parsing for NuGet packages.
Package signatures provides PKCS#7/CMS signature reading and parsing for NuGet packages.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL