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";
    };
}

작은따옴표와 큰따옴표, 백슬래시, 개행 문자를 포함한 모든 별칭에서 작동하는 것 같습니다. 다른 사람이 더 간단한 것을 생각해 낼 수 있기를 바라지만 지금은 그게 전부입니다.

관련 정보