Honestly IMO the easiest is to use Visual Studio Code and install the blender dev tool by Jacques Lucke. It automatically creates symlinks between the blender addon and your dev folder, reloads the addons file automatically and can be used with autocomplete with a bit of setup.
Also keep in mind somewhere around Blender 2.9 (I think) the reload scripts option was made available which avoids the necessity of uninstall repackage install.
And you can use symlinks without having to unzip / rezip for example on windows use the command line mklink /d "path/to/addons/youraddon" "path/to/your/dev/folder".
yeah, as I am not fan of vscode and the plugin is for blender 2.8, I made a batch file, but symlinks work too
also apparently some code must be added to the addon to have it hot reload without issues
# Check if this add-on is being reloaded
if "bpy" in locals():
# reloading .py files
import importlib
# from . blendzmq_props import ZMQSocketProperties
# importlib.reload(ZMQSocketProperties)
# from . blendzmq_panel import BLENDZMQ_PT_zmqConnector
# importlib.reload(BLENDZMQ_PT_zmqConnector)
from . import addon_props # addon_props.py (properties are created here)
importlib.reload(addon_props) # does this file need a def register() / def unregister() for the classes inside?
from . import addon_panel # addon_panel.py (panel interface classes are created here)
importlib.reload(addon_panel)
# or if this is the first load of this add-on
else:
print("importing .py files")
import bpy
from . import addon_props
from . import addon_panel