Nixpkgs is a collection of over 70,000 software packages for the [[NixOS]] package manager. It serves as the default package repository for the NixOS Linux distribution and is also used by other Nix-based systems like GuixSD. Nixpkgs provides a wide range of software packages, including programming languages, development tools, desktop environments, networking utilities, and more. It follows a functional programming paradigm where packages are defined as pure functions that take inputs and produce outputs. This makes it easy to [[Reproducible|reproduce]] builds and enables deterministic package management. The package definitions in Nixpkgs are written in the Nix expression language, which is a lazy functional language designed specifically for defining reproducible build processes. These expressions describe how to fetch source code for each package, configure build options, apply patches if necessary, and specify dependencies. Being an open-source project, Nixpkgs benefits from community contributions. Anyone can contribute new packages or improvements to existing ones. The community follows a thorough review process to ensure the quality and integrity of packages before they get merged into the repository. Nixpkgs also allows users to create custom package sets by extending or modifying existing definitions. This flexibility makes it easy to create tailored software environments for specific use cases or projects. Overall, Nixpkgs provides a powerful and flexible package management system that promotes reproducibility and simplifies software deployment across various platforms supported by Nix. # Organization of the Nix Packages Collection On page 26 of [[@PurelyFunctionalSoftware2006|The Purely Functional Software Deployment Model]], the following diagram was shown: ``` [[nixpkgs]] -pkgs applications misc hello default.nix builder.sh networking browsers firefox default,nix builder.sh writable-copies.patch development libraries glibc default.nix builder.sh compilers gcc ... interpreters perl ... system all-packages-generic.nix all-package.nix stdenvs.nix ``` Then, he said: > There is nothing in Nix that requires this organisation; it is merely a useful convention. It is perfectly possible to place component expressions and builders in the same directory by naming them appropriately, e.g., hello.nix, hello-builder.sh, firefox.nix, and so on. It is also possible to put all Nix expressions in a single file, e.g., put everything in all-packages- generic.nix, which of course would make this file quickly spiral out of control. In fact, it is not even necessary to define components as functions and compose them separately, as done in the 3-step procedure above; we could remove all variability and write Nix expressions that describe exactly one build action, rather than a family of build actions. Clearly, that is not a very general approach. ## Nixpkgs working with Hydra [[Nixpkgs]] is a collection of packages for the Nix package manager, and [[Hydra for NixOS]] is a distributed build system used by the Nix package manager for building and testing packages. Nixpkgs provides a repository of package definitions that can be used to build software in a reproducible manner. It contains thousands of packages, ranging from system-level libraries and tools to applications and development frameworks. [[Hydra for NixOS]] integrates with Nixpkgs by providing a platform for building packages defined in Nixpkgs across multiple machines in a distributed and parallel manner. It allows developers to submit their package builds to Hydra, which then schedules them on available build machines. Hydra also provides various features like automatic dependency resolution, caching of build artifacts, parallel builds, and result evaluation. It ensures that the builds are reproducible by using the same set of dependencies and configurations defined in Nixpkgs. With Hydra, Nixpkgs can benefit from distributed computing resources to speed up package builds and enable continuous integration workflows. It helps ensure that the packages in Nixpkgs are constantly tested and evaluated against different configurations and environments. Overall, Nixpkgs working with Hydra provides an efficient infrastructure for building, testing, and distributing software packages built with the Nix package manager. # References ```dataview Table title as Title, authors as Authors where contains(subject, "Nixpkgs") ```