ezshell README.md
3.3 kB · 129 lines
Markdown
at main

This project is a heavy WIP and not ready to be used. The name is also very WIP, please give me recommendations.

ezshell #

Standalone semi-implementation of devenv's languages feature.

Install (flake) #

inputs.ezshell.url = "git+https://tangled.org/poacher.dev/ezshell";
inputs.ezshell.inputs.nixpkgs.follows = "nixpkgs";

Basic usage #

ezshell.lib.withLangs determines system/pkgs itself from whatever systems appear in languages:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    ezshell.url = "git+https://tangled.org/poacher.dev/ezshell";
  };
  outputs = {nixpkgs, ezshell, ...}: let
    system = "x86_64-linux";
  in ezshell.lib.withLangs {
    languages.${system} = {
      rust.enable = true;
      python = {
        enable = true;
        version = "3.11"; # -> python311
      };
    };
  };
}
$ nix develop
$ python --version
$ cargo --version

Composing with an existing devShell #

withLangs takes any flake-outputs-shaped attrset and merges into it. Your existing devShells are preserved via.

ezshell.lib.withLangs {
  devShells.${system}.default = pkgs.mkShellNoCC {
    packages = [pkgs.postgresql];
  };
  languages.${system}.python.enable = true;
}

Git hooks (optional) #

withLangs always generates a nixhooks.hooks.${system} attrset as part of its output in the shape expected by nixhooks, so you can compose it with ezshell:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    ezshell.url = "git+https://tangled.org/poacher.dev/ezshell";
    nixhooks.url = "git+https://tangled.org/poacher.dev/nixhooks";
  };
  outputs = {nixpkgs, ezshell, nixhooks, ...}: let
    system = "x86_64-linux";
  in nixhooks.lib.withHooks (ezshell.lib.withLangs {
    languages.${system}.rust.enable = true;
  });
}
$ nix develop         # git hooks install automatically
$ nix run .#run-hooks # manually install hooks

Reaching into resolved options #

Both withLangs and mkLangs always include every language's fully resolved options in their result under languages.

In a flake, you may reach it through self:

{
  outputs = {self, nixpkgs, ezshell, ...}: ezshell.lib.withLangs {
    languages.${system}.nix.enable = true;

    checks.${system}.fmt-check = pkgs.runCommand "fmt-check" {} ''
      ${pkgs.lib.getExe self.languages.${system}.nix.formatter.package} --check ${./.}
      touch $out
    '';
  };
}

Manual, single-system use #

ezshell.lib.${system}.mkLangs is also available directly, for lower-level per-system control:

let
  result = ezshell.lib.${system}.mkLangs {
    languages.python.enable = true;
  };
in
  result.languages.python.package

Non-flake usage #

Vendor your own nixpkgs and adios, then use mkLangs: Non-flake usage only gets mkLangs, so you need to build the devShell yourself:

let
  pkgs = import <nixpkgs> {};
  adios = import (import ./npins).lladios; 
  ezshell = import (fetchTarball "https://tangled.org/poacher.dev/ezshell/archive/main.tar.gz") {
    inherit pkgs adios;
  };
  result = ezshell.mkLangs {
    languages.python.enable = true;
  };
in
  pkgs.mkShellNoCC {packages = result.packages;}