Skip to content

Commit

Permalink
add allowSubstitutes = false example
Browse files Browse the repository at this point in the history
  • Loading branch information
Mic92 committed Aug 25, 2020
1 parent 00c54f2 commit a0fb614
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 3 deletions.
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,20 @@ $ nix-build-uncached ./ci.nix

If your package set you are building has packages at the top level scope that
have the attribute `allowSubstitutes = false;` set, than `nix-build-uncached`
will build/download them everytime. A workaround is to use the following
[gist](https://gist.github.com/7bc9210b1c4d0afe390f0d425b50e02f):
will build/download them everytime. This attribute is set for some builders such
as `writeText` or `writeScriptBin`. A workaround is to use the following
[nix library](./scripts/force_cached.nix) and save it as
`force_cached.nix`. Than wrap your attribute set like this:

```nix
# TODO example
let
pkgs = import <nixpkgs> {};
in (pkgs.callPackage ./force_cached.nix {}) {
hello = pkgs.writeScriptBin "hello" ''
#!/bin/sh
exec ${pkgs.hello}/bin/hello
'';
}
```


Expand Down
39 changes: 39 additions & 0 deletions scripts/force_cached.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{ coreutils }:

attrs:
with builtins;
let
# Copied from <nixpkgs/lib>
isDerivation = x: isAttrs x && x ? type && x.type == "derivation";

# Return true if `nix-build` would traverse that attribute set to look for
# more derivations to build.
hasRecurseIntoAttrs = x: isAttrs x && (x.recurseForDerivations or false);

# Wraps derivations that disallow substitutes so that they can be cached.
toCachedDrv = drv:
if !(drv.allowSubstitutes or true) then
derivation
{
name = "${drv.name}-to-cached";
system = drv.system;
builder = "/bin/sh";
args = [ "-c" "${coreutils}/bin/ln -s ${drv} $out" ];
}
else
drv;

op = _: val:
if isDerivation val then
toCachedDrv val
else if hasRecurseIntoAttrs val then
forceCached val
else
val
;

# Traverses a tree of derivation and wrap all of those that disallow
# substitutes.
forceCached = attrs: mapAttrs op attrs;
in
forceCached attrs
8 changes: 8 additions & 0 deletions scripts/force_cached_example.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
let
pkgs = import <nixpkgs> {};
in (pkgs.callPackage ./force_cached.nix {}) {
hello = pkgs.writeScriptBin "hello" ''
#!/bin/sh
exec ${pkgs.hello}/bin/hello
'';
}

0 comments on commit a0fb614

Please sign in to comment.