среда, 12 марта 2014 г.

Разработка приложений: виртуальные машинки и удалённая отладка

Для того, чтобы на компьютер "с нуля" установить всё необходимое для работы программное обеспечение, нередко требуется много времени. При этом не имеет значения, физическая это машинка или же виртуальная.

Описание проблемы 
Для того, чтобы настроить машинку на разработку и тестирование плагинов AutoCAD версий 2009, 2010, 2011, 2012, 2013, 2014, нужно не только строго в обозначенном порядке установить их, но так же установить и соответствующие для них версии SDK. Так же необходимо установить и MS Visual Studio. В том же случае, если нужно писать плагины не только на .NET но и на C++, ситуация ещё более осложняется, поскольку и IDE придётся ставить так же несколько: для неуправляемого кода C++ каждой версии AutoCAD соответствует своя версия MS Visual Studio.
Помимо этого, порой приходится устанавливать немалый набор дополнительного ПО: предпочитаемый браузер, пакет MS Office, архиватор, программу работающую с виртуальными образами, Adobe Reader, антивирус и т.д. и т.п.



Конечно же, гораздо удобней всё это один раз установить на виртуальную машинку и затем сделать её рабочую копию. Т.о. если текущая копия придёт в негодность, то достаточно быстро и просто можно создать новую на основе ранее созданной заготовки. Однако тут есть одно "НО"... Но что, если потребуется разрабатывать ПО не для AutoCAD, а к примеру, для Revit? Нужно ли устанавливать Revit на эту же виртуальную машинку (возможно даже несколько версий Revit), или же по аналогии создавать новую? А что, если дополнительно потребуется разрабатывать и тестировать код для nanoCAD, BricsCAD, а так же писать что-то своё, используя библиотеки ODA?

Не стоит забывать и о том, что разрабатываемый нами код, по хорошему, следовало бы тестировать не только на Windows 7 x64, но и на Windows 7 x86, а так же, возможно, что и на Windows XP x86. Это означает, что придётся создавать такие машинки и устанавливать на них все программы, необходимые для тестирования нашего кода.

По моему личному ощущению - если на компьютер устанавливается множество различного ПО, занимающего много места, то порой такой компьютера начинает работать ощутимо медленней, чем до этой установки.

Общая идея

Учитывая вышеизложенное, целесообразно отделить мух от котлет: т.е. создавать отдельно виртуальную машинку для разработки, и отдельно виртуальные машинки, предназначенные для тестирования и удалённой отладки кода.

На машинку, предназначенную для разработки, устанавливаются только набор нужных IDE, SDK, а так же необходимый разработчику, дополнительный набор инструментов и программных библиотек. При этом сами же целевые приложения, для которых ведётся разработка, на эту машину не устанавливаются. Это означает, что на машинку разработчика не устанавливаются ни AutoCAD, ни Revit, ни nanoCAD, ни BricsCAD и т.д.

Для тестирования и отладки же создаются и настраиваются отдельные виртуальные машинки, работающие под разными, интересующими нас операционными системами. Затем на эти машинки устанавливается набор нужных  программ, например, AutoCAD 2009 - 2014. Можно, при желании, на эту же машинку устанавливать и Revit, nanoCAD, BricsCAD и т.д., однако я всё же предпочитаю этого не делать и создавать для них отдельные виртуальные машинки, по аналогии, как это было показано для AutoCAD.



Т.о. получается, что каждая такая машинка ориенирована на тестирование и отладку различных версий конкретного приложения. Сама же по себе отладка и тестирование выполняется удалённо, посредством установленной на клиентской машине нужной версии Remote Debugger.



Да, безусловно, на создание таких виртуальных машинок придётся один раз потратить некоторое время. Однако, всё не так страшно, как может показаться на первый взгляд. Ниже приводится пример того, как я делал это для себя.

Примечание
В первый раз, обозначенная выше идея была мною реализована ещё пару-тройку лет назад, когда мой компьютер работал под управлением операционной системы Windows 7 x64, а для работы с виртуальными машинками использовался VMware. Результат был так же успешен. Около года назад (может чуть больше), я полностью перешёл дома на Linux, а вместо VMware решил использовать VirtualBox.

Пример реализации

Итак, мой домашний компьютер работает под управлением операционной системы Linux. Дополнительно установлен VirtualBox (для работы с виртуальными машинками).

