Go toolchain binaries not symlinked in /bin
mkmik opened this issue · 1 comments
I'm not familiar with Nix nor nixery so I'm likely doing something wrong. That said, I noticed an inconsistent behaviour while trying nixery out:
I tried to run the nixery.dev/shell/go
image and I noticed that the go
and gofmt
binaries were not in the path (although they were in the /nix/store/...
)
I noticed that other packages get installed and symlinked from /bin
(I tried with a few packages like findutils
and kubeseal
and they indeed become accessible via a symlink from /bin
).
Here is how to reproduce with a small/minimal example:
has symlink:
$ docker run -ti nixery.dev/kubeseal/bash/coreutils sh
sh-4.4# ls -l /bin/kubeseal
lrwxrwxrwx 1 0 0 71 Jan 1 1970 /bin/kubeseal -> /nix/store/dz3cf474s8pxw530n322r5hxmlpg41a2-kubeseal-0.9.6/bin/kubeseal
sh-4.4# exit
doesn't have the symlink:
$ docker run -ti nixery.dev/go/bash/coreutils sh
sh-4.4# ls -l /bin/go
ls: cannot access '/bin/go': No such file or directory
sh-4.4# ls -l /nix/store/*-go*/bin/go
-r-xr-xr-x 1 0 0 15112249 Jan 1 1970 /nix/store/s84r3m5162gy1glc6kb0sfsadw8792lq-go-1.13.5/bin/go
I'd expect the go
package to be accessible from /bin/go
.
Interestingly, when using the go
package alone, it seems in the PATH (at least docker can run it as a command):
$ docker run -ti nixery.dev/go go
Go is a tool for managing Go source code.
...
while when I add any other package to it, it cannot be run:
docker run -ti nixery.dev/go/coreutils go
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"go\": executable file not found in $PATH": unknown
Hey! Thanks for flagging this. I think I see what's going on:
tazjin@vauxhall ~> nix-build -E '(import <nixpkgs> {}).go'; and ls -lh result/
/nix/store/h0wih1nab037j9biy39laagl5dwlgp29-go-1.13.6
total 8.0K
lrwxrwxrwx 1 tazjin primarygroup 12 Jan 1 1970 bin -> share/go/bin/
dr-xr-xr-x 2 tazjin primarygroup 4.0K Jan 1 1970 nix-support/
dr-xr-xr-x 3 tazjin primarygroup 4.0K Jan 1 1970 share/
The Nix derivation for Go places the actual binaries in share/go/bin
for some reason and symlinks them from the package's root, this symlink will be dropped by the mechanism that Nixery uses to construct the file-system root (nixpkgs.symlinkJoin
).
To solve this generically (which we'll need to, as having package-specific overrides isn't really sustainable) we either need a symlinkJoin
that "merges" symlinks or defer to #58. I'll have a think about it!