名称: dialyzer集成 用户可调用: false 描述: 用于将Dialyzer集成到Erlang/Elixir项目的开发工作流和CI/CD管道中。 允许的工具: []
Dialyzer集成
将Dialyzer集成到开发工作流和CI/CD管道中。
本地开发
初始设置
# 安装dialyxir
mix deps.get
# 构建初始PLT(首次运行需要时间)
mix dialyzer --plt
# 运行分析
mix dialyzer
增量分析
# 仅分析更改的文件
mix dialyzer --incremental
# 强制重建PLT
mix dialyzer --clean
CI/CD集成
GitHub Actions
name: Dialyzer
用户可调用: false
on: [push, pull_request]
jobs:
dialyzer:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: 设置Elixir
uses: erlef/setup-beam@v1
with:
elixir-version: '1.15'
otp-version: '26'
- name: 恢复依赖缓存
uses: actions/cache@v3
with:
path: deps
key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}
- name: 恢复PLT缓存
uses: actions/cache@v3
id: plt-cache
with:
path: priv/plts
key: ${{ runner.os }}-plt-${{ hashFiles('**/mix.lock') }}
- name: 安装依赖
run: mix deps.get
- name: 创建PLTs
if: steps.plt-cache.outputs.cache-hit != 'true'
run: mix dialyzer --plt
- name: 运行Dialyzer
run: mix dialyzer --format github
GitLab CI
dialyzer:
stage: test
script:
- mix local.hex --force
- mix local.rebar --force
- mix deps.get
- mix dialyzer
cache:
paths:
- _build/
- deps/
- priv/plts/
IDE集成
VS Code (ElixirLS)
{
"elixirLS.dialyzerEnabled": true,
"elixirLS.dialyzerFormat": "dialyxir_long",
"elixirLS.dialyzerWarnOpts": [
"error_handling",
"underspecs",
"unmatched_returns"
]
}
Vim/Neovim (coc-elixir)
{
"elixir.dialyzer.enabled": true
}
预提交钩子
使用Husky/Lefthook
# lefthook.yml
pre-commit:
commands:
dialyzer:
glob: "*.ex"
run: mix dialyzer --incremental
Git钩子脚本
#!/bin/sh
# .git/hooks/pre-commit
echo "运行Dialyzer..."
mix dialyzer --incremental --quiet
if [ $? -ne 0 ]; then
echo "Dialyzer发现问题。提交已中止。"
exit 1
fi
团队工作流
共享PLT策略
# mix.exs
def project do
[
dialyzer: [
plt_core_path: "priv/plts",
plt_local_path: "priv/plts",
plt_add_apps: [:mix, :ex_unit],
# 通过git在团队中共享
plt_file: {:no_warn, "priv/plts/project.plt"}
]
]
end
基线方法
# 生成基线
mix dialyzer > dialyzer_baseline.txt
# 检查新警告
mix dialyzer | diff - dialyzer_baseline.txt
性能优化
并行分析
def project do
[
dialyzer: [
flags: [:error_handling],
# 使用多核
plt_add_deps: :app_tree
]
]
end
选择性分析
# 仅检查特定路径
mix dialyzer lib/critical/ test/important_test.exs
增量模式
# 首次运行后更快
mix dialyzer --incremental
监控和报告
自定义格式化器
# lib/custom_dialyzer_formatter.ex
defmodule CustomDialyzerFormatter do
def format(warnings) do
warnings
|> Enum.map(&format_warning/1)
|> Enum.join("
")
end
defp format_warning(warning) do
# 自定义格式化逻辑
end
end
指标收集
# 随时间计数警告
mix dialyzer | grep -c "warning:" >> dialyzer_metrics.log
故障排除
PLT问题
# 移除并重建
rm -rf _build/dev/*.plt priv/plts/*.plt
mix dialyzer --plt
内存问题
# 增加VM内存
elixir --erl "+hms 4096" -S mix dialyzer
分析缓慢
# 使用增量模式
mix dialyzer --incremental
# 或分析子集
mix dialyzer lib/core/