[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