如何使用nix search命令搜索Haskell包?解决搜索无结果问题
如何用
nix search搜索Haskell包? 当然可以用nix search查找Haskell包!默认搜不到只是因为Nixpkgs里的haskellPackages属性集默认没开启递归搜索,下面我一步步给你讲清楚配置方法和验证步骤:
为什么默认搜不到?
Nixpkgs里的haskellPackages是一个包含所有Haskell包的大属性集,但默认情况下,Nix不会自动遍历这类嵌套属性集的子项。而recurseIntoAttrs这个函数的作用就是告诉Nix:“把这个属性集里的所有子包都暴露出来,允许搜索工具遍历到它们”——这就是你在IRC日志里看到的解决方案的核心。
两种配置方式
方式一:临时命令行使用(无需修改配置)
如果你只是想临时测试一下,可以直接在nix search命令里内嵌overlay:
# 直接搜索关键词,比如aeson nix search --expr 'with import <nixpkgs> { overlays = [ (self: super: { haskellPackages = super.recurseIntoAttrs super.haskellPackages; }) ]; }' aeson # 或者指定搜索haskellPackages下的包,更精准 nix search --expr 'with import <nixpkgs> { overlays = [ (self: super: { haskellPackages = super.recurseIntoAttrs super.haskellPackages; }) ]; }' haskellPackages.ghcid
执行后就能看到对应的包结果了,而且会利用Nix的缓存,比旧的nix-env命令快很多。
方式二:永久配置(一劳永逸)
如果你想每次用nix search都能直接搜到Haskell包,可以把overlay写到用户配置里:
- 创建overlay目录(如果不存在的话):
mkdir -p ~/.config/nixpkgs/overlays - 在该目录下新建一个配置文件,比如
haskell-search.nix:self: super: { haskellPackages = super.recurseIntoAttrs super.haskellPackages; } - 保存文件后,直接执行
nix search ghcid或者nix search aeson,就能看到对应的Haskell包结果了!
验证配置是否生效
比如搜索ghcid,你应该会看到类似这样的输出:
haskellPackages.ghcid- Very fast GHCi based IDE
这就说明配置成功了,以后不管搜哪个Haskell包,直接用nix search加包名就行,速度比旧方法快很多,还能享受缓存带来的便利。
内容的提问来源于stack exchange,提问作者Hjulle
相关产品推荐
相关产品推荐

