Overview
The compile-project skill ensures that all Elixir code, dependencies, and configurations in the Blockscout project compile successfully. This is a critical verification step before committing changes or submitting pull requests.
When to Use
- Before committing code changes - Verify your changes don't break compilation
- After modifying dependencies - Ensure all deps resolve correctly
- After significant refactoring - Validate code structure changes
- Before creating a pull request - Final verification that everything builds
- After pulling updates - Ensure your local environment is in sync
- When fixing compilation errors - Iterative testing during debugging
- After adding new modules or functions - Verify project-wide compatibility
How to Compile
Run the following command from the workspace root:
mix do deps.get, local.hex --force, local.rebar --force, deps.compile, compile
Command Breakdown
mix do- Executes multiple Mix tasks in sequencedeps.get- Fetches all project dependencies from Hex and Gitlocal.hex --force- Installs/updates Hex (package manager), forcing reinstalllocal.rebar --force- Installs/updates Rebar (Erlang build tool), forcing reinstalldeps.compile- Compiles all dependenciescompile- Compiles the project itself
Dependencies-Only Compilation
If you only need to compile dependencies without the project code:
mix do deps.get, local.hex --force, local.rebar --force, deps.compile
Example Usage
After Making Code Changes
mix do deps.get, local.hex --force, local.rebar --force, deps.compile, compile
Expected Output
Successful compilation will show:
* Getting dependencies...
* Compiling dependencies...
==> dependency_name
Compiling X files (.ex)
Generated dependency_name app
...
==> blockscout
Compiling X files (.ex)
Generated blockscout app
Common Errors and Solutions
1. Dependency Lock Mismatch
** (Mix) You have changed mix.exs but mix.lock is out of date
Solution:
mix deps.get
2. Stale Build Artifacts
** (CompileError) cannot compile dependency
Solution:
mix deps.clean --all
mix do deps.get, local.hex --force, local.rebar --force, deps.compile, compile
3. Compilation Warnings
warning: variable "foo" is unused
Action: Fix unused variables or prefix with underscore _foo
Integration with Development Workflow
Recommended Pre-Commit Checklist
- ✅ Run
mix format- Fix formatting issues - ✅ Run
mix do deps.get, local.hex --force, local.rebar --force, deps.compile, compile- Verify compilation - ✅ Run
mix test- Execute test suite (if applicable) - ✅ Run
mix credo- Check code quality (if available) - ✅ Review git diff - Confirm changes are intentional
- ✅ Commit and push
Quick Verification After Changes
# Format, compile, and verify in one go
mix format && mix do deps.get, local.hex --force, local.rebar --force, deps.compile, compile
Performance Notes
- First compilation: Can take several minutes (downloads and compiles all dependencies)
- Incremental compilation: Usually seconds to minutes (only changed files)
- Clean compilation: Use
mix cleanormix deps.clean --allwhen needed - Parallel compilation: Mix automatically uses available CPU cores
When Compilation Warnings Are Acceptable
Some warnings may be acceptable in certain contexts:
- TODO comments - Tracked technical debt
- Unused variables in generated code - Auto-generated functions
- Module redefinition warnings - Configuration loading order (like ConfigHelper)
However, new code should aim for zero warnings.
Troubleshooting
Dependencies Won't Compile
# Nuclear option: clean everything and start fresh
rm -rf _build deps
mix do deps.get, local.hex --force, local.rebar --force, deps.compile, compile
Erlang/Elixir Version Mismatch
Check required versions in mix.exs:
def project do
[
elixir: "~> 1.19",
# ...
]
end
Verify your versions:
elixir --version
Permission Issues with Rebar
If mix local.rebar --force fails with permission errors, ensure proper ownership and permissions:
# Fix ownership of Mix home directory
chown -R $(whoami) ~/.mix ~/.hex $MIX_HOME $HEX_HOME 2>/dev/null || true
# Or explicitly set Mix/Hex home directories if needed
export MIX_HOME=~/.mix
export HEX_HOME=~/.hex
# Then try again
mix local.rebar --force
Note: Running Mix as root (with sudo) is strongly discouraged as it commonly causes permission/ownership issues in _build, deps, and ~/.mix. It can also create security/operational risks. Use proper file ownership and environment variables instead.
CI/CD Integration
This compilation step is typically part of the CI/CD pipeline. Ensure your changes pass locally before pushing to avoid CI failures.
Related Skills
- code-formatting - Format code before compilation
- compare-against-empty-list - Fix performance issues that might surface during compilation
Key Takeaways
- Always compile before committing - Catch errors early
- Use the full command - Ensures dependencies are up-to-date
- Monitor compilation warnings - They often indicate real issues
- Clean builds when in doubt - Removes stale artifacts
- Compilation success ≠ correctness - Still need tests and manual verification
- Fast feedback loop - Run frequently during development
- Avoid running Mix as root - Use proper permissions instead
Additional Commands
Check for unused dependencies
mix deps.unlock --unused
View dependency tree
mix deps.tree
Compile with warnings as errors (strict mode)
mix compile --warnings-as-errors