A package manager is a tool that automates the work of obtaining, installing, upgrading, configuring, and removing software components and the other components they depend on. Instead of a developer or administrator manually downloading source code, compiling it, and tracking which libraries each program needs, a package manager pulls named packages from a repository and resolves their dependencies on the user’s behalf.
The category is well documented by the tools themselves. Cargo, the Rust package manager, is described in its own documentation as a tool that “downloads your Rust package’s dependencies, compiles your packages, makes distributable packages, and uploads them to crates.io, the Rust community’s package registry.” This captures the recurring shape of a package manager: a client that talks to a registry, fetches dependencies, and produces or installs the finished software.
The same pattern appears across ecosystems. npm describes itself as a way for “open source developers from every continent” to “share and borrow packages,” pairing a command-line client with a central registry. The idea generalizes far beyond any single language: system package managers install and remove software across an entire operating system, while language-specific managers handle libraries for a particular runtime.
What unites them is the automation of dependency handling. A package declares what it needs, and the manager works out which versions to install so that everything fits together. This is the core service that distinguishes a package manager from simply copying files: it turns a tangle of manual steps into a single repeatable command, and it is the category that includes apt, npm, pip, Cargo, Homebrew, and many more.