I actually do the opposite to @RLGUY's solution, by using the files in the 'addons' directory in my Blender 'home' directory (eg, C:\Users\Rich\AppData\Roaming\Blender Foundation\Blender\2.80\scripts) to edit the development files and then simply restart Blender to ensure I get a clean re-load of the add-on files.
I use GIT for source control and this comes with a 'Git GUI' client for booking in/out, as well as a 'Git Bash' shell.
I use a script developed to run through 'Git Bash' to clone the files from the Blender directory back into my Git repository directory, before booking them into Git. In this way I can also perform other actions in the Bash script, such as clone it and convert it from Blender 2.8 syntax/api into source code that is compatible with Blender 2.7, automatically copy it into the Blender 2.7 directory (so I merely have to launch Blender 2.7 to test the add-on in that environment), as well as package the files into ZIP files with appropriate names for distribution.
Here's an example of my Bash script for performing these actions for the Maths Expression add-on :
echo "This will overwrite 'local' copies and those in Blender 2.7!!"
echo "Are you sure? (y=continue)"
read REPLY
if [ "$REPLY" != 'y' ]
then
echo "Aborted!"
exit 1
fi
BLENDER28SOURCE="C:/Users/Rich/AppData/Roaming/Blender Foundation/Blender/2.80/scripts/addons/MathsExpressionBlender28"
echo -e "\n\nCopy from '$BLENDER28SOURCE' and overwrite 'local' copy?"
read REPLY
if [ "$REPLY" = "y" ]
then
echo "Copying..."
sleep 2
for file in `ls -1 "$BLENDER28SOURCE"|grep '\.py$'`
do
#echo "$file"
cp "$BLENDER28SOURCE/$file" MathsExpressionBlender28
#sleep 1
done
rm -f MathsExpressionBlender28/presets/*
for file in `ls -1 "$BLENDER28SOURCE"/presets`
do
#echo "$file"
cp "$BLENDER28SOURCE/presets/$file" MathsExpressionBlender28/presets
#sleep 1
done
cp "$BLENDER28SOURCE/documentation.txt" MathsExpressionBlender28
fi
function convert_to_27()
{
SOURCEDIR=$1
DESTDIR=$2
ZIP="c:/program files/7-zip/7z.exe"
mv "$DESTDIR" "../old/$DESTDIR.`date +%Y%m%d.%H%M%S`"
if [ "$?" -ne 0 ]
then
echo "Failed to backup old version"
exit 2
fi
mkdir "$DESTDIR"
if [ "$?" -ne 0 ]
then
echo "Failed to create new empty directory"
exit 3
fi
for file in `ls -1 $SOURCEDIR`
do
if [ ! -z "`echo $file|grep '\.py$'`" ]
then
#It's a 'py' file
#Convert 'XXXX[n]: bpy.props...' to 'XXXX = bpy.props...'
cat $SOURCEDIR/$file |sed 's/\([a-z][0-9]*\): bpy.prop/\1 = bpy.prop/' |sed 's/2, 80, 0/2, 76, 0/' >$DESTDIR/$file
else
#Copy it
cp -rfd "$SOURCEDIR"/"$file" "$DESTDIR"
fi
done
}
echo -e "\n\nConvert 'full' 28 version to 27?"
read REPLY
if [ "$REPLY" = "y" ]
then
convert_to_27 MathsExpressionBlender28 MathsExpressionBlender27
fi
#echo -e "\n\nConvert 'lite' 28 version to 27?"
#read REPLY
#
#if [ "$REPLY" = "y" ]
#then
# convert_to_27 MathsExpressionLiteBlender28 MathsExpressionLiteBlender27
#fi
echo -e "\n\nRe-build ZIP files?"
read REPLY
if [ "$REPLY" = "y" ]
then
echo "Rebuilding..."
for module in MathsExpressionBlender27 MathsExpressionBlender28 #MathsExpressionLiteBlender27 MathsExpressionLiteBlender28
do
echo "$module"
rm -f "$module.zip"
"$ZIP" a "$module.zip" $module
done
ls -l *zip
fi
echo -e "\n\nUnpack both versions to Blender 2.79 addons?"
read REPLY
if [ "$REPLY" = "y" ]
then
# Unzip to 2.79 blender addons, with overwrite mode of 'all'
"$ZIP" x -aoa -o"c:/Users/rich/AppData/Roaming/Blender Foundation/Blender/2.79/scripts/addons" MathsExpressionBlender27.zip
# "$ZIP" x -aoa -o"c:/Users/rich/AppData/Roaming/Blender Foundation/Blender/2.79/scripts/addons" MathsExpressionLiteBlender27.zip
fi
echo -e "\n\nRename ZIPs based on version?"
read REPLY
if [ "$REPLY" = "y" ]
then
for file in MathsExpressionBlender28 MathsExpressionBlender27 #MathsExpressionLiteBlender28 MathsExpressionLiteBlender27
do
VERSION="`grep '"version":' $file/__init__.py|sed 's/.*(//'|sed 's/).*$//'|tr -d ' '|tr ',' '.'`"
echo "$file ($VERSION)"
mv $file.zip ${file}_${VERSION}.zip
done
fi
echo "Done"
exit 0
Note that this is for development in a Windows environment. For Linux you could simply use a similar Bash script, without needing 'Git Bash' (I use Bash since it provides all the tools I need (such as 'sed') for manipulating the files (rather than VB Script or Batch files which are less capable (I also prefer it, coming more from a Linux background)).