【问题标题】:How evaluate external command to a Nix value?如何将外部命令评估为 Nix 值?
【发布时间】:2023-02-04 14:24:02
【问题描述】:

我想将文件解析为 flake.nix 内的 Nix 列表值。 我有一个 shell 脚本可以做到这一点

perl -007 -nE 'say for m{[(]use-package \s* ([a-z-0-9]+) \s* (?!:nodep)}xsgm' init.el 

如何在评估flake.nix时执行外部命令?

    programs.emacs = {
      enable = true;
      extraConfig = builtins.readFile ./init.el;
      extraPackages = elpa: (shellCommandToParseFile ./init.el); # Runs shell script
   };

【问题讨论】:

  • 如果你想使用以这种方式生成的 Nix 代码,你必须做一些叫做“从派生导入”的事情。在编写更多使用它的代码之前,您可能想了解人们试图摆脱这种做法的原因。
  • 顺便说一句,你如何获得 init.el 的有效 shebang?如果它是 elisp,我假设您正在使用 emacs 运行它?你能提供一个命令行供我在我的答案中使用吗? (自从 emacs 成为我的日常驱动程序以来已经很多年了)。
  • ...它是perl脚本?为什么在 perl 脚本上使用 .el 扩展名?但我很高兴看到它不进行任何网络访问;这让事情变得容易多了。

标签: nix


【解决方案1】:

您可以按照在 Nix 中执行任何其他不纯步骤的相同方式运行 ./init.el:使用推导。

这可能看起来有点像:

programs.emacs = {
  enable = true;
  extraConfig = builtins.readFile ./init.el;
  extraPackages =
    let
      packageListNix = pkgs.runCommand "gen-el-pkgs.nix" { script = ./init.el; } ''
        ${pkgs.emacs}/bin/emacs --script "$script" >"$out"
      '';
    in import "${packageListNix}";
};

也就是说,请注意,与任何其他推导(既不是固定输出也不是明显不纯)一样,这发生在没有网络访问权限的沙箱内。如果 init.el 的目标是连接到网络资源,您应该将其输出提交到您的存储库。薄片的主要设计目标是消除杂质;它们不适合不纯的推导。

【讨论】:

    猜你喜欢
    • 2017-07-06
    • 2021-06-07
    • 1970-01-01
    • 2013-05-21
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多