- 开发工具
- CLI
【免费下载链接】devenv
Fast, Declarative, Reproducible, and Composable Developer Environments using Nix
本文围绕 devenv 项目中 Elixir 语言模块(languages.elixir)展开,系统讲解其 4 个核心配置选项(enable、package、lsp.enable、lsp.package)的类型、默认值与适用场景,并结合模块源码剖析开启后 devenv 会为你注入哪些工具链(Elixir 运行时、ElixirLS 语言服务器,以及 Credo、Dialyzer、mix-format、mix-test 等预定义 git-hook 的底层包绑定)。读完本文,你将能够用声明式 Nix 配置快速搭建一套可复现的 Elixir / Phoenix 开发环境,并理解如何替换 Elixir 版本、控制语言服务器开关。
一、模块概览:languages.elixir 解决什么问题
在 devenv 中,languages.elixir是一个声明式语言模块:只需要在devenv.nix里写一行languages.elixir.enable = true;,devenv 就会把 Elixir 运行时、构建/测试工具链以及编辑器所需的语言服务器一并接入你的开发者环境(shell、direnv、容器均可复用同一份配置)。它的官方定义位于 src/modules/languages/elixir.nix,而 docs/src/content/docs/languages/elixir.md 是该模块的生成式参考文档(页首注明“Do not edit this generated file”,源码才是权威来源)。
从源码结构看,模块整体采用 devenv 标准的“options 声明 + config 合并”模式:
options.languages.elixir定义了对外暴露的 4 个选项;config分支在enable = true时才生效,负责装配包列表、语言服务器和 git-hook 的包绑定;- 同时注册一条变更日志(changelog),用于在环境激活时提示用户关于默认包来源的调整。
二、四个核心选项详解
下表汇总了languages.elixir的全部配置项(与文档页逐项对应):
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
languages.elixir.enable | boolean | false | 是否启用 Elixir 开发工具链 |
languages.elixir.package | package | pkgs.beamPackages.elixir | 使用哪个 Elixir 包 |
languages.elixir.lsp.enable | boolean | true | 是否启用 Elixir Language Server |
languages.elixir.lsp.package | package | pkgs.beamPackages.elixir-ls | 使用哪个 Elixir 语言服务器包 |
1. languages.elixir.enable
- 类型:
boolean - 默认值:
false - 示例:
true
这是整个模块的总开关。设置为true后,devenv 会把配置好的 Elixir 包加入环境PATH,并在lsp.enable(默认开启)时附带安装 ElixirLS。未开启时,模块不会向环境中注入任何 Elixir 相关工具。
2. languages.elixir.package
- 类型:
package - 默认值:
pkgs.beamPackages.elixir - 作用:决定环境中可用的 Elixir 编译器/运行时版本。
package选项承担三重职责(见 src/modules/languages/elixir.nix 与第 43-53 行的 config 合并):
- 作为
packages中的核心条目注入环境; - 同时作为
credo、dialyzer、mix-format、mix-test四个预定义 git-hook 的package提供方(git-hooks.hooks.<name>.package = cfg.package),保证这些 hook 与环境中运行的 Elixir 版本完全一致; - 由于语言服务器(elixir-ls)构建时通常基于特定 Elixir 版本,更换
package时应保持 lsp 包的兼容性。
如需使用其他 Elixir 版本,可将其替换为同一 nixpkgs 中beamPackages集合下的其他 Elixir derivation,或由 overlay 定制过的版本。
3. languages.elixir.lsp.enable
- 类型:
boolean - 默认值:
true - 示例:
true
是否启用 Elixir Language Server(ElixirLS)。这是模块中少数“默认开启”的开关之一。开启后,languages.elixir.lsp.package指定的语言服务器会被加入环境包列表,编辑器(如 VS Code、Neovim 等通过 LSP 协议的客户端)即可直接发现并启动它。若不使用编辑器内的 Elixir 智能感知,可显式关闭以减小环境闭包体积:
{ languages.elixir = { enable = true; lsp.enable = false; }; }4. languages.elixir.lsp.package
- 类型:
package - 默认值:
pkgs.beamPackages.elixir-ls - 作用:指定 Elixir 语言服务器的具体包。
通常无需修改;当默认的 elixir-ls 与所选 Elixir 版本不兼容、或需要引用自建/新版的语言服务器时,可以通过此选项替换。
三、开启后的完整行为:源码级解析
languages.elixir.enable = true之后,devenv 实际做了两件事(见 src/modules/languages/elixir.nix):
(lib.mkIf cfg.enable { git-hooks.hooks = { credo.package = cfg.package; dialyzer.package = cfg.package; mix-format.package = cfg.package; mix-test.package = cfg.package; }; packages = [ cfg.package ] ++ lib.optional cfg.lsp.enable cfg.lsp.package; })- 注入包:
cfg.package一定进入环境;当lsp.enable = true时,cfg.lsp.package作为可选条目追加。也就是说,最小配置下你获得的命令行工具包括elixir、iex、mix等,开启 LSP 后还会多出 ElixirLS。 - 绑定 git-hooks:模块为四个预定义的 Elixir 相关 hook 指定了执行包来源——
credo(静态代码分析)、dialyzer(Erlang/Elixir 类型分析)、mix-format(Elixir 内置语法格式化器)、mix-test(Elixir 内置测试框架)。注意:这里设置的是这些 hook 运行时使用的package,而 hook 本身的启用与否仍由git-hooks.hooks.<name>.enable独立控制。例如你可以只启用格式化与测试检查:
{ languages.elixir.enable = true; git-hooks.hooks = { mix-format.enable = true; mix-test.enable = true; }; }这样每次提交前,devenv 会使用与开发环境完全相同的 Elixir 包运行mix format与mix test,杜绝“本地能过、CI 挂掉”的版本漂移问题。
此外,devenv 还通过 treefmt 集成提供了treefmt.config.programs.mix-format.enable选项(见 docs/src/data/options.json 中 treefmt 程序清单),可在多语言统一格式化工作流中接入 Elixir 格式化。
四、实战配置示例
1. 最小可用的 Elixir 环境
{ pkgs, ... }: { languages.elixir.enable = true; }进入环境(devenv shell)后即可使用elixir、iex、mix,并自动获得 ElixirLS 语言服务器(LSP 默认开启)。
2. 定制 Elixir 版本并调整 LSP
{ pkgs, ... }: { languages.elixir = { enable = true; # 指向 beamPackages 集合中的其他 Elixir 版本(示例,按需替换) package = pkgs.beamPackages.elixir; # 若编辑器无需 Elixir 语言服务,可关闭 lsp.enable = false; }; }3. 完整 Phoenix + PostgreSQL 全栈环境
仓库中的 examples/phoenix/devenv.nix 给出了一个开箱即用的 Phoenix 全栈示例,它把languages.elixir与数据库服务、进程管理组合在一起:
{ pkgs, lib, ... }: { packages = [ pkgs.git ] ++ lib.optionals pkgs.stdenv.hostPlatform.isLinux [ pkgs.inotify-tools ]; languages.elixir.enable = true; services.postgres = { enable = true; initialScript = '' CREATE ROLE postgres WITH LOGIN PASSWORD 'postgres' SUPERUSER; ''; initialDatabases = [ { name = "hello_dev"; } ]; }; processes.phoenix.exec = "cd hello && exec mix phx.server"; }该配置展示了languages.elixir在真实项目中的配合方式:Linux 下额外加入inotify-tools(Phoenix 文件监听依赖)、services.postgres声明式初始化数据库、processes.phoenix定义devenv up即可启动的开发进程。使用时按示例注释先在环境中执行:
mix local.hex mix local.rebar mix archive.install hex phx_new mix phx.new hello --install新建 Phoenix 项目后,devenv up即可同时拉起 PostgreSQL 与mix phx.server。
4. 全语言启用场景
examples/supported-languages/devenv.nix 中同样以languages.elixir.enable = true;参与“启用全部语言工具链”的示例配置,可用于验证多语言环境共存时 Elixir 模块的声明式接入方式。
五、版本与变更记录:为什么默认值是 beamPackages
模块内置了一条变更日志(见 src/modules/languages/elixir.nix),日期为 2026-08-24,要点如下:
languages.elixir.package与languages.elixir.lsp.package的默认值改为pkgs.beamPackages.elixir与pkgs.beamPackages.elixir-ls;- 原因:nixpkgs 已弃用顶层
elixir属性(top-levelelixirattribute),Elixir 相关包统一收敛到pkgs.beamPackages集合; - 效果:消除了较新 nixpkgs 上评估时出现的
'elixir' is deprecated弃用警告。
因此,如果你在自己的配置中曾手动写languages.elixir.package = pkgs.elixir;,建议迁移到pkgs.beamPackages.elixir(或直接省略该项使用默认值),以获得更干净的评估输出和更稳定的 nixpkgs 兼容性。该 changelog 会在languages.elixir.enable = true时展示给用户。
六、进一步探索
- 模块实现与默认值定义:src/modules/languages/elixir.nix
- 生成式选项参考文档:docs/src/content/docs/languages/elixir.md
- 全量选项 JSON(含
languages.elixir.*与treefmt.config.programs.mix-format等):docs/src/data/options.json - 真实全栈用法:examples/phoenix/devenv.nix
- 多语言共存示例:examples/supported-languages/devenv.nix
如需为 Elixir 项目贡献新的语言模块能力(例如新增 hook 绑定或环境变量注入),可以参照现有模块在src/modules/languages/下的组织方式,通过提交 PR 的方式扩展 devenv 的 Elixir 支持。
- 开发工具
- CLI
【免费下载链接】devenv
Fast, Declarative, Reproducible, and Composable Developer Environments using Nix
相关推荐
devenv 中配置 Lobster 开发环境:languages.lobster 选项完全指南
devenv 中配置 Lobster 开发环境:languages.lobster 选项完全指南 本文围绕 devenv 的 languages.lobster
开发工具CLIgrpc-gateway 怎么给 runtime.ServeMux 添加自定义 HTTP 路由?
grpc gateway 怎么给 runtime.ServeMux 添加自定义 HTTP 路由? 当你基于 grpc gateway 搭建网关后,某些 HTTP
开发工具CLIdevenv 中的 Swift 开发环境配置指南:从 `languages.swift` 选项到 LSP 集成
devenv 中的 Swift 开发环境配置指南:从 languages.swift 选项到 LSP 集成 本文聚焦 devenv 项目内置的 Swift 语言
开发工具CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考