DevEx LogoMy App
Configuration

Environment Configuration

Manage programming languages, fonts, and shell configurations

Environment Configuration

The environment.yaml file manages development environment essentials: programming languages through mise, font installations, and shell configurations. This configuration ensures consistent tooling across development machines.

File Location

# Default configuration
~/.local/share/devex/config/environment.yaml

# User override (higher priority)
~/.devex/environment.yaml

File Structure

programming_languages:
  - name: string          # Language/runtime name
    description: string   # Description of the language
    category: string      # "Programming Languages"
    install_method: string # Installation method (mise)
    install_command: string # Version specification
    # ... additional fields

fonts:
  - name: string          # Font name
    method: string        # Installation method
    url: string          # Download URL (if applicable)
    destination: string   # Installation path
    # ... font-specific options

shell: []                 # Shell configurations (extensible)

Programming Languages

DevEx uses mise for managing programming language versions. This provides consistent, project-aware version management across all languages.

Language Definition Schema

FieldTypeRequiredDescription
namestringYesLanguage identifier
descriptionstringYesHuman-readable description
categorystringYesAlways "Programming Languages"
install_methodstringYesAlways "mise"
install_commandstringYesVersion specification
uninstall_commandstringYesUninstall identifier
defaultboolNoInstall by default (false)
dependenciesstring[]NoRequired dependencies

Version Specifications

programming_languages:
  - name: Python
    install_command: 'python@3.11.7'  # Pinned stable version
    
  - name: Go
    install_command: 'go@1.21.6'      # Pinned stable version
    
  - name: Rust
    install_command: 'rust@1.75.0'    # Pinned stable version

Supported Languages

Web Development

Node.js, Deno, Bun

Systems Programming

Rust, Go, Zig

Enterprise

Java, C#

Scripting

Python, Ruby, Elixir

Complete Language Examples

programming_languages:
  # JavaScript/TypeScript ecosystem
  - name: Node.js
    description: 'Node.js runtime'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'node@lts'
    uninstall_command: 'node'
    default: false
    dependencies:
      - 'mise'
      
  - name: Deno
    description: 'A modern runtime for JavaScript and TypeScript'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'deno@latest'
    uninstall_command: 'deno'
    default: false
    dependencies:
      - 'mise'
      
  - name: Bun
    description: 'A fast all-in-one JavaScript runtime'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'bun@latest'
    uninstall_command: 'bun'
    default: false
    dependencies:
      - 'mise'

  # Systems programming
  - name: Rust
    description: 'Rust programming language'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'rust@latest'
    uninstall_command: 'rust'
    default: false
    dependencies:
      - 'mise'
      
  - name: Go
    description: 'Go programming language'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'go@latest'
    uninstall_command: 'go'
    default: false
    dependencies:
      - 'mise'

  # Functional programming
  - name: Elixir
    description: 'Dynamic, functional language for maintainable applications'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'elixir@latest'
    uninstall_command: 'elixir'
    default: false
    dependencies:
      - 'mise'
      - 'erlang'  # Elixir runs on Erlang VM
      
  - name: Erlang
    description: 'Programming language for massively scalable soft real-time systems'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'erlang@latest'
    uninstall_command: 'erlang'
    default: false
    dependencies:
      - 'mise'

Font Management

DevEx manages programming fonts and system fonts through multiple installation methods.

Font Schema

FieldTypeRequiredDescription
namestringYesFont display name
methodstringYesInstallation method
urlstringConditionalDownload URL (for url method)
destinationstringConditionalInstallation directory
extract_pathstringNoPath within archive to extract

Font Installation Methods

fonts:
  - name: 'Cascadia Mono'
    method: 'url'
    url: 'https://github.com/ryanoasis/nerd-fonts/releases/latest/download/CascadiaMono.zip'
    destination: '~/.local/share/fonts'
    
  - name: 'iA Writer Mono'
    method: 'url'
    url: 'https://github.com/iaolo/iA-Fonts/archive/refs/heads/master.zip'
    extract_path: 'iA-Fonts-master/iA Writer Mono/Static'
    destination: '~/.local/share/fonts'

Version Pinning for Fonts: For production or team environments, consider pinning font URLs to specific releases instead of using "latest" for better reproducibility:

url: 'https://github.com/ryanoasis/nerd-fonts/releases/download/v3.1.1/CascadiaMono.zip'
fonts:
  # Nerd Fonts (with programming symbols)
  - name: 'Cascadia Mono'
    method: 'url'
    url: 'https://github.com/ryanoasis/nerd-fonts/releases/latest/download/CascadiaMono.zip'
    destination: '~/.local/share/fonts'
    
  - name: 'JetBrains Mono'
    method: 'url'
    url: 'https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip'
    destination: '~/.local/share/fonts'
    
  - name: 'Fira Code'
    method: 'url'
    url: 'https://github.com/ryanoasis/nerd-fonts/releases/latest/download/FiraCode.zip'
    destination: '~/.local/share/fonts'

  # System fonts
  - name: 'SF Mono'           # macOS system font
    method: 'system'
    platforms: ['macos']
    
  - name: 'Consolas'          # Windows system font
    method: 'system'
    platforms: ['windows']

