[Nix-dev] nix-shell is unable to install the package which nix-env just returned

Layus layus.on at gmail.com
Thu Mar 31 18:07:35 CEST 2016


Oops, at some point I missed that this is all about nix-shell.

So, by looking into nix-shell, we see that packages names are evaluated 
here https://github.com/NixOS/nix/blob/master/scripts/nix-build.in#L226.
This means that the package names used with "-p" must exist within 
"<nixpkgs>", which you just shown do not...

This is all a misunderstanding. When trying to resolve <nixpkgs>, 
nix-shell looks at yout NIX_PATH.
Your nix-path contains something like this :
/nix/var/nix/profiles/per-user/root/channels/nixos:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels
So, the first place where nixpkgs is looked for is 
/nix/var/nix/profiles/per-user/root/channels/nixos, and as the nixos 
channel comes with a folder named nixpkgs, this is the one selected.

To work around this, you have one solution: override nixpkgs location.
You can either use
NIX_PATH=nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixpkgs 
nix-shell -p letsencrypt, or
nix-shell -p letsencrypt -I 
nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixpkgs

Other variations may also work, like
NIX_PATH=/nix/var/nix/profiles/per-user/root/channels/ nix-shell -p 
letsencrypt, or
nix-shell -p letsencrypt -I /nix/var/nix/profiles/per-user/root/channels/

Now, this happens because nixos defines NIX_PATH to be the nixos pkgs 
tree, and therefore <nixpkgs> always resolves to nixos packages.
As to why this package is listed in nix-env, this is because nix-env 
gets its default expression from ~/.nix-defexpr, which behaves more 
sanely, not looking at NIX_PATH.
If you want to know more about the future unification of nix-*commands, 
https://github.com/NixOS/nix/issues/779 (and referenced pages) are a 
good start.

It appears that the nice channel.package is very specific to nix-env, 
and not used by the other tools.
In particular, nix-shell provides no way to use packages from different 
channels at the same time.

Regards,
-- Layus.

