【问题标题】:selecting a list of files as build input选择文件列表作为构建输入
【发布时间】:2019-05-25 19:08:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: nix nixpkgs


    【解决方案1】:

    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 来调试此类问题。

    【讨论】:

    • 该死!我又一次成为了普遍平等的受害者!我追踪它并没有想到类型......谢谢!你不认为这样的函数应该是库的一部分吗?
    • 我不明白你所说的这样的函数是什么意思,但我认为在这种情况下我会责怪字符串/路径的类似 JavaScript 的转换行为 - 使用起来相当混乱。即使在解决方案中:想要将字符串转换为路径? ...很明显,您只需将根路径与字符串连接起来:/
    • 我的意思是builtins.filterSource (p: t: builtins.elem(/. + p) files) ./.。但理想情况下,src 应该接受除了目录和档案之外的文件列表。
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2016-04-16
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多