Configuration.nixのディレクトリパスから拡張子なしでファイルコンテンツマッピングを取得する方法は?

Configuration.nixのディレクトリパスから拡張子なしでファイルコンテンツマッピングを取得する方法は?

基本的に引っ張りたいです。マイconfig.programs.config.aliasアイテム別々のファイルに分割し.bash、構成を構築するときに動的に読み込みます。現在の構成の代表的なサブセット:

{
  programs.git = {
    config = {
      alias = {
        aliases = "!git config --get-regexp '^alias\.' | cut --delimiter=. --fields 2-";
        git = "!git";
        st = "status";
      };
    };
  };
}

すべての!git項目は別々のシェルスクリプトとして提供されるのが最善です。これにより、Gitエイリアス構成に統合する前にリントし、フォーマットして実行して有効であることを確認できます。

答え1

注釈付きバージョンこれまでのソリューション:

{
  config.git.config.alias =
    (
      lib.attrsets.mergeAttrsList ( # Change from a list of attribute sets to a single attribute set
        map (
          path: {
            # Create a [filename without extension as alias name] to [alias value] attribute set
            "${lib.removeSuffix ".bash" (baseNameOf path)}" =
              "!\"" # `!`denotes that this alias runs a command rather than a Git subcommand; quote to simplify escaping
              + builtins.replaceStrings ["\n"] ["; "] ( # Change from readable multi-line scripts to a single line
                lib.escape ["\"" "\\"] ( # Escape backslash and double quotes to fit Git configuration language
                  lib.removeSuffix "\n" ( # Remove newline at EOF
                    builtins.readFile path
                  )
                )
              )
              + "\"";
          }
        ) (
          lib.filesystem.listFilesRecursive ./includes/git-aliases
        )
      )
    )
    // {
      st = "status";
    };
}

一重引用符と二重引用符、バックスラッシュ、改行文字など、すべてのエイリアスで動作するようです。他の人がもっと簡単なことを思い出すことができることを願っていますが、今はそれがすべてです。

関連情報