On 31/03/16 15:30, Dmitry Malikov wrote:
> > What's the output of (normal user)
> > $ nix-channel --list
>
> Well, it's empty.
>
> >To inspect your system state, try to run
>
> >> nix-instantiate --eval --expr --strict "<nixpkgs>"
> /nix/store/bc71r4k7bms0ykfl5zxgww1fi3kb0jdw-nixos-15.09.1180.e8e1cb8/nixos/nixpkgs
> >> nix-instantiate --eval --expr --strict "<nixos>"
> /nix/store/bc71r4k7bms0ykfl5zxgww1fi3kb0jdw-nixos-15.09.1180.e8e1cb8/nixos/nixos
> >> sudo nix-instantiate --eval --expr --strict "<nixpkgs>"
> /nix/store/bc71r4k7bms0ykfl5zxgww1fi3kb0jdw-nixos-15.09.1180.e8e1cb8/nixos/nixpkgs
> >> sudo nix-instantiate --eval --expr --strict "<nixos>"
> /nix/store/bc71r4k7bms0ykfl5zxgww1fi3kb0jdw-nixos-15.09.1180.e8e1cb8/nixos/nixos
>
> ><nixpkgs> gets evaluated in the context of the current user, so you 
> will get very different results when using sudo.
> Nah, they look pretty much the same.
>
> >Now, there is no reason for the attribute returned by `nix-env -f 
> "<nixpkgs>" -qaP` to be missing when calling `nix-shell "<nixpkgs>" 
> -p` because the nixpkgs are exactly the same.
>
> Yep, probably this explains something.
> >> nix-env -qaP -f "<nixpkgs>" | grep letsencrypt
> >>
>
> So, what are the best practices of having nixos and nixpkgs-unstable 
> channels? Should root user be subscribed to nixos and the normal user 
> to nixpkgs one?
>
> On 31 March 2016 at 11:46, Guillaume Maudoux (Layus) 
> <layus.on at gmail.com <mailto:layus.on at gmail.com>> wrote:
>
>     Hmm.. could it be that your system is confused by multiple channels ?
>
>     What's the output of (normal user)
>     $ nix-channel --list
>
>     I think your best bet is `nix-shell "<nixpkgs>" -p letsencrypt`
>     where nixpkgs is your channel name.
>
>     You can even go further and set the nixpkgs path directly using
>     nix-shell
>     /nix/store/7kxsv9svwcaxzkxxjg0zxcb151mic8vw-nixos-16.03pre76756.885acea/nixos/nixpkgs
>     -p letsencrypt
>
>     nix-env can also take such a path
>
>     To inspect your system state, try to run
>     $ nix-instantiate --eval --expr --strict "<nixpkgs>"
>     $ nix-instantiate --eval --expr --strict "<nixos>"
>     $ sudo nix-instantiate --eval --expr --strict "<nixpkgs>"
>     $ sudo nix-instantiate --eval --expr --strict "<nixos>"
>
>     <nixpkgs> gets evaluated in the context of the current user, so
>     you will get very different results when using sudo.
>
>     To ensure a consistent result, you can also pass the nixpkg tree
>     to nix-env with option -f.
>     $ nix-env -qaP -f "<nixpkgs>"
>
>     Now, there is no reason for the attribute returned by `nix-env -f
>     "<nixpkgs>" -qaP` to be missing when calling `nix-shell
>     "<nixpkgs>" -p` because the nixpkgs are exactly the same.
>
>     All this highlights the inconsistency between (and within) the tools.
>     But that's another story :-).
>
>     Layus.
>
>     Le 31/03/16 11:25, Dmitry Malikov a écrit :
>>     >> nix-shell -p nixpkgs.pkgs.letsencrypt
>>     error: undefined variable ‘nixpkgs’ at (string):1:66
>>     (use ‘--show-trace’ to show detailed location information)
>>
>>     Any other ideas?
>>
>>     On 31 March 2016 at 10:37, Arseniy Seroka <ars.seroka at gmail.com
>>     <mailto:ars.seroka at gmail.com>> wrote:
>>
>>         nix-shell -p nixpkgs.pkgs.letsencrypt
>>
>>         -- 
>>         Sincerely,
>>         Arseniy Seroka
>>
>>         On 31 March 2016 02:21:40 Dmitry Malikov
>>         <malikov.d.y at gmail.com <mailto:malikov.d.y at gmail.com>> wrote:
>>
>>>         >> sudo nix-channel --list
>>>         nixpkgs https://nixos.org/channels/nixpkgs-unstable
>>>         nixos https://nixos.org/channels/nixos-15.09
>>>
>>>         >> nixos-version
>>>         15.09.1180.e8e1cb8 (Dingo)
>>>
>>>         >> nix-env --version
>>>         nix-env (Nix) 1.10
>>>
>>>         Anything else?
>>>
>>>>         On 31 Mar 2016, at 00:45, Jonn Mostovoy <jm at memorici.de
>>>>         <mailto:jm at memorici.de>> wrote:
>>>>
>>>>         Just worked for me, exactly the same command.
>>>>         My version of nixpkgs is way older though.
>>>>
>>>>         On Mar 31, 2016 12:40 AM, "Dmitry Malikov"
>>>>         <malikov.d.y at gmail.com <mailto:malikov.d.y at gmail.com>> wrote:
>>>>
>>>>             >>
>>>>             nix-env -qaP '*' | grep letsencrypt
>>>>             nixpkgs.letsencrypt
>>>>             letsencrypt-0.4.0
>>>>
>>>>             >> nix-shell -p letsencrypt
>>>>             error: undefined variable ‘letsencrypt’ at (string):1:66
>>>>             (use ‘--show-trace’ to show detailed location information)
>>>>
>>>>
>>>>             What am I missing here?
>>>>
>>>>             _______________________________________________
>>>>             nix-dev mailing list
>>>>             nix-dev at lists.science.uu.nl
>>>>             <mailto:nix-dev at lists.science.uu.nl>
>>>>             http://lists.science.uu.nl/mailman/listinfo/nix-dev
>>>>
>>>
>>>         _______________________________________________
>>>         nix-dev mailing list
>>>         nix-dev at lists.science.uu.nl
>>>         <mailto:nix-dev%40lists.science.uu.nl>
>>>         http://lists.science.uu.nl/mailman/listinfo/nix-dev
>>>
>>
>>
>>
>>     _______________________________________________
>>     nix-dev mailing list
>>     nix-dev at lists.science.uu.nl <mailto:nix-dev at lists.science.uu.nl>
>>     http://lists.science.uu.nl/mailman/listinfo/nix-dev
>
>
>     _______________________________________________
>     nix-dev mailing list
>     nix-dev at lists.science.uu.nl <mailto:nix-dev at lists.science.uu.nl>
>     http://lists.science.uu.nl/mailman/listinfo/nix-dev
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.science.uu.nl/pipermail/nix-dev/attachments/20160331/62debfe2/attachment-0001.html 


More information about the nix-dev mailing list