Skip to content

🔍 Packages

This page covers methods in pkg/composer for single/multi-package operations, defined in packages.go, additional_methods.go, and result_types.go. They correspond to composer's require, remove, show, search, depends, why, why-not, outdated, bump, reinstall, browse, and other subcommands.

🎯 When to Use

  • ➕ Add a new dependency to the project → RequirePackage
  • ➖ Remove an unneeded dependency → Remove
  • 🔎 View an installed package's version/dependencies/source location → ShowPackage or structured ShowPackageInfo
  • 🌐 Find packages on Packagist → Search or structured SearchInfo
  • 🌳 Understand dependency relationships between packages → ShowDependencyTree / WhyPackage / ShowReverseDependencies
  • ⬆️ Find which packages can be upgraded → OutdatedPackages or structured GetOutdatedInfo
  • 🚫 Troubleshoot why a version can't be installed → WhyNotPackage

📋 Method Overview

MethodSignature SummaryEquivalent Command
RequirePackageRequirePackage(packageName, version string, dev bool) errorcomposer require [--dev] pkg:ver
RequirePackageWithOptionsRequirePackageWithOptions(packageName, version string, options map[string]string) errorcomposer require [options] pkg:ver
RequireMultipleRequireMultiple(packages map[string]string, dev bool) errorcomposer require [--dev] pkg1:ver1 pkg2:ver2 ...
🧪 RequireDryRunRequireDryRun(packageName, version string) (string, error)composer require --dry-run pkg:ver
RemoveRemove(packageName string, dev bool) errorcomposer remove [--dev] pkg
RemoveWithOptionsRemoveWithOptions(packageName string, options map[string]string) errorcomposer remove [options] pkg
RemoveMultipleRemoveMultiple(packages []string, dev bool) errorcomposer remove [--dev] pkg1 pkg2 ...
🧪 RemoveDryRunRemoveDryRun(packageName string) (string, error)composer remove --dry-run pkg
🔎 ShowPackageShowPackage(packageName string) (string, error)composer show pkg
ShowPackageWithFormatShowPackageWithFormat(packageName, format string) (string, error)composer show pkg --format=FMT
ShowPackageInfoShowPackageInfo(packageName string) (*PackageInfo, error)composer show pkg --format=json (structured)
ShowAllPackagesShowAllPackages() (string, error)composer show
ShowDirectPackagesShowDirectPackages() (string, error)composer show --direct
ShowSelfPackageShowSelfPackage() (string, error)composer show --self
ShowLatestVersionsShowLatestVersions() (string, error)composer show --latest
ShowWithOptionsShowWithOptions(options map[string]string) (string, error)composer show [options]
🌳 ShowDependencyTreeShowDependencyTree(packageName string) (string, error)composer show --tree [pkg]
🔗 ShowReverseDependenciesShowReverseDependencies(packageName string) (string, error)composer depends pkg
DependsWithOptionsDependsWithOptions(packageName string, options map[string]string) (string, error)composer depends pkg [options]
WhyPackageWhyPackage(packageName string) (string, error)composer why pkg
WhyWithOptionsWhyWithOptions(packageName string, options map[string]string) (string, error)composer why pkg [options]
🚫 WhyNotPackageWhyNotPackage(packageName, version string) (string, error)composer why-not pkg ver
WhyNotWithOptionsWhyNotWithOptions(packageName, version string, options map[string]string) (string, error)composer why-not pkg ver [options]
⬆️ OutdatedPackagesOutdatedPackages() (string, error)composer outdated
OutdatedPackagesDirectOutdatedPackagesDirect() (string, error)composer outdated --direct
OutdatedWithOptionsOutdatedWithOptions(options map[string]string) (string, error)composer outdated [options]
OutdatedWithFormatOutdatedWithFormat(format string) (string, error)composer outdated --format=FMT
ShowOutdatedWithFormatShowOutdatedWithFormat(format string) (string, error)composer outdated --format=FMT (alias)
ShowOutdatedMinorOnlyShowOutdatedMinorOnly() (string, error)composer outdated --minor-only
GetOutdatedInfoGetOutdatedInfo() (*OutdatedResult, error)composer outdated --format=json (structured)
GetOutdatedInfoWithOptionsGetOutdatedInfoWithOptions(options map[string]string) (*OutdatedResult, error)Same + options
🌐 SearchSearch(query string) (string, error)composer search query
SearchWithFormatSearchWithFormat(query, format string) (string, error)composer search query --format=FMT
SearchOnlyNameSearchOnlyName(query string) (string, error)composer search query --only-name
SearchWithTypeSearchWithType(query, packageType string) (string, error)composer search query --type=TYPE
SearchInfoSearchInfo(query string) (*SearchResult, error)composer search query --format=json (structured)
📈 BumpPackagesBumpPackages(packages []string) errorcomposer bump [packages...]
BumpPackagesWithOptionsBumpPackagesWithOptions(packages []string, options map[string]string) errorcomposer bump [options] [packages...]
🔁 ReinstallReinstall(packageName string) errorcomposer reinstall pkg
ReinstallWithOptionsReinstallWithOptions(packageName string, options map[string]string) errorcomposer reinstall [options] pkg
ReinstallMultipleReinstallMultiple(packages []string) errorcomposer reinstall pkg1 pkg2 ...
ReinstallMultipleWithOptionsReinstallMultipleWithOptions(packages []string, options map[string]string) errorcomposer reinstall [options] pkg1 ...
🌍 BrowsePackageBrowsePackage(packageName string) errorcomposer browse pkg
BrowsePackageWithOptionsBrowsePackageWithOptions(packageName string, options map[string]string) errorcomposer browse pkg [options]

