如何构建nix hello world

时间:2018-01-26 23:20:51

标签: nix

我尝试使用Nix手册开始使用简单的Hello World derivation。 但是我不清楚如何构建它。

  • 我可以在哪里下载源文件,所以我不知道 必须逐行复制吗?
  • 我有办法nix-build吗? 没有必须修改全局(例如pkgs/top-level/all-packages.nix)?
  • pkgs/top-level/all-packages.nix在哪里?

2 个答案:

答案 0 :(得分:3)

一种选择是克隆nixpkgs repository,然后构建该存储库中提供的hello包配方:

git clone https://github.com/NixOS/nixpkgs
cd nixpkgs
nix-build -A hello

这样做,您不必修改all-packages.nix,因为它已经有hello的条目。如果您确实要修改all-packages.nix,可以在克隆的nixpkgs存储库中找到它。只需获取您克隆的存储库的路径(例如~/nixpkgs)并添加pkgs/top-level/all-packages.nix即可获得all-packages.nix的路径。您可以在此处查看该文件的副本:

https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/all-packages.nix

当您开始构建不属于nixpkgs的自己的软件时,您可能会选择在自己的存储库中编写自己的default.nix文件并在其中放置一行来导入nixpkgs,使用{{ 1}}环境变量:

NIX_PATH

答案 1 :(得分:1)

请注意,我正在运行NixOs,不确定我的答案是否适用于其他(非Linux)系统。

  

我是否可以从某处下载源文件,所以我不必逐行复制它们?

您可以浏览nixpkgs,所有源文件都在那里。

  

有没有办法nix-build无需修改全局内容(例如pkgs / top-level / all-packages.nix)?

David Grayson已经提供了很好的answer

我很乐意添加一些信息。

nix-build将在当前目录中查找default.nix,并且构建结果将在当前工作目录中以符号链接命名为result

测试nix表达式是否可以构建的另一种方法是nix-shell,它还在当前目录中查找default.nixshell.nix。如果构建成功,您将获得shell提示,并提供您的软件包。

nix-buildnix-shell都有-I参数,您可以指向任何nix存储库,包括远程存储库。

例如,如果我使用nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/master.tar.gz -p hellonix将下载binary cache(如果存在)或使用当前hello分支表达式构建master并给我一个shell hello可以使用。

$ nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/master.tar.gz -p hello
downloading ‘https://github.com/NixOS/nixpkgs/archive/master.tar.gz’... [12850/0 KiB, 1404.5 KiB/s]
unpacking ‘https://github.com/NixOS/nixpkgs/archive/master.tar.gz’...
these paths will be fetched (0.04 MiB download, 0.19 MiB unpacked):
  /nix/store/s3vlmp0k8b07h0r81bn7lh24q2mqcai8-hello-2.10
fetching path ‘/nix/store/s3vlmp0k8b07h0r81bn7lh24q2mqcai8-hello-2.10’...

*** Downloading ‘https://cache.nixos.org/nar/1ax9cr6qqqqrb4pdm1mpqn7whm6alwp56dvsh5hpgs5g8rrpnjxd.nar.xz’ (signed by ‘cache.nixos.org-1’) to ‘/nix/store/s3vlmp0k8b07h0r81bn7lh24q2mqcai8-hello-2.10’...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100 40364  100 40364    0     0  40364      0  0:00:01  0:00:01 --:--:-- 37099


[nix-shell:~]$ which hello
/nix/store/s3vlmp0k8b07h0r81bn7lh24q2mqcai8-hello-2.10/bin/hello
  

pkgs / top-level / all-packages.nix在哪里?

NIX_PATH环境变量。 nixpkgs部分将指向您当前的存储库

$ echo $NIX_PATH 
nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels

我的all-packages.nix位于/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/pkgs/top-level/all-packages.nix