Shell Configuration

The shell section is currently extensible and ready for future shell configurations like themes, plugins, and prompt customizations.

Current Structure

shell: []  # Empty array - ready for extension

Planned Shell Features

Shell Themes: Oh My Zsh, Starship, and Oh My Posh configurations

Shell Plugins: Auto-completion, syntax highlighting, history

Environment Variables: Development-specific environment setup

Aliases and Functions: Common development shortcuts

Future Shell Configuration

# Planned shell configuration structure
shell:
  - name: 'starship'
    type: 'prompt'
    config_file: '~/.config/starship.toml'
    theme: 'tokyo-night'
    
  - name: 'zsh-autosuggestions'
    type: 'plugin'
    install_method: 'git'
    repo: 'https://github.com/zsh-users/zsh-autosuggestions'
    
  - name: 'dev-aliases'
    type: 'aliases'
    aliases:
      ll: 'ls -la'
      gc: 'git commit'
      gp: 'git push'

Version Management with Mise

DevEx leverages mise for unified version management across all programming languages.

Project-Level Version Control

# Create .mise.toml in project root
echo 'node = "18.17.0"' >> .mise.toml
echo 'python = "3.11.0"' >> .mise.toml

# Mise automatically switches versions when entering directory
cd my-project  # Automatically uses Node 18.17.0 and Python 3.11.0

Global vs Project Versions

# Set global defaults (used outside projects)
mise use --global node@lts
mise use --global python@3.11
mise use --global go@latest

# View global versions
mise list

Real-World Examples

Full-Stack JavaScript Development

programming_languages:
  - name: Node.js
    description: 'Node.js runtime'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'node@lts'
    uninstall_command: 'node'
    default: true
    dependencies:
      - 'mise'
      
  - name: Deno
    description: 'Modern JavaScript/TypeScript runtime'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'deno@latest'
    uninstall_command: 'deno'
    default: false
    dependencies:
      - 'mise'

fonts:
  - name: 'JetBrains Mono'
    method: 'url'
    url: 'https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip'
    destination: '~/.local/share/fonts'

Data Science Environment

programming_languages:
  - name: Python
    description: 'Python programming language'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'python@3.11'  # Stable for data science
    uninstall_command: 'python'
    default: true
    dependencies:
      - 'mise'
      
  - name: R
    description: 'R statistical language'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'r@latest'
    uninstall_command: 'r'
    default: false
    dependencies:
      - 'mise'

fonts:
  - name: 'Source Code Pro'
    method: 'url'
    url: 'https://github.com/ryanoasis/nerd-fonts/releases/latest/download/SourceCodePro.zip'
    destination: '~/.local/share/fonts'

Systems Programming Setup

programming_languages:
  - name: Rust
    description: 'Rust systems programming language'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'rust@latest'
    uninstall_command: 'rust'
    default: true
    dependencies:
      - 'mise'
      
  - name: Go
    description: 'Go programming language'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'go@latest'
    uninstall_command: 'go'
    default: true
    dependencies:
      - 'mise'
      
  - name: Zig
    description: 'Zig systems programming language'
    category: 'Programming Languages'
    install_method: 'mise'
    install_command: 'zig@latest'
    uninstall_command: 'zig'
    default: false
    dependencies:
      - 'mise'

fonts:
  - name: 'Cascadia Mono'
    method: 'url'
    url: 'https://github.com/ryanoasis/nerd-fonts/releases/latest/download/CascadiaMono.zip'
    destination: '~/.local/share/fonts'

Best Practices

Environment Configuration Best Practices:

  1. Use LTS versions - For production-focused environments
  2. Pin specific versions - For team consistency
  3. Install Nerd Fonts - Better terminal experience with symbols
  4. Leverage mise project configs - Per-project version management
  5. Test font rendering - Ensure fonts work in your terminal/editor
  6. Document team standards - Share environment configs across team

Team Environment Standardization

# Shared team environment configuration
programming_languages:
  # Standardize on specific versions for consistency
  - name: Node.js
    install_command: 'node@18.17.0'  # Pinned for team
    default: true
    
  - name: Python
    install_command: 'python@3.11.0' # Pinned for team
    default: true

fonts:
  # Consistent programming font across team
  - name: 'JetBrains Mono'
    method: 'url'
    url: 'https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip'
    destination: '~/.local/share/fonts'

Validation and Testing

Validate Environment Configuration

# Validate environment.yaml syntax
devex config validate environment

# Test programming language installation (dry-run)
devex install python --dry-run

# Verify mise is working
mise --version

# Check installed languages
mise list

# Test font installation
fc-list | grep -i "jetbrains"  # Linux

Troubleshooting

# Mise not found
curl https://mise.run | sh
echo 'eval "$(mise activate bash)"' >> ~/.bashrc

# Clear mise cache
mise cache clear

# Rebuild mise shims
mise reshim

# Check mise configuration
mise doctor

The environment.yaml configuration ensures consistent development tooling across machines and team members. Combined with mise's project-aware version management, it provides a robust foundation for any development environment.

On this page