com.airbnb.viaduct.module-gradle-plugin) is applied to individual module projects within a Viaduct application. It handles schema assembly, resolver code generation, and integration with the application-level plugin.
Overview
The module plugin provides:- Schema partition assembly - Collects GraphQL schema files from the module
- Resolver base class generation - Generates abstract resolver classes from schema
- GRT (Generated Runtime Types) integration - Provides access to generated type classes
- Build-time validation - Prevents direct module-to-module dependencies
- Kotlin compiler configuration - Enables context receivers for resolvers
Installation
In modulebuild.gradle.kts:
Extension
viaductModule
Configuration extension for module-specific settings.Properties
Kotlin package name suffix for this module. Used to organize generated code and schema partitions.
- Default: Empty string (when used with application plugin)
- Example:
"filmography"results in packagecom.example.filmography - Effect: Affects generated code package names and schema partition paths
Tasks
The module plugin registers several Gradle tasks.prepareViaductSchemaPartition
Assembles the module’s schema partition from GraphQL files. Type:AssembleSchemaPartitionTask
Input:
- GraphQL schema files from
src/main/viaduct/schema/
- Schema partition directory in
build/viaduct-schema-partition/
Directory containing GraphQL schema files (
.graphqls files)Default: src/main/viaduct/schemaPrefix path for organizing the schema partition (derived from
modulePackageSuffix)Example: "filmography/graphql" for module suffix "filmography"Output directory for the assembled schema partitionDefault:
build/viaduct-schema-partitiongenerateViaductResolverBases
Generates abstract resolver base classes from the central schema. Type:GenerateResolverBasesTask
Input:
- Central schema from application plugin (all modules combined)
- Generated resolver base classes in
build/generated/viaduct/resolvers/
GraphQL schema files from the central schema (provided by application plugin)
Output directory for generated resolver base classesDefault:
build/generated/viaduct/resolversBuild flags for code generation (e.g., feature flags)
Regex pattern for extracting module identity from schema paths
viaductCodegen
Convenience task that runs all code generation for the module. Depends on:generateViaductResolverBases- Indirectly triggers GRT generation at application level
Configurations
The plugin creates several Gradle configurations for artifact exchange.schemaPartitionOutgoing
Type: Consumable configuration Purpose: Provides this module’s schema partition to the application plugin Attributes:viaductKind = SCHEMA_PARTITION
- Output of
prepareViaductSchemaPartitiontask
centralSchemaIncoming
Type: Resolvable configuration Purpose: Receives the central schema from the application plugin (used for resolver generation) Attributes:viaductKind = CENTRAL_SCHEMA
grtClassesIncoming
Type: Resolvable configuration Purpose: Receives GRT (Generated Runtime Types) JAR from the application plugin Attributes:viaductKind = GRT_CLASSESusage = JAVA_RUNTIMEcategory = LIBRARYlibraryElements = JAR
implementationconfiguration (for main source set)testImplementationconfiguration (for test source set)testFixturesImplementationconfiguration (ifjava-test-fixturesplugin is applied)
Validation
No Direct Module Dependencies
The plugin enforces that modules cannot depend directly on each other. This ensures proper encapsulation. Blocked:Kotlin Configuration
Context Receivers
The plugin automatically enables Kotlin context receivers, which are used by generated resolver classes. Added compiler argument:Source Sets
Generated resolver base classes are automatically added to the main Kotlin source set:IDE Integration
The plugin configures IntelliJ IDEA to recognize generated sources: Generated directories marked as source roots:build/generated/viaduct/resolvers
- Code completion for generated resolver classes
- Navigation to generated code
- No red squiggles for generated types
Example Module
Complete example of a Viaduct module:build.gradle.kts:
src/main/viaduct/schema/Character.graphqls:
src/main/kotlin/.../CharacterResolvers.kt:
Best Practices
Do
- Use meaningful module suffixes - Helps organize code and schemas
- Keep modules focused - Each module should have a clear domain boundary
- Run
viaductCodegenafter schema changes - Regenerate resolvers when schema changes - Commit generated code to version control - Optional but recommended for CI/CD
Don’t
- Don’t add direct module dependencies - Use the central schema for cross-module types
- Don’t modify generated classes - They’ll be overwritten on next generation
- Don’t skip code generation - Always run after pulling schema changes
Troubleshooting
Generated classes not found
Solution: Run code generation:IDE doesn’t recognize generated code
Solution: Sync Gradle project:- IntelliJ: File → Sync Project with Gradle Files
- Or run:
./gradlew idea(if using IDEA plugin)
Schema changes not reflected
Solution: Clean and regenerate:See Also
- Application Plugin - Root application plugin
- Tenant API - Implementing generated resolvers
- Directives - Schema directives (
@resolver, etc.) - Module Architecture - Designing modules