Jetbrains 包 vmoptFiles 替换出错

我有一个相当复杂的问题。
我想使用ja-netfilter破解我的nixos电脑上的 idea ,这里是例子

问题是,当我尝试使用overrideAttrs来替换原始vmoptsFile Attrs来实现相同的操作时,

xdg.configFile."JetBrains/PyCharm${pkgs.jetbrains.pycharm-professional.version}/pycharm64.vmoptions".text =vmoptions.

似乎无法从安装之后的 idea 文件中被正常检出,换句话说就是就算我用 overrideAttrs 替换了 jetbrains 中原始的 vmoptFiles,他还是无法作为一个参数被 installPhase 中的变量提取拿到。

# nixpkgs ... all-packages.nix
    vmopts = config.jetbrains.vmopts or null;

# nixpkgs ... jetbrains/bin/linux.nix
>   vmoptsFile = lib.optionalString (vmopts != null) (writeText vmoptsName vmopts); 
>   wrapProgram  "$launcher" \
      --prefix PATH : "${lib.makeBinPath [ jdk coreutils gnugrep which git ]}" \
      --suffix PATH : "${lib.makeBinPath [ python3 ]}" \
      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath extraLdPath}" \
      ${lib.concatStringsSep " " extraWrapperArgs} \
      --set-default JDK_HOME "$jdk" \
      --set-default ANDROID_JAVA_HOME "$jdk" \
      --set-default JAVA_HOME "$jdk" \
      --set-default JETBRAINS_CLIENT_JDK "$jdk" \
      --set-default ${hiName}_JDK "$jdk" \
      --set-default LOCALE_ARCHIVE "${glibcLocales}/lib/locale/locale-archive" \
      --set-default ${vmoptsIDE}_VM_OPTIONS ${vmoptsFile}

= 我修改的 modules ==================================================================

 let
   vmoptions = pkgs.writeText "jetbrains-with-ja-netfilter-vmoptions" ''
        ....
       -javaagent:${jetbra}/ja-netfilter.jar=jetbrains
    '';
 
  generateOverridePackage = 
    pkgName: pkgName.overrideAttrs { vmoptsFile = vmoptions; }
    ;
