Тут есть пример файла обновлятора. Он тоже называется и выглядит как инсталятор. Поэтому в нашем файле install.php инсталятора, можно сделать запрос в БД для выяснения есть ли компонент с таким именем и какая у него версия. Затем используя функцию importDump( 'путь до файла sql' ) из файла cmsDatabase выполнить запрос в БД. Если нет компонента, дампим install.sql если есть и версия ниже нашей, дампим update.sql. Если есть и такая же версия, то просто меняем файлы.
И оно несколько раз запишется в БД, только с разным ID соответственно.
Как вариант можно прописать в файле sql
DELETE FROM `{#}controllers` WHERE `name` = 'имя' AND `author` = 'автор';
INSERT INTO `{#}controllers` (`title`, `name`, `is_enabled`, `options`, `author`, `url`, `version`, `is_backend`) VALUES
('Заголовок, 'имя', 1, '', 'автор', 'http://instantcms.ru/users/автор', 'версия', 1);
Что касается замены файлов при обновлении, то не всегда можно делать замену всех файлов автоматически (например файл manifest.php, где объявлены хуки). Ведь нам неизвестно, были ли правки данного файла или нет (например пользователь сам или другой разработчик уже внесли свои коррективы в этот файл). Поэтому если не было обновлений данного файла в нашем компоненте, то его желательно исключить из инсталятора данного обновления. Поэтому надо делать два архива отдельно, один для установки, другой для обновления, или в одном архиве две папки, типа packages и packages_update.
и при установке определять какой пользоваться.