Я искал нечто подобное и нашел драгоценный камень в пакете под названием PyScons . Сканер делает то, что вы хотите (в 7 строк), используя import_hook. Вот сокращенный пример:
import modulefinder, sys
class SingleFileModuleFinder(modulefinder.ModuleFinder):
def import_hook(self, name, caller, *arg, **kwarg):
if caller.__file__ == self.name:
# Only call the parent at the top level.
return modulefinder.ModuleFinder.import_hook(self, name, caller, *arg, **kwarg)
def __call__(self, node):
self.name = str(node)
self.run_script(self.name)
if __name__ == '__main__':
# Example entry, run with './script.py filename'
print 'looking for includes in %s' % sys.argv[1]
mf = SingleFileModuleFinder()
mf(sys.argv[1])
print '\n'.join(mf.modules.keys())
Если вы хотите реализовать это самостоятельно, это тоже довольно просто. Наше приложение периодически опрашивает веб-службу для получения информации с помощью примерно следующего API:
getVersion(Installation ID): returns release version to be installed and hash of all files
getFileList(Version ID): gets a list of files and file hashes for the release
getFile(File ID): gets one file
Плюсы: кодируя логику в методе getVersion, вы можете отправлять разные версии разным клиентам, а также это позволяет продвигать бета-версии до ограниченного количества клиенты в первую очередь.
Проверка хэша всех загруженных файлов гарантирует, что ваше приложение загружает файлы правильно. Это также можно использовать для восстановления поврежденных файлов приложений. Когда хэш для выпуска совпадает с хешем для всех загруженных файлов, пора устанавливать.
Чтобы установить, пусть ваша основная программа запустит приложение обновления и выйдет. Обновление должно заменить все измененные файлы приложения. Программа обновления также может запускать любые сценарии изменения SQL или изменения реестра, связанные с выпуском.
В конце программы обновления снова запустите основное приложение и попросите основное приложение обновить программу обновления, если это необходимо. Они обновляют друг друга, поэтому вы можете вносить исправления как в программу обновления, так и в основное приложение.
Я также рекомендую протестировать переход на более раннюю версию, прежде чем предлагать клиентам новую версию, чтобы вы могли автоматически переключиться на старую стабильную версию в случае каких-либо критических ошибок. найдены.
Поскольку вы используете .NET и Windows, ClickOnce, как сказал Дэниел, должен работать для вас нормально.
Другой вариант - использовать Теневое копирование . По сути говоря, ваши сборки должны выполняться из места, отличного от того, в котором они установлены. Это позволит вашему приложению обновлять собственные файлы, даже если сборки загружены. Я не использовал это раньше, но видел, как это демонстрировалось пару раз.
ClickOnce было бы более простым решением, и я бы пошел на это, если у вас нет какой-либо потребности, которой он не удовлетворяет. ClickOnce позволит вам опубликовать приложение на веб-сервере или в общей сетевой папке и позволит вашим пользователям автоматически обновлять свою копию, когда будет доступна новая версия. Он автоматически проверяет память и запрашивает пользователя при попытке запустить приложение.
You haven't specified what language/platform/framework you're using, but I'd recommend using one that has this functionality built in.
Microsoft has ClickOnce deployments, and I know Adobe Air does something similar. Here's a SO question talking about having auto-update functionality in Java.
You didn't specify the target operating system but on OS X a good choice that is supposed to me very easy to add is Sparkle.
Что мы делаем; при запуске приложения или примерно каждый час мы делаем запрос GET к нашему веб-серверу.
http://www.domain.com/app/versionCheck.php?app=APP_NAME&version=2.1.1.1
Скрипт проверяет базу данных и сравнивает версии. Если версия отличается, утилите отправляется «UPGRADE», в противном случае - «GOOD»
. Если утилита получает «UPGRADE», она отправляет пользователей по заранее определенному URL-адресу для загрузки последней версии утилиты.
Это хорошо работает с небольшими утилитами (<20 МБ).
Предложения