.. _plugin_system: Plugin System Overview ====================== The ``devc`` tool uses a modular plugin architecture. It is divided into ``commands`` , ``plugins`` and ``plugin-extensions``. .. code-block:: bash devc --plugin-flag_1 --plugin_flag_m --plugin-extensions-flag_1 --plugin-extensions-flag_n The order of the ``plugin-flags`` and the ``plugin-extensions-flags`` does not matter. For explanatory purpose the ``plugin-flags`` are enclosed with brackets like ``[--plugin-flag]`` which is not valid syntax. For example: .. code-block:: bash devc dev-json ros2-dektop-full [--name="my_ros2_project" --ros-domain-id=5] --nvidia=auto --ssh=mount So in this case ``[--name="my_ros2_project" --ros-domain-id=5]`` would be the plugins own flags while ``--nvidia=auto --ssh=mount`` are plugin-extension-flags which are available for any plugin. **Command** would be ``dev-json``, which tells ``devc`` we want to create a devcontainer.json. Another example would be the ``dockerfile`` command. **Plugin** the plugin would be ``ros2-desktop-full``, which tells exactly what type to create. In this case a devcontainer.json specific for ROS2. This includes additional VS Code extensions and ROS2-specific configurations such as setting the `ROS_DOMAIN_ID `_. **Plugin Extensions** are the flags ``--nvidia=auto`` and ``--ssh=mount``. These modify the behavior of the created devcontainer.json by adding NVIDIA GPU support and SSH key mounting, respectively. The special thing about them is, that they are not plugin specific and can be added to any plugin of the ``dev-json`` command not only the ``ros2-desktop-full`` plugin. **Plugin Flags** are the flags ``--name="my_ros2_project"`` and ``--ros-domain-id=5`` which are specific to the ``ros2-desktop-full``. .. toctree:: :hidden: :maxdepth: 2