Nixpkgs/Modifying Packages: Difference between revisions

imported>Roberth
Extract from LSB Discussion
 
imported>Nix
link to overlays page
 
(4 intermediate revisions by 2 users not shown)
Line 8: Line 8:


If upstreaming into the official NixPkgs is not an option, consider creating an overlay. This is slightly more involved at first, but is easier to maintain than a NixPkgs fork and, unlike a fork, it can be combined with other overlays. In an overlay, you can also choose not to redefine the package, but only override part of the arguments or derivation attributes. For example, you may only need to change one of the [https://nixos.org/nixpkgs/manual/#sec-stdenv-phases stdenv build phases].
If upstreaming into the official NixPkgs is not an option, consider creating an overlay. This is slightly more involved at first, but is easier to maintain than a NixPkgs fork and, unlike a fork, it can be combined with other overlays. In an overlay, you can also choose not to redefine the package, but only override part of the arguments or derivation attributes. For example, you may only need to change one of the [https://nixos.org/nixpkgs/manual/#sec-stdenv-phases stdenv build phases].
== The Copy Paste Option ==
This one is quick and easy to understand, but not something you can build on.
Let's add a patch to GNU hello by duplicating its definition. In the NixPkgs repository, hello can be found in <code>pkgs/applications/misc/hello/default.nix</code>, but it is not an expression that can be built directly with <code>nix-build</code> or <code>nix-env -i</code>. Its dependencies need to be injected, so let's wrap it in <code>callPackage</code>
<syntaxhighlight>
let pkgs = import <nixpkgs> {};
in pkgs.callPackage (
  # whatever is in hello.nix
) {}
</syntaxhighlight>
This is a Nix expression you can build, install, or base a Nix shell on.
It is not as flexible as the original definition though. If you want to reuse hello as a dependency of another package, you will have to work with two methods of injecting dependencies. Instead of just the standard <code>callPackage</code> function, your packages have to specify exactly where their dependencies come from, which can become a burden of its own. Also it is impossible to use this package with something other than the default <code>&lt;nixpkgs&gt;</code>, default NixPkgs configuration, default system architecture etc.
So this method of modifying a package is only suited for prototyping a package before refactoring and ad-hoc packages you know you will not re-use. Please consider the other options, because they don't have those drawbacks.
== Upstreaming into NixPkgs ==
Making your changes available as open source has all the benefits of open source. If it's an option for you, fork [https://github.com/NixOS/nixpkgs nixpkgs on github], read the contributing guidelines, edit and test your modified clone and create a pull request.
== Create an Overlay ==
[[Overlays]] are a composable method of managing packages that are not (or not yet) suitable for upstream NixPkgs. Unlike a fork, you can have multiple active overlays and you can make changes to packages without having to maintain a git fork of the entire repository.
[https://github.com/basvandijk/nixtodo/blob/master/default.nix Nixtodo] has an example of using an overlay to structure the packages in a web application project.
[https://github.com/mozilla/nixpkgs-mozilla Nixpkgs-mozilla] is an example of an overlay containing alternative and extra open source software.