首页 > 解决方案 > 选择文件列表作为构建输入

问题描述

我想将包含在我的构建中的文件数量限制为src少数几个。直接将文件列表传递给srcsrcs不允许作为存档或目录。我找不到执行此操作的函数,并且builtins.filterSource似乎对我不起作用(不知道为什么 - 包含过滤文件的中间派生最终为空):

    files = [
        ./Cargo.toml
        ./Cargo.lock
        ./cpu.rs
    ];
    src = builtins.filterSource (p: t: builtins.elem p files) ./.;

注意:我正在使用rustPlatform构建器,但我认为这并不重要。

标签: nixnixpkgs

解决方案


filterSource将完整路径作为字符串传递。为了将列表的路径与它进行比较,您需要将字符串转换为路径:

$ cd /Users/fghibellini/code/nix
$ nix-instantiate --eval -E './a == "/Users/fghibellini/code/nix/a"'
false
$ nix-instantiate --eval -E './a == (/. + "/Users/fghibellini/code/nix/a")'
true

即以下代码应该可以正常工作:

files = [
    ./Cargo.toml
    ./Cargo.lock
    ./cpu.rs
];
src = builtins.filterSource (p: t: builtins.elem (/. + p) files) ./.;

您可以使用builtins.typeOfbuiltins.trace调试此类问题。


推荐阅读