Multi-Module Development
Status: Placeholder - Content coming soon
Prerequisites: Your First Module, Building and Testing Changes
Planned Content
This tutorial teaches you how to work effectively across multiple modules, managing dependencies, understanding build order, and maintaining module contracts.
What You'll Learn
- Understand module dependency graphs
- View and navigate module dependencies
- Define module contracts with dependencies
- Determine correct build order
- Handle circular dependencies
- Validate module hierarchy
- Work across module boundaries
- Integration testing between modules
Tutorial Structure
- Understanding module dependencies
- Dependency types: build, test, runtime
- Direct vs. transitive dependencies
- View dependencies:
r2r show dependencies <module> -
Visualize dependency graph
-
Module contracts
- Define dependencies in
.r2r/eac/repository.yml - Dependency syntax and semantics
- Contract validation
-
Breaking vs. non-breaking changes
-
Build order and execution
- Topological sort of dependency graph
- Get execution order:
r2r get execution-order <modules> - Build dependencies:
r2r get build-deps <module> -
Parallel vs. sequential builds
-
Example: Multi-module feature
- Scenario: Add authentication to API
- Modules affected: auth-lib, api-gateway, user-service
- Define dependency chain
- Build in correct order
-
Integration testing
-
Working across module boundaries
- Identify module ownership:
r2r show files - Understand API contracts between modules
- Make compatible changes
-
Version module interfaces
-
Validating dependencies
- Check contracts:
r2r validate dependencies - Verify hierarchy:
r2r validate module-hierarchy - Go module validation:
r2r validate go-tidy -
Detect circular dependencies
-
Handling dependency changes
- Update contracts when dependencies change
- Rebuild dependent modules
- Integration test suite
-
Contract testing patterns
-
Circular dependencies
- Why circular dependencies are problematic
- Detecting circular dependencies
- Refactoring to break cycles
- Dependency inversion principle
Example: Multi-Module Feature
The tutorial implements authentication across three modules:
auth-lib (base library): - Provides JWT token validation - No dependencies on other modules
api-gateway (depends on auth-lib): - Uses auth-lib for authentication - Routes requests to services
user-service (depends on auth-lib): - Uses auth-lib to verify requests - Manages user data
Dependency graph:
Build order: 1. Build auth-lib first 2. Build api-gateway and user-service in parallel 3. Integration test all three together
Commands Demonstrated
# View module dependencies
r2r show dependencies api-gateway
# Get build order for multiple modules
r2r get execution-order auth-lib api-gateway user-service
# Build in dependency order
r2r build auth-lib
r2r build api-gateway user-service
# Validate dependency contracts
r2r validate dependencies
# Check for circular dependencies
r2r validate module-hierarchy
Key Concepts Covered
- Dependency graphs and topological sorting
- Module contracts and versioning
- Build order determination
- Cross-module integration testing
- Circular dependency detection
- Contract-based development
Module Contract Example
modules:
- name: api-gateway
type: go-app
root: go/api-gateway
dependencies:
- auth-lib
artifacts:
- bin/api-gateway
- name: auth-lib
type: go-lib
root: go/auth-lib
dependencies: []
artifacts: []
Best Practices
- Keep dependency graphs shallow (avoid deep chains)
- Make dependencies explicit in contracts
- Avoid circular dependencies
- Use interface contracts between modules
- Integration test at module boundaries
- Version module APIs semantically
- Document breaking changes
Common Patterns
Layered architecture:
infrastructure (base)
├── domain (business logic)
│ └── application (use cases)
│ └── api (HTTP/gRPC)
Shared library pattern:
Microservices pattern:
Integration Testing
Testing across module boundaries:
- Contract tests: Verify API contracts
- Integration tests: Test module interactions
- End-to-end tests: Full system scenarios
Use test level tags: - L0-L1: Unit tests (within module) - L2: Component tests (module as a whole) - L3: Integration tests (multiple modules) - L4: System tests (full system)
Next Steps
After completing this tutorial, you'll be able to manage complex multi-module systems. Continue to Creating Custom Commands to learn how to extend the r2r CLI.
Tutorials | How-to Guides | Explanation | Reference
You are here: Tutorials — learning-oriented guides that take you through steps to complete a project.