Just want to point out that one alternative might be to use Lorri, which automatically creates GC roots so you won’t have to worry about it.
The other option is to use
nix-shell --indirect --add-root wherever/is/fine.
For getting a handle on the derivation for pushing to cachix, you could get it like this:
: This really is not documented well:
You can find it by following some manpages in this order: nix-shell -> nix-instantiate -> nix-store, which says:
Causes the result of a realisation (--realise and --force-realise) to be
registered as a root of the garbage collector. The root is stored in path,
which must be inside a directory that is scanned for roots by the garbage
collector (i.e., typically in a subdirectory of /nix/var/nix/gcroots/) unless
the --indirect flag is used.
If there are multiple results, then multiple symlinks will be created by
sequentially numbering symlinks beyond the first one (e.g., foo, foo-2, foo-3,
and so on).
In conjunction with --add-root, this option allows roots to be stored outside
of the GC roots directory. This is useful for commands such as nix-build that
place a symlink to the build result in the current directory; such a build
result should not be garbage-collected unless the symlink is removed.
The --indirect flag causes a uniquely named symlink to path to be stored in
/nix/var/nix/gcroots/auto/. For instance,
$ nix-store --add-root /home/eelco/bla/result --indirect -r ...
$ ls -l /nix/var/nix/gcroots/auto
lrwxrwxrwx 1 ... 2005-03-13 21:10 dn54lcypm8f8... -> /home/eelco/bla/result
$ ls -l /home/eelco/bla/result
lrwxrwxrwx 1 ... 2005-03-13 21:10 /home/eelco/bla/result -> /nix/store/1r11343n6qd4...-f-spot-0.0.10
Thus, when /home/eelco/bla/result is removed, the GC root in the auto directory
becomes a dangling symlink and will be ignored by the collector.
Note that it is not possible to move or rename indirect GC roots, since the
symlink in the auto directory will still point to the old location.