✨ marked methods return structured Go types instead of raw strings; see the "Structured Return Values" section below.


RequirePackage

Add a new dependency package to the project, write it to composer.json, and install immediately.

Signature

go
func (c *Composer) RequirePackage(packageName string, version string, dev bool) error

Parameters

ParameterTypeDescription
packageNamestringPackage name, e.g., "symfony/console"
versionstringVersion constraint, e.g., "^5.0"; empty means latest version
devbooltrue adds as dev dependency (--dev)

Return Values

TypeDescription
errorOn failure, returns error wrapping ErrRequirePackageFailed

Example

go
// Add production dependency
err := comp.RequirePackage("symfony/console", "^5.0", false)
if err != nil {
	log.Fatalf("Failed to add dependency: %v", err)
}

// Add dev dependency
err = comp.RequirePackage("phpunit/phpunit", "^9.0", true)

Advanced

  • To add multiple packages at once, use RequireMultiple(map[string]string{"symfony/console": "^5.0", "monolog/monolog": "^2.0"}, false).
  • To dry-run without modifying composer.json, use RequireDryRun(packageName, version).
  • For more options (like --prefer-source, --no-update), use RequirePackageWithOptions.

Remove

Remove the specified dependency package from the project.

Signature

go
func (c *Composer) Remove(packageName string, dev bool) error

Parameters

ParameterTypeDescription
packageNamestringPackage name to remove
devbooltrue removes from dev dependencies (--dev)

Example

go
// Remove production dependency
err := comp.Remove("symfony/console", false)

// Remove dev dependency
err = comp.Remove("phpunit/phpunit", true)

Advanced

  • Batch remove with RemoveMultiple([]string{"a/b", "c/d"}, false).
  • Dry-run with RemoveDryRun(packageName).

🔎 ShowPackage / ✨ ShowPackageInfo

Show detailed info of a specified package (version, dependencies, install location, etc.).

Signatures

go
func (c *Composer) ShowPackage(packageName string) (string, error)
func (c *Composer) ShowPackageInfo(packageName string) (*PackageInfo, error)

Parameters

ParameterTypeDescription
packageNamestringPackage name to show info for

Return Values

  • ShowPackage: (string, error) — composer raw text output; returns ErrShowPackageFailed on failure.
  • ShowPackageInfo: (*PackageInfo, error) — parsed struct (internally executes composer show pkg --format=json).

Example

go
// Raw text
output, err := comp.ShowPackage("symfony/console")
fmt.Println(output)

// Structured
info, err := comp.ShowPackageInfo("symfony/console")
if err != nil {
	log.Fatalf("Failed to get package info: %v", err)
}
fmt.Printf("Package %s version %s\n", info.Name, info.Version)
fmt.Printf("Type: %s, Homepage: %s\n", info.Type, info.Homepage)
fmt.Printf("License: %v\n", info.License)

Advanced

  • For custom (non-json) output format, use ShowPackageWithFormat(packageName, format).
  • To view all installed packages, use ShowAllPackages(); for direct dependencies only, use ShowDirectPackages().

🌐 Search / ✨ SearchInfo

Search for packages matching keywords on Packagist.

Signatures

go
func (c *Composer) Search(query string) (string, error)
func (c *Composer) SearchInfo(query string) (*SearchResult, error)

Parameters

ParameterTypeDescription
querystringSearch keywords

