module
Lapis::Docs::I_ARCHITECTURE_AND_EXTENSIONS::C_ADDONS_AND_MULTI_PLUGIN_ISOLATION
Overview
GDExtension Addons & Multi-Plugin Isolation
Comprehensive guide to authoring, loading, isolating, and depending on multiple Crystal GDExtension addons simultaneously within a single Godot Editor session without ClassDB collisions or symbol overduplication.
Executive Summary & Key Topics
| Topic | Method / Anchor | Description |
|---|---|---|
| Multi-Addon Isolation Invariants | .topic_00_isolation_invariants |
Independent shared libraries, separate ClassDB registration, and packaging rules. |
| Testing Multi-Addon Isolation | .topic_01_multi_addon_testing |
How Lapis tests concurrent loading of multiple independent Crystal addons. |
| Inter-Addon Dependencies & Topological Compilation | .topic_02_addon_dependencies |
How a single base addon serves as a shared dependency for multiple consumer plugins. |
| Engine Limitation: Cross-Extension ClassDB Inheritance | .topic_03_engine_cross_extension_inheritance |
Godot 4 engine invariant forbidding cross-GDExtension ClassDB inheritance. |
Related Guides & Source References
- Dummy Addons:
addons/dummy_audio/,addons/dummy_dialogue/,addons/dummy_inventory/ - Dependency Addon Suite:
addons/dummy_base_dep/,addons/dummy_dep_combat/,addons/dummy_dep_storage/,addons/dummy_dep_quest/,addons/dummy_dep_weather/ - Official Plugin:
addons/crystal_integration/
Defined in:
libgodot/docs/i_architecture_and_extensions/c_addons_and_multi_plugin_isolation.crClass Method Summary
-
.topic_00_isolation_invariants : Nil
Multi-Addon Isolation Invariants: Independent shared libraries, separate ClassDB registration, and packaging rules.
-
.topic_01_multi_addon_testing : Nil
Testing Multi-Addon Isolation: How Lapis tests concurrent loading of multiple independent Crystal addons.
-
.topic_02_addon_dependencies : Nil
Inter-Addon Dependencies & Topological Compilation: How a single base addon serves as a shared dependency for multiple consumer plugins.
-
.topic_03_engine_cross_extension_inheritance : Nil
Engine Limitation: Cross-Extension ClassDB Inheritance: Godot 4 engine invariant forbidding cross-GDExtension ClassDB inheritance.
Class Method Detail
Multi-Addon Isolation Invariants: Independent shared libraries, separate ClassDB registration, and packaging rules.
Key Topics & Information
- Each addon compiles its own isolated DLL into addons/
/bin/ .dll - Separate crystal.gdextension manifests per addon
- ClassDB names must be uniquely qualified across all extensions and engine types
- Test dummy addons are strictly isolated and never bundled in production releases
Testing Multi-Addon Isolation: How Lapis tests concurrent loading of multiple independent Crystal addons.
In addons/, Lapis maintains multiple test addons (dummy_audio, dummy_dialogue, dummy_inventory):
- Each addon declares its own
EditorPluginand custom nodes. - When Godot boots, all GDExtensions (including
crystal_integration) load simultaneously. - Lapis validates that
crystal_bridge.dllcleanly loads each module, passes distinctBridgeAPIpointers, and registers all nodes intoClassDBwithout symbol collisions. - Release packaging scripts (
package addon,package deb,package windows-installer) strictly bundle onlycrystal_integration.
Inter-Addon Dependencies & Topological Compilation: How a single base addon serves as a shared dependency for multiple consumer plugins.
Lapis supports using one Crystal addon as a shared dependency for multiple plugins:
- Manifest Declarations: In each consumer plugin's
plugin.cfg, declaredependencies=["base_addon"]. - Topological Build Ordering: The Lapis build toolchain (
lapis build addons) performs a topological sort on addon dependency graphs, ensuring base dependency addons compile before consumer plugins. - Extension Load Ordering: In
.godot/extension_list.cfg, dependencies are topologically ordered so the engine loads prerequisite extensions before consumer extensions. - Separation of Reusable Library Code vs ClassDB Entities:
- Reusable interfaces (mixins
gmodule, utilitiesmodule, constants) reside insrc/<addon>.cr. - Concrete ClassDB entities reside in
src/entities.crorsrc/main.crand are registered in ClassDB exclusively by the base addon. - Consumer plugins require
src/<addon>.crfor compile-time code reuse without duplicate ClassDB registrations.
- Reusable interfaces (mixins
Engine Limitation: Cross-Extension ClassDB Inheritance: Godot 4 engine invariant forbidding cross-GDExtension ClassDB inheritance.
In Godot Engine 4.x (core/extension/gdextension.cpp:461), cross-extension ClassDB inheritance is explicitly unimplemented:
ClassDB::get_api_type(parent_class_name) == ClassDB::API_EXTENSION -> ERR_PRINT("Unimplemented yet").
- Fully Compiled Multi-DLL Mode: Plugin nodes must inherit from native Godot engine classes (
Node2D,Node3D,Resource,RefCounted, etc.) and consume the base dependency via:- Shared Crystal mixins (
include BaseMixin) for common properties, methods, and signals. - Pure Crystal utilities (
BaseUtils). - Scene tree composition and reflection dispatch on base entity instances.
- Shared custom resources (
BaseConfig < Resource).
- Shared Crystal mixins (
- Unified Source Code Mode: When all addons are compiled together into a single library (
game.dllorgame.exe), all classes belong to the same GDExtension library, allowing direct subclassing (node SubEntity < BaseEntity) without error.