zarak / dream2nix

Nixify software with less effort [maintainer=@DavHau]

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[WIP] dream2nix - A framework for automated nix packaging

dream2nix is a framework for automatically converting packages from other build systems to nix. It focuses on the following aspects:

  • Modularity
  • Customizability
  • Maintainability
  • Nixpkgs Compatibility (not enforcing IFD)
  • Code de-duplication across 2nix converters
  • Code de-duplication in nixpkgs
  • Risk free opt-in FOD fetching (no reproducibility issues)
  • Common UI across 2nix converters
  • Reduce effort to develop new 2nix solutions
  • Exploration and adoption of new nix features
  • Simplified updating of packages

The goal of this project is to create a standardized, generic, modular framework for automated packaging solutions, aiming for better flexibility, maintainability and usability.

The intention is to integrate many existing 2nix converters into this framework, thereby improving many of the previously named aspects and providing a unified UX for all 2nix solutions.

Test the experimental version of dream2nix

(Currently only nodejs and rust packaging is supported)

  1. Make sure you use a nix version >= 2.4 and have experimental-features = "nix-command flakes" set.
  2. Navigate to to the project indended to be packaged and initialize a dream2nix flake:
      cd ./my-project
      nix flake init -t github:nix-community/dream2nix#simple
  3. List the packages that can be built
      nix flake show

Minimal Example flake.nix:

{
  inputs.dream2nix.url = "github:nix-community/dream2nix";
  outputs = { self, dream2nix }@inputs:
    let
      dream2nix = inputs.dream2nix.lib.init {
        # modify according to your supported systems
        systems = [ "x86_64-linux" ];
        config.projectRoot = ./. ;
      };
    in dream2nix.makeFlakeOutputs {
      source = ./.;
    };
}

Extensive Example flake.nix:

{
  inputs.dream2nix.url = "github:nix-community/dream2nix";
  outputs = { self, dream2nix }@inputs:
    let
      system = "x86_64-linux";

      pkgs = inputs.dream2nix.nixpkgs.legacyPackages.${system};

      dream2nix = inputs.dream2nix.lib.init {
        # modify according to your supported systems
        systems = [ system ];
        config.projectRoot = ./. ;
      };

    in dream2nix.makeFlakeOutputs {
      source = ./.;

      # Configure the behavior of dream2nix when translating projects.
      # A setting applies to all discovered projects if `filter` is unset,
      # or just to a subset or projects if `filter` is used.
      settings = [

        # prefer aggregated source fetching (large FODs)
        {
          aggregate = true;
        }

        # for all impure nodejs projects with just a `package.json`,
        # add arguments for the `package-json` translator
        {
          filter = project: project.translator == "package-json";
          subsystemInfo.npmArgs = "--legacy-peer-deps";
        }
      ];

      # configure package builds via overrides
      # (see docs for override system below)
      packageOverrides = {
        # name of the package
        package-name = {
          # name the override
          add-pre-build-steps = {
            # override attributes
            preBuild = "...";
            # update attributes
            buildInputs = old: old ++ [ pkgs.hello ];
          };
        };
      };

      # Inject missing dependencies
      inject = {
        # Make foo depend on bar and baz
        # from
        foo."6.4.1" = [
          # to
          ["bar" "13.2.0"]
          ["baz" "1.0.0"]
        ];
        # dependencies with @ and slash require quoting
        # the format is the one that is in the lockfile
        "@tiptap/extension-code"."2.0.0-beta.26" = [
           ["@tiptap/core" "2.0.0-beta.174"]
         ];
      };

      # add sources for `bar` and `baz`
      sourceOverrides = oldSources: {
        bar."13.2.0" = builtins.fetchTarball {url = ""; sha256 = "";};
        baz."1.0.0" = builtins.fetchTarball {url = ""; sha256 = "";};
      };
    };
}

Watch the presentation

(The code examples of the presentation are outdated) dream2nix - A generic framework for 2nix tools

Further Reading

Community

matrix: https://matrix.to/#/#dream2nix:nixos.org

About

Nixify software with less effort [maintainer=@DavHau]

License:MIT License


Languages

Language:Nix 87.8%Language:Python 11.7%Language:Shell 0.4%Language:JavaScript 0.2%