代码之家  ›  专栏  ›  技术社区  ›  s1n7ax

Nix派生错误:unpacker生成多个目录

  •  0
  • s1n7ax  · 技术社区  · 2 年前

    我有以下推导来使用nix-flake安装jdtls文件。

    {
      stdenv,
      fetchurl,
      gnutar,
      ...
    }: stdenv.mkDerivation {
      pname = "jdtls";
      version = "1.28.0";
    
      src = fetchurl {
        url = "https://www.eclipse.org/downloads/download.php?file=/jdtls/snapshots/jdt-language-server-1.28.0-202309211406.tar.gz";
        sha256 = "q9O44I8iLuNT/eD1IDVnoa1TQgzEIhl2YF40wD0y/sA=";
      };
    
      nativeBuildInputs = [ gnutar ];
    
      buildPhase = ''
        ls -l
        # mkdir -p $out/share
        # tar -xf $src -d $out/share
        # mv $out/share/bin $out
      '';
    }
    
    

    在tar.gz文件中,压缩文件的根目录中有多个目录,这导致 nix build 由于此错误而失败。

    文件夹:

    ❯ tar -tf /nix/store/1m9df2gmnak6rkmf71vfnk36g724p6zb-jdt-language-server-1.28.0-202309211406.tar.gz
    plugins/
    features/
    config_mac/
    config_mac_arm/
    config_win/
    config_linux/
    config_linux_arm/
    config_ss_mac/
    config_ss_mac_arm/
    config_ss_win/
    config_ss_linux/
    config_ss_linux_arm/
    bin/
    plugins/ch.qos.logback.classic_1.4.11.jar
    plugins/org.eclipse.jdt.junit.runtime_3.7.200.v20230627-0107.jar
    plugins/org.eclipse.lsp4j.jsonrpc_0.21.0.v20230517-2120.jar
    plugins/org.eclipse.osgi.services_3.11.100.v20221006-1531.jar
    plugins/com.google.guava_32.1.2.jre.jar
    

    错误

    ❯ nix log /nix/store/8r6v9l4825pxl76w7vy5nlv5drn6livs-jdtls-1.28.0.drv
    @nix { "action": "setPhase", "phase": "unpackPhase" }
    unpacking sources
    unpacking source archive /nix/store/1m9df2gmnak6rkmf71vfnk36g724p6zb-jdt-language-server-1.28.0-202309211406.tar.gz
    unpacker produced multiple directories
    

    是否解决此错误?

    0 回复  |  直到 2 年前
        1
  •  0
  •   kbmz    2 年前

    Nix对您下载的tar进行一些自动检测,假设它包含一个目录。要跳过它,您可以添加 sourceRoot = "."; 对你的推导是这样的:

    {
      stdenv,
      fetchurl,
      gnutar,
      ...
    }: stdenv.mkDerivation {
      pname = "jdtls";
      version = "1.28.0";
    
      src = fetchurl {
        url = "https://www.eclipse.org/downloads/download.php?file=/jdtls/snapshots/jdt-language-server-1.28.0-202309211406.tar.gz";
        sha256 = "q9O44I8iLuNT/eD1IDVnoa1TQgzEIhl2YF40wD0y/sA=";
      };
    
      sourceRoot = ".";
    
      nativeBuildInputs = [ gnutar ];
    
      buildPhase = ''
        ls -l
        # mkdir -p $out/share
        # tar -xf $src -d $out/share
        # mv $out/share/bin $out
      '';
    }
    

    你可以看到 in the default unpackPhase 它是如何出错的。

    推荐文章