Собирая свой домашний физический компьютер (несколько лет назад), я заранее ориентировался на стиль разработки, который описывается мною в этой заметке: активное использование виртуальных машинок и выполнение на них удалённой отладки. Этим и обусловлены конечные параметры:
  • процессор Core i7
  • объём оперативной памяти - 24 Gb
  • пять жёстких дисков по 1Tb каждый, из них три внешних (для виртуальных машинок целиком отведён один из дисков, а для резервного копирования - ещё один)
  • видеокарта NVIDIA GeForce GTX 570

Примечание
К счастью, на сегодняшний день, цены на подобные составляющие являются вполне приемлемыми. 

В результате, одновременная работа, к примеру, четырёх виртуальных машин не вызывает никаких проблем: всё работает на удивление шустро. Более того, они работают ощутимо быстрее, чем мой физический компьютер на работе. Обычно, при разработке под AutoCAD, у меня одновременно запущено сразу несколько виртуальных машинок одна та, что с IDE, а дополнительные - это машинки win7x64_acads_(work), win7x86_acads_(work) и winXPx86_acads_(work) с установленным софтом, под который в данный момент я пишу код. По мере необходимости, в настройках проекта я указываю ту или иную машинку, на которой желаю в данный момент выполнять удалённую отладку.

Сама по себе удалённая отладка выполняется так же удобно, как и локальная. Дополнительный её плюс, на мой взгляд, заключается в том, что если вдруг оказывается, что по каким-то причинам, на одном из пользовательских компьютеров (т.е. даже на реальной физической машине), подключенных к вашей сети, ваше приложение почему-то либо вовсе отказывается работать, либо работает некорректно, то вы можете со своего компьютера выполнить удалённую отладку на конкретном проблемном пользовательском компьютере так, как будто это ваша локальная машинка.

Итак, поехали...

Под виртуальные машинки я зарезервировал отдельный жёсткий диск, создав на нём каталог vm. В этом каталоге разместил два подкаталога:
  • templates
  • work
Каталог templates предназначен для хранения готовых, настроенных машинок-шаблонов, на основании которых следует создавать рабочие копии (т.е. те машинки, которые непосредственно используются при разработке и тестировании). Каталог work содержит непосредственно рабочие машинки.

Каталог templates содержит подкаталоги:
  • base
  • develop
  • hosts
В каталоге base созданы базовые виртуальные машинки, с установленными операционными системами, платформами .NET Framework и всеми обновлениями. Более из софта на них не установлено ничего. Итак созданы:
  • win7x64
  • win7x86
  • winXPx86
Создав эти три машинки, я сделал их копии в подкаталоге hosts и на каждую последовательно установил AutoCAD 2009 - 2014 со всеми пакетами обновлений:
  • win7x64_acads
  • win7x86_acads
  • winXPx86_acads

Примечание:
Далее по тексту, словосочетания "на базе", "на основе" означают, что делается копия исходной машинки и все операции выполняются с этой копией. Если иное не оговорено отдельно, то создание копий выполняется средствами VirtualBox. При этом включена опция генерации для копии нового mac-адреса. Однако будут указаны случаи, когда следует копирование выполнять обычным способом (Ctrl + C, Ctrl +V) - эти случаи будут обозначены отдельно.

Затем, на базе машинки win7x64, в подкаталоге develop был создан шаблон для разработки (т.е.для написания непосредственно программного кода):
  • win7x64_develop
На эту машинку последовательно установлены MS Visual Studio 2005 - 2013 со всеми пакетами обновлений. Никаких дополнительных программ (не имеющих отношения к процессу написания кода), а так же пакетов SDK, относящихся к тестируемому ПО, не ставилось.


Все перечисленные выше машинки являются всего лишь базовыми заготовками, на основе которых можно создавать более детализированные, специализированные шаблоны виртуальных машинок. Теперь можно приступать к детализации...

В каталоге work, на основе машинки win7x64_develop была создана более детализированная рабочая машинка, предназначенная для непосредственного использования (т.е. это уже не шаблон):
  • win7_dev