Return Values

  • Search: (string, error) — raw text; returns ErrSearchFailed on failure.
  • SearchInfo: (*SearchResult, error) — structured result (internally executes composer search query --format=json).

Example

go
// Structured search
res, err := comp.SearchInfo("logger")
if err != nil {
	log.Fatalf("Search failed: %v", err)
}
for _, r := range res.Results {
	fmt.Printf("%s: %s\n", r.Name, r.Description)
}

Advanced

  • For exact name match only, use SearchOnlyName(query), reducing noise from descriptions.
  • For type filtering, use SearchWithType(query, "composer-plugin"), supporting types like library/composer-plugin/project.
  • For custom output format, use SearchWithFormat(query, "json").

⬆️ OutdatedPackages / ✨ GetOutdatedInfo

Show all outdated packages in the project and available updates.

Signatures

go
func (c *Composer) OutdatedPackages() (string, error)
func (c *Composer) GetOutdatedInfo() (*OutdatedResult, error)
func (c *Composer) GetOutdatedInfoWithOptions(options map[string]string) (*OutdatedResult, error)

Return Values

  • OutdatedPackages: (string, error) — raw text.
  • GetOutdatedInfo: (*OutdatedResult, error) — structured result (internally executes composer outdated --format=json).

Example

go
// Structured query of outdated packages
outdated, err := comp.GetOutdatedInfo()
if err != nil {
	log.Fatalf("Failed to get outdated package info: %v", err)
}
for _, p := range outdated.Installed {
	fmt.Printf("⬆️  %s: %s -> %s (%s)\n",
		p.Name, p.Installed, p.Latest, p.LatestStatus)
}
fmt.Printf("Total %d outdated packages\n", outdated.Count)

Advanced

  • For direct dependencies only, use OutdatedPackagesDirect().
  • For minor version updates only, use ShowOutdatedMinorOnly().
  • For custom options, use OutdatedWithOptions(map[string]string{"direct": "", "minor-only": ""}) or GetOutdatedInfoWithOptions.
  • For custom format, use OutdatedWithFormat("json") / ShowOutdatedWithFormat("text").

About Exit Codes

composer outdated may return non-zero exit code when there are outdated packages, but the output still contains valid JSON. GetOutdatedInfo handles this: when err != nil but output == "", it returns an empty result instead of an error.


🌳 ShowDependencyTree

Display a package's dependency relationships as a tree structure.

Signature

go
func (c *Composer) ShowDependencyTree(packageName string) (string, error)

Parameters

ParameterTypeDescription
packageNamestringPackage name; empty string shows the entire project's dependency tree

Example

go
// Entire project's dependency tree
output, err := comp.ShowDependencyTree("")

// Specific package's dependency tree
output, err = comp.ShowDependencyTree("symfony/console")

Advanced

  • To parse the tree into Go structs, use ParseDependencyTreeJSON(output) in parsing.go, which returns []DependencyNode, each node has Name, Version, Children.

WhyPackage / 🚫 WhyNotPackage / 🔗 ShowReverseDependencies

These three method groups are for understanding dependency relationships:

MethodSignatureEquivalent CommandPurpose
WhyPackageWhyPackage(packageName string) (string, error)composer why pkgExplain why a package is installed (depended on by whom)
WhyNotPackageWhyNotPackage(packageName, version string) (string, error)composer why-not pkg verExplain why a version can't be installed (conflict source)
ShowReverseDependenciesShowReverseDependencies(packageName string) (string, error)composer depends pkgShow which installed packages depend on this one

Example

go
// Why is polyfill-mbstring installed?
why, _ := comp.WhyPackage("symfony/polyfill-mbstring")
fmt.Println("Install reason:", why)

// Why can't symfony/console v4.0.0 be installed?
whyNot, _ := comp.WhyNotPackage("symfony/console", "v4.0.0")
fmt.Println("Reason it can't be installed:", whyNot)

// Who depends on polyfill-mbstring?
deps, _ := comp.ShowReverseDependencies("symfony/polyfill-mbstring")
fmt.Println("Reverse dependencies:", deps)

Advanced

  • All three have WithOptions variants: WhyWithOptions, WhyNotWithOptions, DependsWithOptions, accepting options like map[string]string{"format": "json"}.

📈 BumpPackages

