# Jetbrains 包 vmoptFiles 替换出错

**URL:** https://discourse.nixosstag.fcio.net/t/jetbrains-vmoptfiles/53738
**Category:** 汉语 (Chinese)
**Created:** [October 1, 2024, 8:29am UTC](https://discourse.nixosstag.fcio.net/t/jetbrains-vmoptfiles/53738 "2024-10-01T08:29:13Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![jackyliu16](https://discourse.nixosstag.fcio.net/user_avatar/discourse.nixosstag.fcio.net/jackyliu16/32/9210_2.png) [@jackyliu16](https://discourse.nixosstag.fcio.net/u/jackyliu16)
#### Post date: [October 1, 2024, 8:29am UTC](https://discourse.nixosstag.fcio.net/t/jetbrains-vmoptfiles/53738/1 "2024-10-01T08:29:13Z")

</div>

我有一个相当复杂的问题。  
我想使用ja-netfilter破解我的nixos电脑上的 idea ，这里是[例子](https://github.com/LostAttractor/flake/blob/eedb0b1888f69f4998f57747c1a066c2183db930/user/programs/jetbrains.nix)

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

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

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

```nix
# 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 ==================================================================

```nix
 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 记录 ===

```auto
➜ 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](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](https://pastebin.com/wvDZqD3Z)

“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](https://github.com/NixOS/nixpkgs/blob/ead36718ebca64b22afc218944605a7391aed0d5/pkgs/applications/editors/jetbrains/bin/linux.nix#L63)时，有一个操作将vmopts放入vmoptsFile，最后这个变量将在wrapProgram --set-default ${vmoptsIDE}\_VM\_OPTIONS ${vmoptsFile}中使用。不知道为什么我 overrideAttrs 的这个变量无法被插入到 wrapPrograms 中去。还有在这种情况下，我如何调试它？  
我已经尝试在nix repl中加载flake，以及类似outputs. homemetration的东西。jacky@ANixOS但我不能进一步调试了。

```auto
> 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之后没找到任何相关的代码）。

---

<div class="post-metadata">

### Author: ![jackyliu16](https://discourse.nixosstag.fcio.net/user_avatar/discourse.nixosstag.fcio.net/jackyliu16/32/9210_2.png) [@jackyliu16](https://discourse.nixosstag.fcio.net/u/jackyliu16)
#### Post date: [October 12, 2024, 12:34am UTC](https://discourse.nixosstag.fcio.net/t/jetbrains-vmoptfiles/53738/2 "2024-10-12T00:34:57Z")

</div>

- 最终根据 [NikSOS](https://github.com/NikSneMC/NikSOS/) 提供的信息，采用了 override vmopt 并且通过 HM modules 将对应的操作包装成为一个“勉强”能说可复用的modules。
- 该 Ides 方法需要在特定 HM 版本（23.11以上）和特定软件包版本 2024.1.1 才被支持（见[软件包查询器](https://lazamar.co.uk/nix-versions/?channel=nixpkgs-unstable&package=idea-ultimate))
- 经过简单的包装，以及通过下面的方法简单的将 cfg.packages 挨个进行 override，将传入的结果挨个传入到 programs.jetbrains-remote 中。
- 

````auto
 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 的方式实现对于特定版本包的访问：
  - 添加inputs`nixpkgs-idea-20240101.url = "github:nixos/nixpkgs/57610d2f8f0937f39dbd72251e9614b1561942d8";`
  - 由于根据 nix-starter-config 的设计，overlays 分为三种不同的类别(additions, modification, unstable-packages) 分别在 overlays/default.nix 中定义，并且在特定配置文件中通过 `outputs.overlays.additions/.../...` 进行引入。
  - 此处考虑到虽然当前的模板分类不提供该方法，但是没有必要额外添加有关修订，因此简单将对于该包的复用合并到unstable-packages中。
  - 

```auto
nixpkgs-idea-20240101 = import inputs.nixpkgs-idea-20240101 {
	system = final.system;
	config.allowUnfree = true;
};

```

  - 然后根据既定规则在使用本模块的 HM 配置中引入 `outputs.homeManagerModules.jetbrains` 模块，并且传入对应的软件包。
  - 

```nix
  programs.jetbrains = {
    enable = true;
    packages = with pkgs.nixpkgs-idea-20240101.jetbrains; [ # Only support this version
      idea-ultimate
    ];
  };

```

- 最终，成功替换密钥认证为 3.jetbrains.in 服务器所提供的版本