in {
  options = {
    programs.jetbrains = {
        enable = lib.options.mkEnableOption "jetbrains";
        packages = lib.mkOption {
          type = types.listOf types.package;
          default = [];
          description = "A list of packages need to enable ja-netfilter.";
          example = [ pkgs.jetbrains.idea-ultimate ];
        };
      }; 
  };
 
  config = lib.mkIf (cfg.enable && cfg.packages != []) {
    home.packages = map (pkg: generateOverridePackage pkg) cfg.packages;
  };

=== 我的 debug 记录 ===

➜  store ls -al | rg idea                                 
-r--r--r--    2 root root        2976 1970年 1月 1日 8r24sw9mn8v0ai5ag7zwlg3yk2dfahrc-ideaIU-2024.1.3.tar.gz.drv
dr-xr-xr-x    5 root root        4096 1970年 1月 1日 c121a12frhymyrvqwa1f0wk8mb9nlw0w-idea-ultimate-2024.1.3
-r--r--r--    6 root root        2975 1970年 1月 1日 h4nmsdxvzpk3l1w1m4xjrhg0fqbvjxda-0001-build-Make-includedir-properly-overrideable.patch
dr-xr-xr-x    5 root root        4096 1970年 1月 1日 idrrzfj4813ngy1iscbyj7hd83lzragv-idea-ultimate-2024.1.3
-r--r--r--    2 root root        7097 1970年 1月 1日 iq5idxhbf932i47y974ivifz3a5a3pqc-idea-ultimate-2024.1.3.drv
dr-xr-xr-x    3 root root        4096 1970年 1月 1日 jqpyjw3via0jmwdsx928fbhzdphhhagh-idea-ultimate.desktop
-r--r--r--    2 root root        2393 1970年 1月 1日 kha7v1rqr2c686g5cjna5sd4iwgr56kz-idea-ultimate.desktop.drv
-r--r--r--    1 root root        7153 1970年 1月 1日 mba4a9yp4ijwsr3pa9k0mkfs5ngkq150-idea-ultimate-2024.1.3.drv   

= START =====================================================================================
= Cmd: nix derivation show /nix/store/iq5idxhbf932i47y974ivifz3a5a3pqc-idea-ultimate-2024.1.3.drv
= Full: https://pastebin.com/wWykjUgT

“installPhase”: “runHook preInstall\n\nmkdir -p $out/{bin,$pname,share/pixmaps,share/icons/hicolor/scalable/apps}\ncp -a . $out/$pname\n[[ -f $out/$pname/bin/idea.png ]] && ln -s $out/$pname/bin/idea.png $out/share/pixmaps/idea-ultimate.png\n[[ -f $out/$pname/bin/idea.svg ]] && ln -s $out/$pname/bin/idea.svg $out/share/pixmaps/idea-ultimate.svg \\n && ln -s $out/$pname/bin/idea.svg $out/share/icons/hicolor/scalable/apps/idea-ultimate.svg\ncp /nix/store/65ffhzzhs29vwwz36akmxbpgznd9qisv-libdbm-233.13135.103/lib/libdbm.so $out/$pname/bin/libdbm.so\ncp /nix/store/jbyd0vlbqmlkkv2ckdl317s4mj7hbg0s-fsnotifier-233.13135.103/bin/fsnotifier $out/$pname/bin/fsnotifier\n\njdk=/nix/store/hv81cwj3p77z4z35rybjmkv7a3d8gymb-jetbrains-jdk-jcef-17.0.8-b1000.8/lib/openjdk\nitem=/nix/store/jqpyjw3via0jmwdsx928fbhzdphhhagh-idea-ultimate.desktop\n\nwrapProgram "$out/$pname/bin/idea.sh" \\n --prefix PATH : "/nix/store/hv81cwj3p77z4z35rybjmkv7a3d8gymb-jetbrains-jdk-jcef-17.0.8-b1000.8/bin:/nix/store/php4qidg2bxzmm79vpri025bqi0fa889-coreutils-9.5/bin:/nix/store/28gpmx3z6ss3znd7fhmrzmvk3x5lnfbk-gnugrep-3.11/bin:/nix/store/ln1ja3px23h21r64fw554h8a6227j9w3-which-2.21/bin:/nix/store/jxjzgz1p0hdqsg8k17ivw5mgcd6ffx9c-git-2.44.1/bin" \\n --suffix PATH : "/nix/store/7hnr99nxrd2aw6lghybqdmkckq60j6l9-python3-3.11.9/bin" \\n --prefix LD_LIBRARY_PATH : "/nix/store/lv6nackqis28gg7l2ic43f6nk52hb39g-zlib-1.3.1/lib" \\n --set M2_HOME "/nix/store/z22jfrphjm815sgrc13g23icxwr4zh89-apache-maven-3.9.6/maven" --set M2 "/nix/store/z22jfrphjm815sgrc13g23icxwr4zh89-apache-maven-3.9.6/maven/bin" \\n --set-default JDK_HOME "$jdk" \\n --set-default ANDROID_JAVA_HOME "$jdk" \\n --set-default JAVA_HOME "$jdk" \\n --set-default JETBRAINSCLIENT_JDK "$jdk" \\n --set-default IDEA_JDK "$jdk" \\n --set-default IDEA_VM_OPTIONS \n\nln -s "$out/$pname/bin/idea.sh" $out/bin/$pname\nrm -rf $out/$pname/plugins/remote-dev-server/selfcontained/\necho -e ‘#!/usr/bin/env bash\n’"$out/$pname/bin/remote-dev-server.sh"’ "$@"’ > $out/$pname/bin/remote-dev-server-wrapped.sh\nchmod +x $out/$pname/bin/remote-dev-server-wrapped.sh\nln -s "$out/$pname/bin/remote-dev-server-wrapped.sh" $out/bin/$pname-remote-dev-server\nln -s "$item/share/applications" $out/share\n\nrunHook postInstall\n”,

→ Seems --set-default IDEA_VM_OPTIONS \n\n illustrate vmoptsFile haven’t been recognition.

  "vmoptsFile": "/nix/store/iajb6vg8zw2hxlnlj4m3949r7kivqypk-vmoptions"

→ but what about this ? by the ways this file doesn’t existed.

= START =====================================================================================
= Cmd: nix derivation show /nix/store/mba4a9yp4ijwsr3pa9k0mkfs5ngkq150-idea-ultimate-2024.1.3.drv
= Full: ➜ dotfiles git:(master) ✗ nix derivation show /nix/store/mba4a9yp4ijwsr3pa9k0mk - Pastebin.com

“installPhase”: “runHook preInstall\n\nmkdir -p $out/{bin,$pname,share/pixmaps,share/icons/hicolor/scalable/apps}\ncp -a . $out/$pname\n[[ -f $out/$pname/bin/idea.png ]] && ln -s $out/$pname/bin/idea.png $out/share/pixmaps/idea-ultimate.png\n[[ -f $out/$pname/bin/idea.svg ]] && ln -s $out/$pname/bin/idea.svg $out/share/pixmaps/idea-ultimate.svg \\n && ln -s $out/$pname/bin/idea.svg $out/share/icons/hicolor/scalable/apps/idea-ultimate.svg\ncp /nix/store/65ffhzzhs29vwwz36akmxbpgznd9qisv-libdbm-233.13135.103/lib/libdbm.so $out/$pname/bin/libdbm.so\ncp /nix/store/jbyd0vlbqmlkkv2ckdl317s4mj7hbg0s-fsnotifier-233.13135.103/bin/fsnotifier $out/$pname/bin/fsnotifier\n\njdk=/nix/store/hv81cwj3p77z4z35rybjmkv7a3d8gymb-jetbrains-jdk-jcef-17.0.8-b1000.8/lib/openjdk\nitem=/nix/store/jqpyjw3via0jmwdsx928fbhzdphhhagh-idea-ultimate.desktop\n\nwrapProgram "$out/$pname/bin/idea.sh" \\n --prefix PATH : "/nix/store/hv81cwj3p77z4z35rybjmkv7a3d8gymb-jetbrains-jdk-jcef-17.0.8-b1000.8/bin:/nix/store/php4qidg2bxzmm79vpri025bqi0fa889-coreutils-9.5/bin:/nix/store/28gpmx3z6ss3znd7fhmrzmvk3x5lnfbk-gnugrep-3.11/bin:/nix/store/ln1ja3px23h21r64fw554h8a6227j9w3-which-2.21/bin:/nix/store/jxjzgz1p0hdqsg8k17ivw5mgcd6ffx9c-git-2.44.1/bin" \\n --suffix PATH : "/nix/store/7hnr99nxrd2aw6lghybqdmkckq60j6l9-python3-3.11.9/bin" \\n --prefix LD_LIBRARY_PATH : "/nix/store/lv6nackqis28gg7l2ic43f6nk52hb39g-zlib-1.3.1/lib" \\n --set M2_HOME "/nix/store/z22jfrphjm815sgrc13g23icxwr4zh89-apache-maven-3.9.6/maven" --set M2 "/nix/store/z22jfrphjm815sgrc13g23icxwr4zh89-apache-maven-3.9.6/maven/bin" \\n --set-default JDK_HOME "$jdk" \\n --set-default ANDROID_JAVA_HOME "$jdk" \\n --set-default JAVA_HOME "$jdk" \\n --set-default JETBRAINSCLIENT_JDK "$jdk" \\n --set-default IDEA_JDK "$jdk" \\n --set-default IDEA_VM_OPTIONS \n\nln -s "$out/$pname/bin/idea.sh" $out/bin/$pname\nrm -rf $out/$pname/plugins/remote-dev-server/selfcontained/\necho -e ‘#!/usr/bin/env bash\n’"$out/$pname/bin/remote-dev-server.sh"’ "$@"’ > $out/$pname/bin/remote-dev-server-wrapped.sh\nchmod +x $out/$pname/bin/remote-dev-server-wrapped.sh\nln -s "$out/$pname/bin/remote-dev-server-wrapped.sh" $out/bin/$pname-remote-dev-server\nln -s "$item/share/applications" $out/share\n\nrunHook postInstall\n”,

→ still not existed
but this time vmoptsFile existed with a name that i config.
“vmoptsFile”: “/nix/store/clqvbr7bvqhnlls3dwpjwwlkdi0winw5-jetbrains-with-ja-netfilter-vmoptions”
but the file still not existed.

= FINAL STATEMENT ===========================================================================

  1. 这俩 derivation 文件到底哪个是我 HM 里面用的?
  2. 当我查看nixpkgs source时,有一个操作将vmopts放入vmoptsFile,最后这个变量将在wrapProgram --set-default ${vmoptsIDE}_VM_OPTIONS ${vmoptsFile}中使用。不知道为什么我 overrideAttrs 的这个变量无法被插入到 wrapPrograms 中去。还有在这种情况下,我如何调试它?
    我已经尝试在nix repl中加载flake,以及类似outputs. homemetration的东西。jacky@ANixOS但我不能进一步调试了。
>   vmoptsFile = lib.optionalString (vmopts != null) (writeText vmoptsName vmopts); 
>    wrapProgram  "$launcher" \
      --prefix PATH : "${lib.makeBinPath [ jdk coreutils gnugrep which git ]}" \
      --suffix PATH : "${lib.makeBinPath [ python3 ]}" \
      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath extraLdPath}" \
      ${lib.concatStringsSep " " extraWrapperArgs} \
      --set-default JDK_HOME "$jdk" \
      --set-default ANDROID_JAVA_HOME "$jdk" \
      --set-default JAVA_HOME "$jdk" \
      --set-default JETBRAINS_CLIENT_JDK "$jdk" \
      --set-default ${hiName}_JDK "$jdk" \
      --set-default LOCALE_ARCHIVE "${glibcLocales}/lib/locale/locale-archive" \
      --set-default ${vmoptsIDE}_VM_OPTIONS ${vmoptsFile}
  1. 这个vmopts已经在pkgs/top-level/all-packages.nix和vmopts = config.jetbrains.vmopts或null;中定义了,我不知道如何使用这个(在STFW之后没找到任何相关的代码)。
  • 最终根据 NikSOS 提供的信息,采用了 override vmopt 并且通过 HM modules 将对应的操作包装成为一个“勉强”能说可复用的modules。
  • 该 Ides 方法需要在特定 HM 版本(23.11以上)和特定软件包版本 2024.1.1 才被支持(见软件包查询器)
  • 经过简单的包装,以及通过下面的方法简单的将 cfg.packages 挨个进行 override,将传入的结果挨个传入到 programs.jetbrains-remote 中。
  •  cfg = config.programs.jetbrains;
     patchIDEs = builtins.map (ide: ide.overrideAttrs {
        vmopts = ''
          --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
          --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
    
          -javaagent:${pkgs.ja-netfilter}/ja-netfilter.jar=jetbrains
        '';
      });
    ...
    config = lib.mkIf (cfg.enable && cfg.packages != []) {
    	programs.jetbrains-remote = {
    		enable = true;
    		ides = patchIDEs cfg.packages;
    	};
    	home.packages = (patchIDEs cfg.packages) ++ [pkgs.ja-netfilter];
    };
    
    
    ```
    
  • 然后在 flake 中通过引入 overlays 的方式实现对于特定版本包的访问:
    • 添加inputsnixpkgs-idea-20240101.url = "github:nixos/nixpkgs/57610d2f8f0937f39dbd72251e9614b1561942d8";
    • 由于根据 nix-starter-config 的设计,overlays 分为三种不同的类别(additions, modification, unstable-packages) 分别在 overlays/default.nix 中定义,并且在特定配置文件中通过 outputs.overlays.additions/.../... 进行引入。
    • 此处考虑到虽然当前的模板分类不提供该方法,但是没有必要额外添加有关修订,因此简单将对于该包的复用合并到unstable-packages中。
    • nixpkgs-idea-20240101 = import inputs.nixpkgs-idea-20240101 {
      	system = final.system;
      	config.allowUnfree = true;
      };
      
    • 然后根据既定规则在使用本模块的 HM 配置中引入 outputs.homeManagerModules.jetbrains 模块,并且传入对应的软件包。
    •   programs.jetbrains = {
          enable = true;
          packages = with pkgs.nixpkgs-idea-20240101.jetbrains; [ # Only support this version
            idea-ultimate
          ];
        };
      
  • 最终,成功替换密钥认证为 3.jetbrains.in 服务器所提供的版本