Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
thebushidocollective avatar

Dialyzer Integration

  • 1 installs
  • 186 repo stars
  • Updated July 19, 2026
  • thebushidocollective/han

Integrate Dialyzer into local development and CI/CD pipelines for Erlang/Elixir, including PLT builds and incremental analysis.

About

Covers wiring Dialyzer into development workflows and CI/CD for Erlang/Elixir, including PLT setup and incremental runs. A developer uses it when automating Dialyzer in a pipeline.

  • Local PLT build and analysis
  • Incremental and CI/CD integration

Dialyzer Integration by the numbers

  • 1 all-time installs (skills.sh)
  • Ranked #1,172 of 1,435 DevOps & CI/CD skills by installs in the Skillselion catalog
  • Data as of Aug 1, 2026 (Skillselion catalog sync)
npx skills add https://github.com/thebushidocollective/han --skill dialyzer-integration

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1
repo stars186
Last updatedJuly 19, 2026
Repositorythebushidocollective/han

What it does

Integrate Dialyzer into local development and CI/CD pipelines for Erlang/Elixir, including PLT builds and incremental analysis.

Files

SKILL.mdMarkdownGitHub ↗

Dialyzer Integration

Integrating Dialyzer into development workflow and CI/CD pipelines.

Local Development

Initial Setup

# Install dialyxir
mix deps.get

# Build initial PLT (takes time first run)
mix dialyzer --plt

# Run analysis
mix dialyzer

Incremental Analysis

# Only analyze changed files
mix dialyzer --incremental

# Force rebuild PLT
mix dialyzer --clean

CI/CD Integration

GitHub Actions

name: Dialyzer
user-invocable: false

on: [push, pull_request]

jobs:
  dialyzer:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up Elixir
        uses: erlef/setup-beam@v1
        with:
          elixir-version: '1.15'
          otp-version: '26'

      - name: Restore dependencies cache
        uses: actions/cache@v3
        with:
          path: deps
          key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}

      - name: Restore PLT cache
        uses: actions/cache@v3
        id: plt-cache
        with:
          path: priv/plts
          key: ${{ runner.os }}-plt-${{ hashFiles('**/mix.lock') }}

      - name: Install dependencies
        run: mix deps.get

      - name: Create PLTs
        if: steps.plt-cache.outputs.cache-hit != 'true'
        run: mix dialyzer --plt

      - name: Run 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 Integration

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
}

Pre-commit Hooks

Using Husky/Lefthook

# lefthook.yml
pre-commit:
  commands:
    dialyzer:
      glob: "*.ex"
      run: mix dialyzer --incremental

Git Hook Script

#!/bin/sh
# .git/hooks/pre-commit

echo "Running Dialyzer..."
mix dialyzer --incremental --quiet

if [ $? -ne 0 ]; then
  echo "Dialyzer found issues. Commit aborted."
  exit 1
fi

Team Workflow

Shared PLT Strategy

# mix.exs
def project do
  [
    dialyzer: [
      plt_core_path: "priv/plts",
      plt_local_path: "priv/plts",
      plt_add_apps: [:mix, :ex_unit],
      # Shared across team via git
      plt_file: {:no_warn, "priv/plts/project.plt"}
    ]
  ]
end

Baseline Approach

# Generate baseline
mix dialyzer > dialyzer_baseline.txt

# Check for new warnings
mix dialyzer | diff - dialyzer_baseline.txt

Performance Optimization

Parallel Analysis

def project do
  [
    dialyzer: [
      flags: [:error_handling],
      # Use multiple cores
      plt_add_deps: :app_tree
    ]
  ]
end

Selective Analysis

# Only check specific paths
mix dialyzer lib/critical/ test/important_test.exs

Incremental Mode

# Much faster after initial run
mix dialyzer --incremental

Monitoring and Reporting

Custom Formatter

# lib/custom_dialyzer_formatter.ex
defmodule CustomDialyzerFormatter do
  def format(warnings) do
    warnings
    |> Enum.map(&format_warning/1)
    |> Enum.join("\n")
  end

  defp format_warning(warning) do
    # Custom formatting logic
  end
end

Metrics Collection

# Count warnings over time
mix dialyzer | grep -c "warning:" >> dialyzer_metrics.log

Troubleshooting

PLT Issues

# Remove and rebuild
rm -rf _build/dev/*.plt priv/plts/*.plt
mix dialyzer --plt

Memory Issues

# Increase VM memory
elixir --erl "+hms 4096" -S mix dialyzer

Slow Analysis

# Use incremental mode
mix dialyzer --incremental

# Or analyze subset
mix dialyzer lib/core/

Related skills

DevOps & CI/CDdevopstesting

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.