forked from extern/flakelight
Set defaults for inputs from flake.lock
If the `src` passed to flakelight contains a flake.lock, it will now be read and used to set defaults for `inputs`. Explicitly passed inputs will override this.
This commit is contained in:
parent
24b3fcfce7
commit
cecfafe9a4
27
API_GUIDE.md
27
API_GUIDE.md
@ -87,8 +87,31 @@ This section covers the options available to modules.
|
|||||||
Type: AttrsOf FlakeInput
|
Type: AttrsOf FlakeInput
|
||||||
```
|
```
|
||||||
|
|
||||||
The `inputs` option allows setting the flake inputs used by modules. To set the
|
The `inputs` option is an attrset of the flake inputs used by flakelight
|
||||||
nixpkgs used for building outputs, you can pass your flake inputs in as follows:
|
modules. These inputs get passed as the `inputs` module argument, and are used
|
||||||
|
for `inputs` and `inputs'` in the package set.
|
||||||
|
|
||||||
|
Default values are automatically initialized from your flake inputs by reading
|
||||||
|
your `flake.lock`. Note that this does not include the `self` argument, which
|
||||||
|
must be passed explicitly if you want to use it.
|
||||||
|
|
||||||
|
Flakelight will add a recent `nixpkgs` input if your flake does not have one.
|
||||||
|
Other flakelight modules may provide default inputs for their dependencies.
|
||||||
|
|
||||||
|
To use a different nixpkgs from the built-in default:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
flakelight.url = "github:nix-community/flakelight";
|
||||||
|
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
outputs = { flakelight, ... }:
|
||||||
|
flakelight ./. { };
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also explicitly pass in inputs, overriding defaults, as follows:
|
||||||
|
|
||||||
```nix
|
```nix
|
||||||
{
|
{
|
||||||
|
@ -73,9 +73,8 @@ To use a different nixpkgs, you can instead use:
|
|||||||
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
|
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
|
||||||
flakelight.url = "github:nix-community/flakelight";
|
flakelight.url = "github:nix-community/flakelight";
|
||||||
};
|
};
|
||||||
outputs = { flakelight, ... }@inputs:
|
outputs = { flakelight, ... }:
|
||||||
flakelight ./. {
|
flakelight ./. {
|
||||||
inherit inputs;
|
|
||||||
devShell.packages = pkgs: [ pkgs.hello pkgs.coreutils ];
|
devShell.packages = pkgs: [ pkgs.hello pkgs.coreutils ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
13
builtinModules/autoInputs.nix
Normal file
13
builtinModules/autoInputs.nix
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# flakelight -- Framework for simplifying flake setup
|
||||||
|
# Copyright (C) 2023 Archit Gupta <archit@accelbread.com>
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
{ lib, src, ... }:
|
||||||
|
let
|
||||||
|
inherit (builtins) mapAttrs pathExists;
|
||||||
|
inherit (lib) mkOverride;
|
||||||
|
lock2inputs = import ../misc/lock2inputs.nix { inherit lib; };
|
||||||
|
lockFound = pathExists (src + "/flake.lock");
|
||||||
|
autoInputs = if lockFound then lock2inputs src else { };
|
||||||
|
in
|
||||||
|
{ config.inputs = mapAttrs (_: mkOverride 950) autoInputs; }
|
46
misc/lock2inputs.nix
Normal file
46
misc/lock2inputs.nix
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# flakelight -- Framework for simplifying flake setup
|
||||||
|
# Copyright (C) 2023 Archit Gupta <archit@accelbread.com>
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
# Get a flakes inputs
|
||||||
|
{ lib, ... }:
|
||||||
|
src:
|
||||||
|
let
|
||||||
|
inherit (builtins) fromJSON head isString mapAttrs readFile tail;
|
||||||
|
inherit (lib) fix;
|
||||||
|
|
||||||
|
json = fromJSON (readFile (src + "/flake.lock"));
|
||||||
|
inherit (json) nodes;
|
||||||
|
rootNode = nodes.${json.root};
|
||||||
|
|
||||||
|
getInputName = base: ref:
|
||||||
|
let next = getInputName json.root nodes.${base}.inputs.${head ref}; in
|
||||||
|
if isString ref then ref
|
||||||
|
else if ref == [ ] then base
|
||||||
|
else getInputName next (tail ref);
|
||||||
|
|
||||||
|
getInput = ref: resolved.${getInputName json.root ref};
|
||||||
|
|
||||||
|
fetchNode = node: fetchTree (node.info or { } //
|
||||||
|
removeAttrs node.locked [ "dir" ]);
|
||||||
|
|
||||||
|
resolveFlakeNode = node: fix (self:
|
||||||
|
let
|
||||||
|
sourceInfo = fetchNode node;
|
||||||
|
outPath = sourceInfo +
|
||||||
|
(if node.locked ? dir then "/${node.locked.dir}" else "");
|
||||||
|
inputs = (mapAttrs (_: getInput) (node.inputs or { })) //
|
||||||
|
{ inherit self; };
|
||||||
|
outputs = (import (outPath + "/flake.nix")).outputs inputs;
|
||||||
|
in
|
||||||
|
outputs // sourceInfo // {
|
||||||
|
_type = "flake";
|
||||||
|
inherit outPath inputs outputs sourceInfo;
|
||||||
|
});
|
||||||
|
|
||||||
|
resolveNode = node:
|
||||||
|
if node.flake or true then resolveFlakeNode node else fetchNode node;
|
||||||
|
|
||||||
|
resolved = mapAttrs (_: resolveNode) nodes;
|
||||||
|
in
|
||||||
|
mapAttrs (_: v: resolved.${v}) rootNode.inputs
|
Loading…
Reference in New Issue
Block a user