Деталлизирована она в следующем:
  • Установлен антивирус Kaspersky.
  • Установлен архиватор 7zip.
  • Создан и подключен дополнительный виртуальный диск D.
  • На диске D созданы подкаталоги: sdk, src, test, public.
  • В подкаталог D:\sdk\Autodesk\AutoCAD установил все ObjectARX SDK по подкаталогам AutoCAD 2009, ... 2014.
  • Последовательно установил все Wizards.
  • В каталоге D:\src создал подкаталоги vs2005, ... vs2013 для отдельного хранения проектов каждой IDE.
  • В настройках каждой IDE прописал путь, указанный выше, для хранения её проектов.
  • Каталог public сделал доступным для чтения\записи всем компьютерам в домашней группе.
Каталог D:\test предназначен для тестирования, при котором нет необходимости подключаться к удалённым машинкам. Хранение проектов и SDK на отдельном виртуальном диске позволяет отключать его, в случае необходимости и подключать к другому компьютеру.



Далее, в каталоге work были созданы так же рабочие копии машинок win7x64_acads, win7x86_acads и winXPx86_acads:
  • win7x64_acads_(work)
  • win7x86_acads_(work)
  • winXPx86_acads_(work)
На эти машинки дополнительно установлен антивирус Kaspersky. Копии этих виртуальных машин были сделаны не средствами VirtualBox, а обычным копированием (Ctrl + C, Ctrl + V) - иначе у AutoCAD может слететь лицензия (в частности это происходит с AutoCAD 2009). Вообще, после копирования машинок средствами VirtualBox приходится на полученной копии выполнять повторную активацию Windows, но на мой взгляд - это не проблема, а если для кого-то проблема, то Ctrl + C, Ctrl + V в помощь.

На каждой из указанны выше рабочих машинок создан каталог public, которому разрешён доступ на чтение\запись всем компьютерам, подключенным к домашней сети.

Примечание
В настройках всех виртуальных машинок тип подключения был мною изменён с NAT на Сетевой мост, дабы создать свою виртуальную сеть.

В результате, как это ни странно, мои виртуальные машинки работают ощутимо быстрее, чем мой физический компьютер на работе. Работать достаточно комфортно. Отладочная сборка при компиляции размещается в "расшаренном" (shared) каталоге удалённой машинки, на которой планируется выполнение отладки:

Меняя в настройках проекта имя целевой удалённой машины мы, тем самым, быстро меняем условия нашего тестирования (версия ОС, её разрядность, целевое приложение, например AutoCAD или nanoCAD и т.п.):





Если нужно, то указываем логин и пароль для удалённого подключения:


А вот, собственно, и отладка:


Маленькое пояснение: в заголовке отладочной машинки мы видим имя win7x64_acads(work), а в настройках проекта и в строке монитора удалённой отладки видим имя win7x64. Это различие объясняется просто: в каталоге work я создал дополнительную копию на базе шаблона win7x64_acads, воспользовавшись обычным Ctrl + C, Ctrl + V. Переименовывать машинку и диск не стал (поленился) - вместо этого подключив её в VirtualBox, переименовал ярлык на win7x64_acads(work). Т.о. в заголовке окна виртуальной машинки мы видим имя переименованного ярлыка. А настоящее имя тестовой машинки указано в настройках проекта и в мониторе удалённой отладки. Конечно, лучше было бы их переименовать в соответствии с ярлыком. Надеюсь, что в отличие от меня вы именно так и сделаете, не поленившись :).


Подводим итоги
На мой взгляд, совместное использование виртуальных машин и удалённой отладки существенно упрощают процесс разработки, тестирования и отладки кода.

4 комментария:

Boxa комментирует...

Как всегда монументально и подробно.
Спасибо, возьму на вооружение.

Boxa комментирует...

После того, как машины настроены, при подключении из студии с автокаду на виртуальной машине, может появиться ошибка при попытке запуска проекта и что сервер RPC недоступен.
Лечится это вот так: http://stackoverflow.com/questions/15009901/remote-debugging-not-working-unable-to-attach-to-process-the-rpc-server-is-no

На русском языке эта настройка называется "Использовать режим совместимости управляемого кода"

Дмитрий Загорулькин комментирует...

Boxa, спасибо! Очень помог твой комментарий про сервер RPC!

Андрей Бушман комментирует...

Случаи - они бывают разными. Примеры обозначены здесь: https://revit-addins.blogspot.ru/2017/02/vs2015-use-managed-compatibility-mode.html

Информация имеет отношение не только к разработке под Revit, хотя и указана в тематическом блоге.