ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

nixpkgs 中 JetBrains IDE 的构建、插件注入与自动化更新实战指南

nixpkgs 中 JetBrains IDE 的构建、插件注入与自动化更新实战指南 包管理器操作系统【免费下载链接】nixpkgsNix Packages collection NixOS项目地址https://gitcode.com/GitHub_Trending/ni/nixpkgs点击查看免费下载本篇技术指南以 nixpkgs 仓库中 pkgs/applications/editors/jetbrains/readme.md 为骨架系统讲解 JetBrains 全家桶 IDEIntelliJ IDEA、PyCharm、CLion、WebStorm 等在 Nix/NixOS 中的打包思路、插件注入机制、构建测试方式与自动化升级流程。读完本文你将掌握如何在 Nix 配置中安装任意 JetBrains IDE、如何用addPlugins为 IDE 注入第三方插件含普通 zip 插件与单 JAR 插件两种形态以及如何借助updater/main.py与updateInfo.json把仓库内的 IDE 包升级到最新版本并理解背后的构建器builder与测试用例实现原理。目录结构与职责划分JetBrains 相关打包代码集中在pkgs/applications/editors/jetbrains/目录下仓库以一个目录承载全套 JetBrains 产品的方式组织各 IDE 的具体包定义则迁移到了pkgs/by-name/规范目录。JDK 相关构建表达式位于pkgs/development/compilers/jetbrains-jdk。目录内部的关键组成均可在仓库中直接查看builder/default.nixmkJetBrainsProduct构建器入口按平台分派到linux.nix或darwin.nixbuilder/linux.nix 与 builder/darwin.nixLinux/macOS 平台专属构建逻辑plugins/default.nixaddPlugins插件注入实现plugins/tests.nix插件构建与存储测试updater/main.py 及updater/updateInfo.jsonIDE 版本自动化更新hooks/、patches/、source/辅助 hook、补丁与源码构建相关资源default.nix统一导出上述构建器、hook 与插件命名空间。从 default.nix 可以看到jetbrains属性集对外暴露四个核心构件mkJetBrainsProduct二进制 IDE 构建器、mkJetBrainsSource源码 IDE 构建器、cythonDebugSpeedupsHook/sharedLibsHook辅助 hook、以及plugins插件工具集。此外在config.allowAliases开启时还保留了jetbrains.clion、jetbrains.idea、jetbrains.pycharm等历史别名并针对已停产的 Aqua、Writerside 以及被合并的 IntelliJ IDEA Community / PyCharm Community 提供了明确的报错提示引导用户改用jetbrains.idea-oss或jetbrains.pycharm-oss。IDE 包清单与安装方式所有 IDE 的包定义都遵循 nixpkgs 的 by-name 规范存放。原文档给出了完整的 IDE 名称与包位置对照表这里完整继承并保持可点击IDE 名称包位置CLionpkgs/by-name/cl/clion/package.nixDataGrippkgs/by-name/da/datagrip/package.nixDataSpellpkgs/by-name/da/dataspell/package.nixGatewaypkgs/by-name/je/jetbrains-gateway/package.nixGoLandpkgs/by-name/go/goland/package.nixIntelliJ IDEApkgs/by-name/in/intellij-idea/package.nixIntelliJ IDEA (Open Source)pkgs/by-name/in/intellij-idea-oss/package.nixMPSpkgs/by-name/je/jetbrains-mps/package.nixPhpStormpkgs/by-name/ph/phpstorm/package.nixPyCharmpkgs/by-name/py/pycharm/package.nixPyCharm (Open Source)pkgs/by-name/py/pycharm-oss/package.nixRiderpkgs/by-name/ri/rider/package.nixRubyMinepkgs/by-name/ru/ruby-mine/package.nixRustRoverpkgs/by-name/ru/rust-rover/package.nixWebStormpkgs/by-name/we/webstorm/package.nix以 IntelliJ IDEA 包 为例一个典型 IDE 包定义包含平台 URL 与哈希按x86_64-linux、aarch64-linux、aarch64-darwin三平台分别给出fetchurl的url与 SRI 格式hash产品元数据pname、wmClass桌面窗口类、product完整产品名、productShort如IDEA版本与构建号version与buildNumber且被夹在update-script-start: version/update-script-end: version标记之间后文详解JDK 选择Darwin 平台自带捆绑 JDKLinux 平台则使用jetbrains.jdk-no-jcef通过lib.meta.availableOn判断运行时环境extraLdPath注入zlibextraWrapperArgs为启动脚本设置M2_HOME、M2等 Maven 环境变量构建输入Linux 下追加lldb、musl等meta 信息主页、描述、维护者、团队、unfree许可证及源码来源类型Darwin 为binaryNativeCode其余为binaryBytecode。安装任意 IDE 的方式与普通 nixpkgs 包一致例如在environment.systemPackages中加入pkgs.jetbrains.idea别名或pkgs.intellij-ideaby-name 包名也可在 home-manager 中使用pkgs.pycharm、pkgs.clion等。构建器mkJetBrainsProduct 与平台差异构建器分派逻辑builder/default.nix 通过stdenv.hostPlatform.isDarwin决定使用 darwin.nix 还是 linux.nix并利用lib.extendMkDerivation统一注入公共逻辑。构建器还自动把product、productShort、buildNumber、wmClass、jetbrains-libdbm、fsnotifier、extraLdPath、extraWrapperArgs等参数从mkDerivation中排除避免透传给底层 stdenv。mkJetBrainsProduct还会自动为每个 IDE 附加两个 passthru 能力updateScript指向../updater/main.py即 IDE 包可通过标准nixpkgs-update机制触发版本更新tests.plugins调用 plugins/tests.nix 并传入ide finalAttrs.finalPackage实现每个 IDE 自带插件构建回归测试。Linux 构建细节以 linux.nix 为例builder/linux.nix 展现了打包一个 JetBrains IDE 的核心工程要点构建输入自动补充alsa-lib、at-spi2-atk、at-spi2-core、cairo、cups、dbus、fontconfig、libGL、libgbm、nspr、nss、pango、udev等图形栈与系统库nativeBuildInputs自动加入autoPatchelfHook、makeWrapper、patchelf、unzip。postPatch 处理删除捆绑的jbr目录并软链到 Nix 提供的 JDK home远程开发后端依赖此结构应用jetbrains-remote-dev.patch删除remote-dev-server/selfcontained以避免其目录进入无关二进制 RPATH对libjcef.so强制--set-rpath $ORIGIN防止 autoPatchelfHook 沿.RPATH 误解析最后把e2fsprogs、libnotify、libsecret、udev的库路径以-Djna.library.path...追加进.vmoptions文件。installPhase复制程序到$out/$pname安装图标与桌面项makeDesktopItem拷贝jetbrains-libdbm的libdbm.so与fsnotifier二进制随后用wrapProgram对启动器做全面包装——前缀 PATH 注入coreutils、git、gnugrep、JDK、which后缀追加python3设置JDK_HOME、ANDROID_JAVA_HOME、JAVA_HOME、JETBRAINS_CLIENT_JDK、${HI}_JDK与LOCALE_ARCHIVE等默认环境变量并支持extraWrapperArgs的透传最后生成$out/bin/$pname软链与remote-dev-server-wrapped.sh包装脚本暴露$pname-remote-dev-server命令。preFixup把${jdk.home}/lib加入 autoPatchelf 搜索路径确保可执行文件与动态库能找到 Nix 化 JDK。meta 补全自动设置mainProgram pnamepreferLocalBuild对非自由许可证产品返回true。桌面项与虚拟机选项Linux 构建器使用makeDesktopItem生成桌面入口exec使用meta.mainProgramstartupWMClass取自各包的wmClass如 IntelliJ IDEA 的jetbrains-idea便于窗口管理器识别与图标匹配。vmopts参数允许从外部传入 JVM 选项文件内容vmopts ? null构建器据此生成pname64.vmoptions并设置${VMOPTS}_VM_OPTIONS环境变量WebStorm 被特殊映射为WEBIDE前缀。原文档特别提醒meta 属性会被用于生成 Linux 桌面项改动 meta 可能引发大量重建。为 IDE 注入插件addPlugins 机制基本用法原文档给出的核心用法是pkgs.jetbrains.plugins.addPlugins pkgs.intellij-idea [ ideavim ]即把 IDE 包与一组插件包传入addPlugins得到内置插件的新 IDE 包。插件列表中的每个元素必须是提供插件目录内容或单个.jar可执行文件的 derivation原文档英文原文为 drvs giving the directory contents of the plugin or a single.jar(executable)。从 plugins/default.nix 源码看addPlugins的输入校验相当严格通过lib.throwIfNot (lib.isDerivation plugin)强制要求传入 derivation若传入插件名或 id 字符串会直接抛错并提示 addPlugins no longer supports resolving plugins by name or id strings. Please supply a derivation instead。这表示现代 nixpkgs 只接受构建好的插件包不再内置插件仓库查询能力。底层实现原理addPlugins最终生成一个stdenv.mkDerivation其关键步骤源码在 plugins/default.nixsrc ide以 IDE 包为输入复制整个 IDE 到$out并解除写保护删除plugins/plugin-classpath.txt避免残留旧路径遍历传入插件若产出是单个.jar直接软链进rootDir/plugins/否则软链整个插件目录用substituteInPlace把 IDE 启动脚本中引用原 store 路径${ide}的地方替换为$out保证插件被正确解析Darwin 平台额外挂载darwin.autoSignDarwinBinariesHook因为 buildPhase 重写了二进制会破坏代码签名需要重新签名Linux 平台挂载autoPatchelfHook并保证glib进入buildInputsdisallowedReferences [ ide ]防止产物意外引用未注入插件的原 IDE。插件包编写示例原文档给出两类插件 derivation 的完整写法这里原样继承普通插件zip 目录形态插件发布为 zip 包解压后包含插件目录结构用fetchzip获取fetchzip { url https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip; hash sha256-JShheBoOBiWM9HubMUJvBn4H3DnWykvqPyrmetaCZiM; }单 JAR 插件插件本体就是单个可执行 JAR用fetchurl并设置executable truefetchurl { executable true; url https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar; hash sha256-DobKZKokueqq0z75d2Fo3BD8mWX9LpGdT9C7Eu2fHc; }两条示例中的 URL 与哈希均取自 plugins/tests.nix 中的测试用例NixIDEA 与 WakaTime可实际用于验证流程。官方不打包插件第三方补位Nixpkgs 官方不维护 JetBrains 插件集合。原文档明确建议使用社区维护的第三方来源如 nix-community 的nix-jetbrains-plugins获取插件包再交给addPlugins注入。需要特别注意的是某些插件若以与 NixOS 不兼容的方式打包例如依赖绝对路径或特定系统库注入后可能无法正常工作此时可以尝试绕过 Nix 打包直接从 IDE 内建的插件市场安装。插件构建与存储测试plugins/tests.nix 提供了两个由 default.nix 暴露的测试入口原文档已列出构建jetbrains.plugins.tests.empty对全部 15 个 IDE 依次执行addPlugins ide [ ]空插件列表验证注入插件的构建流程本身不会破坏任何 IDE 的产物。这是回归测试重点不是插件内容而是流程正确性。源码中通过symlinkJoin汇总所有改造后的 IDE若只想测单个 IDE可传入ide参数如jetbrains.plugins.tests.empty.override { ide pkgs.clion; }。构建jetbrains.plugins.tests.stored-correctly对每个 IDE 注入 NixIDEA普通 zip 插件与 WakaTime单 JAR 插件两种形态然后在runCommand脚本中分别验证普通插件被正确链接find -L $ide/*/plugins -type f -iname NixIDEA-*.jar | grep .单 JAR 插件被直接软链到plugins目录且链接有效test -f $(readlink $PATH_TO_LINK)。该测试刻意忽略插件与 IDE 的版本兼容性注释说明we ignore IDE compatibility here只关心插件是否被放置在 IDE 能发现的位置因此无需为每个 IDE 维护配套插件版本。自动化更新 IDEupdater/main.py 全解析运行方式与命令行参数原文档给出的更新入口是./updater/main.py该脚本会同时更新二进制 IDE 与源码 IDE更新完成后即可提交改动。运行前需在pkgs/applications/editors/jetbrains/目录下执行或配合--nixpkgs-root指定仓库根目录。从 updater/main.py 源码可看到完整的命令行参数参数作用ide位置参数指定要更新的 IDE 的pname不传则读取UPDATE_NIX_PNAME环境变量再没有则更新全部 IDE--nixpkgs-rootnixpkgs 仓库根目录默认自动探测--no-bin跳过二进制 IDE 更新--no-src跳过源码 IDE 更新--no-maven-deps跳过源码 IDE 的 Maven 依赖更新--dry-run只分析不写文件--old-version手动指定旧版本号默认读UPDATE_NIX_OLD_VERSION若新版本与旧版本一致则提前退出不做改动脚本主体流程为解析参数构造UpdaterConfig→ 读取 updater/updateInfo.json → 用VersionFetcher向 JetBrains 渠道获取最新版本信息 → 逐个 IDE 比较版本 → 二进制 IDE 走run_bin_update源码 IDE 走run_src_update失败则整体以非零退出码结束。版本信息来源与 URL 模板updater/updateInfo.json 为每个 IDE 定义了 JetBrains 更新渠道如IU-RELEASE-licensing-RELEASE、PY-RELEASE-licensing-RELEASE、GO-RELEASE-licensing-RELEASE等以及三平台的下载 URL 模板模板中的{version}会被脚本替换成最新版本号。例如 IntelliJ IDEA 的模板为x86_64-linux:https://download.jetbrains.com/idea/ideaIU-{version}.tar.gzaarch64-linux:https://download.jetbrains.com/idea/ideaIU-{version}-aarch64.tar.gzaarch64-darwin:https://download.jetbrains.com/idea/ideaIU-{version}-aarch64.dmg注意intellij-dea-oss与pycharm-oss在 updateInfo.json 中urls为空对象即它们不通过二进制渠道更新OSS 版本走源码构建路线脚本对源码 IDE 会忽略无 URL 错误ignore_no_url_erroride.is_source。更新脚本标记markers更新脚本通过扫描 Nix 文件中的固定注释标记来定位待替换内容并可能替换标记之间的任何内容。原文档明确列出三类标记仓库中 intellij-idea 包 就是活生生的例子update-script-start: urls/update-script-end: urls二进制 IDE 的三平台 URL 与哈希表update-script-start: version/update-script-end: version版本号与构建号如version 2026.2.3; buildNumber 262.10968.63;update-script-start: source-args/update-script-end: source-argsmkJetBrainsSource的参数源码 IDE 用。重要警告位于这些标记之间的任何注释或手工改动在脚本运行时都会被删除。因此在版本/URL 区块内不要放置需要保留的自定义内容。IDE 包的 passthru.updateScript原文档指出每个 IDE 都配置了passthru.updateScript指向./updater/main.py脚本通过UPDATE_NIX_*环境变量接收参数。这一机制由 builder/default.nix 统一注入updateScript ../updater/main.py意味着用户也可以借助 nixpkgs 的通用更新框架如nix-update的 updateScript 支持触发单包更新而脚本内部则接受UPDATE_NIX_PNAME、UPDATE_NIX_OLD_VERSION等环境变量来约束更新目标。如何向 nixpkgs 新增一个 IDE原文档给出了新增 IDE 的三步流程仓库结构可逐一印证在/pkgs/by-name/...新增 derivation仿照 intellij-idea/package.nix 编写调用jetbrains.mkJetBrainsProduct给出 pname、product、版本、三平台 URL/哈希与 meta同时把包加入 default.nix 的顶层传入参数与 by-name 集合在updater/updateInfo.json添加 URL 模板条目为新产品提供渠道名与各平台下载模板参考上文模板格式更新 readme.md 顶部的 IDE packages 表格保持文档与仓库同步方便其他维护者检索。此外plugins/tests.nix 中的ides列表也应同步加入新产品以保证插件注入测试覆盖全部 IDE。源码构建与已知待办事项除二进制分发包外仓库还通过mkJetBrainsSource定义于 source/build.nix 对应目录支持从源码构建部分 IDE相关辅助数据包括 source/jps_repo.nix、source/brokenPlugins.json 以及 patches/ 下的一系列补丁如no-download.patch、kotlinc-path.patch、bump-jackson-core-in-source.patch、disable-sbom-generation.patch。原文档的 TODO 列表揭示了当前实现的边界与演进方向这里如实呈现清理 IDE 包中残留的overrideAttrs关联 PR 讨论见仓库历史在条件成熟时用libxcrypt替换libxcrypt-legacy让jetbrains-remote-dev.patch更简洁确认 IDEA 是否仍需要extraLdPath源码构建方面改用 Bazel 构建、移除jps-bootstrap输出 jar 的时间戳、补全自动化更新脚本、优先复用 nixpkgs 内构建的 jar如 Kotlin、让configurePhase尊重$NIX_BUILD_CORES、使产物 tar.gz 子目录使用发布号如 2023.2.2而非构建号如 232.9921.89JDK 方面支持 darwin 构建、尝试复用 nixpkgs 的 chromium 产物支持 JCEF、buildPhase尊重$NIX_BUILD_CORES、考虑自动化更新脚本aarch64-linux补齐源码构建验证构建是否依赖 expataarch64-darwin补齐源码构建。这些条目属于当前仓库的开放工作项对想参与 JetBrains 打包维护的读者是最直接的贡献入口。小结从安装到维护的完整闭环围绕 jetbrains 目录 与 readme.md本文覆盖了 JetBrains IDE 在 nixpkgs 中的完整生命周期安装by-name 包 mkJetBrainsProduct构建器、定制addPlugins注入 zip/JAR 两类插件、验证tests.empty与tests.stored-correctly双测试、升级updater/main.pyupdateInfo.json 标记替换、扩展新增 IDE 三步流程。无论是普通用户想在 NixOS 上装好带插件的 IDE还是维护者想更新或贡献 JetBrains 相关包都可以按本文对应的章节直接操作。赞分享包管理器操作系统【免费下载链接】nixpkgsNix Packages collection NixOS项目地址https://gitcode.com/GitHub_Trending/ni/nixpkgs点击查看免费下载相关推荐PostGraphile Mutation Wrappers 插件实战在更新类 Mutation 中自动注入默认值PostGraphile Mutation Wrappers 插件实战在更新类 Mutation 中自动注入默认值 Mutation wrappersMut后端API网关GitToolBox: 强化Jetbrains IDE的终极Git插件GitToolBox: 强化Jetbrains IDE的终极Git插件 在开发世界中高效且强大的工具是每位程序员所追求的。GitToolBox正是这样一款为J开发工具版本控制Nixpkgs 中为 Kakoune 定制带自动加载插件的构建override、kakounePlugins 与 wrapper 原理Nixpkgs 中为 Kakoune 定制带自动加载插件的构建override、kakounePlugins 与 wrapper 原理 Kakoune 是V包管理器操作系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表