Upgrade specified packages to the latest version matching the version constraint in composer.json (doesn't change constraints, only updates lock versions). Requires Composer 2.4+.

Signatures

go
func (c *Composer) BumpPackages(packages []string) error
func (c *Composer) BumpPackagesWithOptions(packages []string, options map[string]string) error

Parameters

ParameterTypeDescription
packages[]stringList of package names to bump; empty slice bumps all packages

Example

go
// Bump multiple packages
err := comp.BumpPackages([]string{"symfony/console", "symfony/process"})
if err != nil {
	log.Fatalf("Failed to bump packages: %v", err)
}

// Bump all packages
err = comp.BumpPackages([]string{})

// With options (dev-only + dry-run)
options := map[string]string{
	"dev-only":      "",
	"prefer-stable": "",
	"dry-run":       "",
}
err = comp.BumpPackagesWithOptions([]string{"symfony/console"}, options)

🔁 Reinstall

Reinstall specified packages using Composer 2.2+'s native reinstall command.

Signatures

go
func (c *Composer) Reinstall(packageName string) error
func (c *Composer) ReinstallWithOptions(packageName string, options map[string]string) error
func (c *Composer) ReinstallMultiple(packages []string) error
func (c *Composer) ReinstallMultipleWithOptions(packages []string, options map[string]string) error

Example

go
// Reinstall single package
err := comp.Reinstall("symfony/console")

// Reinstall with prefer-source
err = comp.ReinstallWithOptions("symfony/console", map[string]string{"prefer-source": ""})

// Batch reinstall
err = comp.ReinstallMultiple([]string{"symfony/console", "symfony/process"})

Version Requirement

The reinstall command requires Composer 2.2 or higher. For older versions, use Remove + RequirePackage as a substitute.


🌍 BrowsePackage

Open the specified package's project page (usually the GitHub repository) in the default browser.

Signatures

go
func (c *Composer) BrowsePackage(packageName string) error
func (c *Composer) BrowsePackageWithOptions(packageName string, options map[string]string) error

Example

go
// Open package homepage
err := comp.BrowsePackage("symfony/console")

// Open docs page
err = comp.BrowsePackageWithOptions("symfony/console", map[string]string{"docs": ""})

// Open issue tracker page
err = comp.BrowsePackageWithOptions("symfony/console", map[string]string{"issues": ""})

Environment Dependency

Requires OS support for opening a browser, and the package must declare a project URL in composer.json. Server environments without GUI are generally not applicable.


🧱 Structured Return Values

Structured methods for package operations return the following types (all defined in result_types.go):

PackageInfo (returned by ShowPackageInfo)

go
type PackageInfo struct {
	Name        string                 `json:"name"`
	Version     string                 `json:"version"`
	Description string                 `json:"description,omitempty"`
	Type        string                 `json:"type,omitempty"`
	Keywords    []string               `json:"keywords,omitempty"`
	Homepage    string                 `json:"homepage,omitempty"`
	License     []string               `json:"license,omitempty"`
	Authors     []PackageAuthor        `json:"authors,omitempty"`
	Support     map[string]string      `json:"support,omitempty"`
	Require     map[string]string      `json:"require,omitempty"`
	RequireDev  map[string]string      `json:"require_dev,omitempty"`
	Autoload    map[string]interface{} `json:"autoload,omitempty"`
	Source      PackageSource          `json:"source,omitempty"`
	Dist        PackageDist            `json:"dist,omitempty"`
	Abandoned   interface{}            `json:"abandoned,omitempty"` // bool or string
	Time        string                 `json:"time,omitempty"`
}

OutdatedResult (returned by GetOutdatedInfo)

go
type OutdatedResult struct {
	Installed []OutdatedPackage `json:"installed"`
	Count     int               `json:"count,omitempty"`
}

type OutdatedPackage struct {
	Name         string      `json:"name"`
	Latest       string      `json:"latest"`
	Installed    string      `json:"version"`
	LatestStatus string      `json:"latest_status"` // "semver-safe-update" | "update-possible" | "up-to-date"
	Abandoned    interface{} `json:"abandoned,omitempty"`
}

SearchResult (returned by SearchInfo)

go
type SearchResult struct {
	Results []SearchResultItem `json:"results"`
	Total   int                `json:"total,omitempty"`
}

type SearchResultItem struct {
	Name        string `json:"name"`
	Description string `json:"description,omitempty"`
	URL         string `json:"url,omitempty"`
	Repository  string `json:"repository,omitempty"`
}

When to Use Structured Variants

When you need to programmatically check version numbers, count outdated packages, store search results in a database, or render to UI, definitely use ShowPackageInfo / GetOutdatedInfo / SearchInfo. Raw string methods are only suitable for human reading or log output.

🧭 Next Steps

Released under the MIT License