nix包管理器

时间:2020-03-21 11:43:54  来源:igfitidea点击:

本教程介绍了如何使用NIX包管理器进行包管理操作,例如安装,删除,更新和升级软件包。
如果我们还没有安装NIX包管理器,请参阅我们的上一个教程"NIX - Linux和UNIX的强大包管理器"。

正如我们所知道的,我们不需要成为root或者sudo用户来使用nix进行所有包管理操作。

nix包管理器入门

nix有很多命令。
包管理的主要命令是nix-eng。
此命令用于列出,安装,更新,回滚,删除查询包。
让我们通过示例查看一些命令。

更新NIX频道

NIX Channel只是一个URL,它指向包含一组NIX表达式和列表的位置。
默认情况下,安装NIX时,NIXPKGS通道将自动添加到"订阅"通道列表中。

要保持与NIX频道的最新日期,请运行以下命令:

$nix-channel --update

示例输出:

downloading Nix expressions from ‘https://d3g5gsiof5omrk.cloudfront.net/nixpkgs/nixpkgs-17.09pre108299.ec9a23332f/nixexprs.tar.xz’...
downloading ‘https://d3g5gsiof5omrk.cloudfront.net/nixpkgs/nixpkgs-17.09pre108299.ec9a23332f/nixexprs.tar.xz’... [8335/8656 KiB, 206.5 KiB/s]
unpacking channels...

我们还可以手动将频道添加到系统,如下所示。

$nix-channel --add https://nixos.org/channels/nixpkgs-unstable

订阅(添加)频道后,不要忘记更新通道以获取使用命令的最新可用的NIX表达式:

$nix-channel --update

要删除频道,请运行:

$nix-channel --remove nixpkgs

搜索/查询可用包

要查看订阅频道中的可用包列表,请运行:

$nix-env -qa

上述命令的示例输出将是:

2048-in-terminal-2014-01-15
2bwm-0.2
389-ds-base-1.3.5.15
3dpong-0.5
4store-1.1.6
8086tiny-1.25
90secondportraits-1.01b
915resolution-0.5.3
9pfs
a2jmidid-8
a2ps-4.14
a52dec-0.7.4p4
aacgain-1.9.0
aacskeys-0.4.0e
aalib-1.4rc5
abc-verifier-20150818
abcde-2.7.2
abcl-1.4.0
[...]

其中"-q"表示查询操作。
"-a"表示所有可用(即,可安装的)包。

我们可以查询特定包,如下所示。

$nix-env -qa chromium

输出:

chromium-58.0.3029.110

此外,我们可以使用以下命令搜索特定包。

$nix-env -qaP | grep python3-3

示例输出:

nixpkgs.python33 python3-3.3.6
nixpkgs.python33Full python3-3.3.6
nixpkgs.python34 python3-3.4.6
nixpkgs.python34Full python3-3.4.6
nixpkgs.python35 python3-3.5.3
nixpkgs.python35Full python3-3.5.3
nixpkgs.python3Full python3-3.6.1
nixpkgs.python36Full python3-3.6.1
nixpkgs.python3 python3-3.6.1

要列出所有已安装的软件包,只需运行:

$nix-env -q

也可以查看可用包的状态。
看下面的例子。

$nix-env -qas gcc

示例输出:

IPS gcc-5.4.0

其中"i"表示安装了指定的包,"p"表示软件包存在于我们的系统上,"s"表示是否有所谓的包替代包。

我们可以使用正则表达式查询/列表包。
以下是正则表达式的一些示例。

匹配包名称铬和任何版本。

Chromium-58.0.

匹配包名称铬和版本58.0。

例子:

$nix-env -qa chromium-58.0

gtk \ +

匹配包名称gtk +。
必须使用反斜杠逃离+字符以防止它被解释为量码,并且反斜杠必须使用另一个反斜杠进行逃脱,以确保shell将其传递。


*

匹配任何包名称。
这是大多数命令的默认值。

'。
*压缩。
*'

匹配包含字符串zip的任何包名称。
注意点:'* zip '不起作用,因为在正则表达式中,字符被解释为量程。

'。
*(Firefox |铬)。
*'

匹配包含字符串Firefox或者Chromium的任何包名称。

安装包

正如我在上一个教程中提到的,所有包都将存储在NIX存储中,通常是目录/nix /商店。

要安装包,请运行:

$nix-env --install gcc

或者,

$nix-env -i gcc

上面的命令将安装最新的可用GCC包。

上述命令的示例输出将是:

installing ‘gcc-5.4.0’
download-from-binary-cache.pl: still waiting for ‘https://cache.nixos.org/zx0i63k1qswsfjj3kxhwk1vqa9i5ys8i.narinfo’ after 5 seconds...
download-from-binary-cache.pl: still waiting for ‘https://cache.nixos.org/dyj2k6ch35r1ips4vr97md2i0yvl4r5c.narinfo’ after 5 seconds...
download-from-binary-cache.pl: still waiting for ‘https://cache.nixos.org/g25gnfmd8i392ahiip9nwfv80szqbkcs.narinfo’ after 5 seconds...
these paths will be fetched (38.94 MiB download, 150.45 MiB unpacked):
 /nix/store/7n45x3waczv1smsdkax2dy4j2zhbfk82-glibc-2.25-bin
 /nix/store/dyj2k6ch35r1ips4vr97md2i0yvl4r5c-gcc-5.4.0
 /nix/store/f05gsfcilsczwic8aga0cgl0sygbw5lc-zlib-1.2.11
 /nix/store/f111ij1fc83965m48bf2zqgiaq88fqv5-glibc-2.25
 /nix/store/g25gnfmd8i392ahiip9nwfv80szqbkcs-gcc-5.4.0-man
 /nix/store/n5k6yqf81jp4qbay2czaqciimhxikcq8-linux-headers-4.4.10
 /nix/store/vrr9maj9lqj2xwndlx3kh07vhnc111i2-glibc-2.25-dev
 /nix/store/xfrkm34sk0a13ha9bpki61l2k5g1v8dh-gcc-5.4.0-lib
 /nix/store/zx0i63k1qswsfjj3kxhwk1vqa9i5ys8i-gcc-5.4.0-info
fetching path ‘/nix/store/zx0i63k1qswsfjj3kxhwk1vqa9i5ys8i-gcc-5.4.0-info’...
[...]
fetching path ‘/nix/store/dyj2k6ch35r1ips4vr97md2i0yvl4r5c-gcc-5.4.0’...
*** Downloading ‘https://cache.nixos.org/nar/00y98z7i8a1a8d3nkv4dbbfbwwvznccbvmjdhaay0gqc0gfgb020.nar.xz’ to ‘/nix/store/dyj2k6ch35r1ips4vr97md2i0yvl4r5c-gcc-5.4.0’...
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 29.5M 100 29.5M 0 0 373k 0 0:01:21 0:01:21 --:--:-- 365k
building path(s) ‘/nix/store/nxx0bfg3n685fl0l3m2gbjqannh0wb9i-user-environment’
created 78 symlinks in user environment

让我们检查是否已安装GCC或者不使用命令:

$gcc -v

示例输出:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/nix/store/dyj2k6ch35r1ips4vr97md2i0yvl4r5c-gcc-5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: 
Thread model: posix
gcc version 5.4.0 (GCC)

正如我们在上面的输出中注意到,GCC一直处于名为"dyj2k6ch35r1ips4vr97md2i0yvl4vr97md2i0yvl4r5c-gcc-5.4.0"的子目录中/nix/store。
其中我们将Dyj2k6ch35R1IPS4VR97MD2i0yvl4R5C-GCC-5.4.0称为唯一标识符。
此子目录包含所有必需的GCC包的依赖项和库。

无需安装测试包

NIX包管理器的另一个值得注意的功能是我们可以在不将其安装在系统上的情况下测试包。
请参阅以下教程以知道如何在不安装它的情况下测试包。

  • 如何在不将其安装在Linux中的情况下测试包

升级软件包

要将包升级到下一个可用版本,刚刚运行:

$nix-env --upgrade vim

要不就:

$nix-env -u vim

如果有"较新"版本,则上述命令只会升级Vim包。

此外,我们还可以通过运行以下命令一次升级所有已安装的软件包:

$nix-env -u

回滚包

我们安装了一个包,但它没有用或者不正常工作。
我们需要相同包的较低版本。
你会怎么做?
简单的。
只需使用以下命令回滚到上一个工作版本:

$nix-env --rollback

卸载软件包

要卸载包,请运行:

$nix-env -e gcc

上面的命令将卸载来自系统名为GCC的包。

我们可以删除多个包,如下所示。

$nix-env -e gcc vim

示例输出:

uninstalling ‘vim-8.0.0442’
uninstalling ‘gcc-5.4.0’
building path(s) ‘/nix/store/mxpikbq3l08379h8ik8mrj3fcw6mh6y4-user-environment’
created 6 symlinks in user environment

删除未使用的软件包

卸载包后,它不会从nix存储(i.e/nix/store /目录)中删除。
仅,符号链接将从个人资料中删除。

要实际删除卸载的软件包,请运行:

$nix-collect-garbage -d

示例输出:

finding garbage collector roots...
deleting garbage...
deleting ‘/nix/store/s4jr4dc9gghldr3xza23rw0gm9kp21kl-nix-prefetch-scripts.drv’
deleting ‘/nix/store/km2gyzlvs9vkrr52wxfyhinv4r52ksrj-nix-prefetch-bzr.drv’
deleting ‘/nix/store/7mi73sdc1p349vmpb5nyxsrv8ayk5hly-bazaar-2.7.0.drv’
[...]
deleting ‘/nix/store/8ckmcs9hx1qm0yxdnv892vrvx49zm1sq-setup-hook-2.0.sh’
deleting ‘/nix/store/trash’
deleting unused links...
note: currently hard linking saves -0.00 MiB
1447 store paths deleted, 12.65 MiB freed

我们应该定期运行此命令以摆脱来自系统的未使用的软件包。