Development Transfer Utility (DTU) – утилита, предназначенная для экспорта разработки в виде структуры из папок и файлов, что позволяет хранить разработку в системе контроля версий. Утилита также позволяет выполнить импорт разработки, то есть преобразовать разработку из структуры папок и файлов обратно в пакет и загрузить в базу данных. Структура представляет собой упорядоченный по группам (функции, константы и т.д.) набор папок, внутри которых, в текстовых файлах, хранятся данные и вычисления.
В данной статье применяется метод с использованием Windows-консоли, для того, чтобы показать, как работает утилита и какие подводные камни могут возникнуть при её использовании. Для упрощения ввода команд можно использовать такие скриптовые языки как Batch, VBS и др.
Посмотреть все доступные команды можно в справке утилиты. Для этого запустим консоль Windows, перейдём в каталог с утилитой и выполним DevelopmentTransferUtility с аргументом --help:
C:\common\dtu>DevelopmentTransferUtility.exe –help
Список параметров командной строки, разделенный по группам:
--mode |
Задает режим работы (export/import, по умолчанию export). |
--type |
Тип пакета разработки (standard - стандартная разработка, routes - типовые маршруты, wizards - мастера действий, по умолчанию standard). |
--isc |
Имя файла конфигурации (для экспорта по конфигурации). |
--isx |
Файл пакета разработки (для упаковки или распаковки пакета разработки). |
--server |
Имя сервера (используется для подключения к БД). |
--database |
Имя базы данных (используется для подключения к БД). |
--username |
Имя пользователя (используется для подключения к БД). |
--password |
Пароль (используется для подключения к БД). |
--authtype |
Тип аутентификации (windows/sql, по умолчанию sql). |
--clientpartpath |
Путь к файлам клиентской части IS-Builder. |
--devfolder |
Папка с разработкой. |
--fromdate |
Левая граница фильтра по дате изменения (используется для фильтрации при экспорте или импорте). |
--todate |
Правая граница фильтра по дате изменения (используется для фильтрации при экспорте или импорте). |
--routeids |
Список ИД экспортируемых ТМ (через запятую). |
--userfilter |
Имя пользователя. Для экспорта компонент измененных указанным пользователем. |
--changesets |
Список наборов изменений через запятую (используется для фильтрации при импорте). |
--importfolders |
Список импортируемых папок (используется как фильтр при импорте). |
--tfs |
Путь к коллекции проектов TFS-сервера, в которой хранится разработка (используется для фильтрации при импорте). Требует наличие аргумента --tfsdevpath. |
--tfsdevpath |
Путь к папке с разработкой в TFS (используется для фильтрации при импорте). Требует наличие аргумента --tfs. |
--closewindow |
Закрыть окно после окончания работы. |
--help |
Вывести справку по параметрам командной строки. |
--hiddenimport |
Признак импорта в скрытом режиме (без показа окна утилиты импорта разработки). |
Используя нижеприведенную команду, экспортируем стандартную разработку из БД:
DevelopmentTransferUtility --mode "export" --type "standard" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>" --clientpartpath "<КАТАЛОГ_КЧ>" --server "<ИМЯ_СЕРВЕРА>" --database "<ИМЯ_БАЗЫ>" --username "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>" --password "<ПАРОЛЬ>" --authtype "sql"
<КАТАЛОГ_РАЗРАБОТКИ> - папка, в которую будет сохранятся или из которой будет восстанавливаться разработка,
<КАТАЛОГ_КЧ> - путь к файлам клиентской части,
<ИМЯ_СЕРВЕРА> - имя сервера БД,
<ИМЯ_БАЗЫ> - название БД,
<ИМЯ_ПОЛЬЗОВАТЕЛЯ> - имя пользователя с правами администратора БД,
<ПАРОЛЬ> - пароль пользователя с правами администратора БД.
Рисунок №1. Пример экспорта стандартной разработки.
В данном случае --authtype, --mode и --type можно не указывать, так как для них заданы значения по умолчанию, а именно "sql", "export", "standard" соответственно. --authtype указывает какой вид аутентификации использовать при подключении к базе данных (по имени пользователя и паролю сервера или Windows-аутентификации). Аргументы --clientpartpath, --devfolder, --server, --database, --username и --password являются минимально необходимыми для запуска процесса экспорта.
Примечание. Для наглядности, в своих примерах далее, данные аргументы я буду указывать явно.
Обратный процесс - импортирование:
DevelopmentTransferUtility --mode "import" --type "standard" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>" --clientpartpath "<КАТАЛОГ_КЧ>" --server "<ИМЯ_СЕРВЕРА>" --database "<ИМЯ_БАЗЫ>" --username "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>" --password "<ПАРОЛЬ>" --authtype "sql"
После запуска данной команды, откроется компонента “Импорт разработки”, в которой можно указать какие элементы импортировать в БД.
Все выше сказанное также применимо для типовых маршрутов (--type routes) и мастеров действий (--type wizards).
Типовые маршруты:
DevelopmentTransferUtility --mode "export" --type "routes" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>" --clientpartpath "<КАТАЛОГ_КЧ>" --server "<ИМЯ_СЕРВЕРА>" --database "<ИМЯ_БАЗЫ>" --username "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>" --password "<ПАРОЛЬ>" --authtype "sql"
Мастера действий:
DevelopmentTransferUtility --mode "export" --type "wizards" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>" --clientpartpath "<КАТАЛОГ_КЧ>" --server "<ИМЯ_СЕРВЕРА>" --database "<ИМЯ_БАЗЫ>" --username "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>" --password "<ПАРОЛЬ>" --authtype "sql"
Примечание. При экспорте элемента разработки также экспортируются и требуемые ему реквизиты, строки локализации, роли и т.п. элементы (зависимости).
Файл конфигурации, содержащийся в пакете разработки, созданном с помощью компоненты “Экспорта разработки”, можно использовать в качестве фильтра для экспорта разработки:
DevelopmentTransferUtility --mode "export" --type "standard" --isc "<ПУТЬ_К_ФАЙЛУ_КОНФИГУРАЦИИ>" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>" --clientpartpath "<КАТАЛОГ_КЧ>" --server "<ИМЯ_СЕРВЕРА>" --database "<ИМЯ_БАЗЫ>" --username "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>" --password "<ПАРОЛЬ>" --authtype "sql"
<ПУТЬ_К_ФАЙЛУ_КОНФИГУРАЦИИ> - полный путь к файлу конфигурации.
Примечание. На текущий момент если удалить элемент разработки в базе данных, но не удалить его из конфигурации (isc-файла), то утилита экспорта упадет с ошибкой. Предполагается, что разработчик должен сам удалить элемент разработки из файла конфигурации.
В примерах выше экспорт и импорт разработки занимает продолжительное время, так как он проводится по всем элементам БД. Для ускорения существуют специальные фильтры, по которым можно получить срез только тех объектов, которые были изменены в течении некоторого времени (--todate и --fromdate) или изменены указанным пользователем (--userfilter).
Экспорт элементов разработки, которые изменялись пользователем системы DIRECTUM в интервале дат от левой границы до правой границы:
DevelopmentTransferUtility.exe --mode "export" --type "standard" --fromdate "<ЛЕВАЯ_ГРАНИЦА>" --todate "<ПРАВАЯ_ГРАНИЦА>" --userfilter "<ПОЛЬЗОВАТЕЛЬ>" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>" --clientpartpath "<КАТАЛОГ_КЧ>" --server "<ИМЯ_СЕРВЕРА>" --database "<ИМЯ_БАЗЫ>" --username "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>" --password "<ПАРОЛЬ>" --authtype "sql"
<ЛЕВАЯ_ГРАНИЦА> - дата, от которой необходимо получить срез изменений,
<ПРАВАЯ_ГРАНИЦА> - дата, до которой проводились изменения,
<ПОЛЬЗОВАТЕЛЬ> - имя пользователя, который менял разработку.
Экспорт типового маршрута по его ID:
DevelopmentTransferUtility --mode "export" --type "routes" --routeids "<ID_ТМ>" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>" --clientpartpath "<КАТАЛОГ_КЧ>" --server "<ИМЯ_СЕРВЕРА>" --database "<ИМЯ_БАЗЫ>" --username "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>" --password "<ПАРОЛЬ>" --authtype "sql"
<ID_ТМ> - ID типового маршрута.
Примечание. Для импорта разработки, аргумент --routeids не используется.
С использованием TFS есть возможность импортировать разработку по определенным наборам изменений в ветке:
DevelopmentTransferUtility.exe --mode "import" --type "standard" --tfs "<АДРЕС_ TFS>" --tfsdevpath "<ВЕТКА_TFS>" --changesets "<СПИСОК_ИЗМЕНЕНИЙ>" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>" --clientpartpath "<КАТАЛОГ_КЧ>" --server "<ИМЯ_СЕРВЕРА>" --database "<ИМЯ_БАЗЫ>" --username "<ИМЯ_ПОЛЬЗОВАТЕЛЯ>" --password "<ПАРОЛЬ>" --authtype "sql"
<АДРЕС _TFS> - путь к коллекции проектов TFS-сервера, в которой хранится разработка (пример: «http://test:8080/tfs/DefaultCollection»),
<ВЕТКА_TFS> - путь к папке с разработкой в TFS (пример: «$/TestDev/Development»),
<СПИСОК ИЗМЕНЕНИЙ> - список наборов изменений через запятую, по которому будет проводится импорт.
Примечание. Обратите внимание на <КАТАЛОГ_РАЗРАБОТКИ>: необходимо указать тот, в котором проводились изменения для указанных наборов изменений.
Для того, чтобы упаковать разработку в пакет используется следующая команда:
DevelopmentTransferUtility --mode "import" --type "standard" --isx "<ПУТЬ_К_ПАКЕТУ_РАЗРАБОТКИ>" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>"
<ПУТЬ_К_ПАКЕТУ_РАЗРАБОТКИ> - полный путь к пакету разработки.
Обратный процесс – извлечение в каталог:
DevelopmentTransferUtility --mode "export" --type "standard" --isx "<ПУТЬ_К_ПАКЕТУАДО_РАЗРАБОТКИ>" --devfolder "<КАТАЛОГ_РАЗРАБОТКИ>"
Надеюсь, что данная статья поможет освоить принципы работы с данной утилитой и использовать её для своих целей.
Ссылка на утилиту: Development Transfer Utility
Покажите, пожалуйста, в какую структуру файлов и папок экспортируется разработка.
Исходники будут? Или хотя бы dll чтобы можно было прикрутить к утилитам типа ISBLScan.ViewCode?
Вот сложно было написать в комментах к моим статьям и ответить на вопрос, будет ли у Directum такая утилита? Хотя, если не предоставите исходников, то я не зря кучу времени потратил на аналог.
c gitlab/github планируется встроенная интеграция?
p/s/ Утилита огонь!
з.з.ы. исходные коды можно получить?
Очень полезная утилита! Присоединяюсь к вопросу, исходники можно как-то получить?
Требование наличия клиентской части можно убрать, если выгружать разработку напрямую с SQL.
Вот набор sql-функций, позволяющий выгрузить с SQL сразу ISX. Там есть фильтрация по дате, фильтр по пользователю несложно прикрутить (заготовки есть в коде). Поддержки диалогов там нет, делал очень давно, а потом мне оно не надо было, версии систем старые.
Какие версии DIRECTUM поддерживает данная утилита?
В каком режиме в утилиту будет добавляться поддержка новых возможностей инструментов разработчика, вместе с выходом версии системы?
полную выгрузку делает ооооооооооооочень долго.
прошел 1 час. ничего не выгрузилось :( Утилита жрет 1Гб памяти и 12% CPU
Результат:
13:10:05 Экспорт из базы данных: запущен.
14:10:49 Экспорт из базы данных: завершен.
а что так долго?
Денис, эта утилита использует стандартный механизм экспорта. Как минимум он жрёт много памяти и долго работает. А еще требует клиентской части. В том числе поэтому я делал SQL-функции, про которые написал выше и в своей утилите мы сделали свою загрузку с SQL. Загрузка полного стандартного пакета с SQL меньше 5 сек, выгрузка в ISX меньше 5 сек, выгрузка в файловую систему у меня на SSD занимает меньше минуты (очень много файлов).
Александр, а загрузка у вас как реализована?
Денис, какая загрузка? Из базы данных? Просто запросами получаем разработку в модель. По этой части, к сожалению, из ISBLScan ничего взять не удалось, там было очень не оптимально, я когда за нее взялся не стал переписывать, только чуток оптимизировал.
У меня очень высокие требования к скорости работы таких утилит потому что часто работаю не на самых лучших каналах связи, а через RDP очень неприятно работать с ISBLScan.ViewCode, при пролистывании тормозит очень.
Вот наша утилита на канале с RTT 150мс и шириной 5мбит грузит всю разработку за 30 секунд.
Александр,
Подробное описание структуры файлов получилось бы довольно объемным. Если кратко: в корневой папке создаются папки для каждого типа компоненты (Constants, Scripts etc.), в них создаются папки для каждой компоненты этого типа (название папки может быть кодом или наименованием компоненты). Содержимое этих папок может отличаться, в зависимости от типа компоненты, но обычно там есть XML с реквизитам карточки, другие XML с данными, формы, отдельные файлы с вычислениями сгруппированные по типу, например события справочника. Картинка для примера:
Денис,
Встроенной интеграции с другими системами контроля версий не планируется пока. В текущей версии привязка к TFS только в плане фильтрации компонент. Если не использовать эти параметры, то утилита, я думаю, подойдет для работы с большинством СКВ.
Экспорт всей разработки действительно занимает продолжительное время. Но совсем скоро выйдет DIRECTUM 5.5, и там стандартные механизмы экспорта/импорта работают быстрее.
Александр, Денис, Дмитрий,
Исходники планируем выложить, но позже, т.к. нужно решить некоторые организационные вопросы. Выложим ссылку тут же.
Андрей,
Требования к системе:
Пока мы сами используем утилиту, будем добавлять в нее поддержку новых возможностей инструментов разработчика. Выкладывать новые версии будем, скорее всего, с выходом новых версии DIRECTUM.
Наоборот, в базу данных импорт разработки
у многих клиентов 5.5. еще не скоро появится :(
Денис, импорт стандартными средствами, мы формируем ISX. Решили что свой импорт писать нет смысла, но мы делали прототип изменения разработки напрямую через служебные справочники разработки, вполне рабочий вариант.
У нас в приложении есть модель всей разработки. Ее мы можем заполнять из базы данных запросами, из ISX, из файловой системы. Выгружать из модели можем в ISX и в файловую систему. Модель еще будет использоваться в аналоге ISBLScan для отображения разработки и, возможно, ее редактирования. Можно и свой экспорт сделать, с выбором в одном окне не только разработки, но и ТМ, мастеров, записей справочников. В общем, возможностей много, нужны руки и время=)
Камиль, спасибо. Мы у себя выбрали JSON, а не XML. Вроде как легче должен читаться. А в целом всё похоже=)
Зачем утилита постоянно создает папку Development? я уже указал куда сохранять, зачем мне еще 1 папка.
Требования к системе:
А что это за версия? Если версия системы DIRECTUM 5.5 использует платформу IS-Builder 7.55.0.
Денис, платформа IS-Builder 7.6.1 соответствует версии DIRECTUM 4.5.
В рамках наших процессов, использование отдельной папки Development было оправдано, с ней проще хранить рядом с разработкой другие объекты, в рамках одной сущности (например, в рамках ветки в СКВ). Хотя это, конечно, не критично.
В рамках наших процессов, использование отдельной папки Development было оправдано, с ней проще хранить рядом с разработкой другие объекты, в рамках одной сущности (например, в рамках ветки в СКВ)
Сделайте так чтоб он не создавал эту папку. вы же все равно явно указываете куда сохранять. Я думаю разработчики сами смогут справится с менеджментом папок.
Добрый день! Просвятите пожалуйста что за параметр path1? Не получается экспортировать с типом аутентификации - win.
Запускал так: DevelopmentTransferUtility --mode "export" --type "standard" --devfolder "C:\DTU\DEV\" --clientpartpath "C:\Program Files (x86)\DIRECTUM Company\DIRECTUM 5.3" --server "server" --database "DIRECTUM" --username "user" --password "pass" --authtype "win"
Ниже привожу лог:
2017-10-17 08:24:29.7517 INFO NpoComputer.DevelopmentTransferUtility.Common.EntryPoint Экспорт из базы данных: запущен.
2017-10-17 08:24:29.7817 ERROR NpoComputer.DevelopmentTransferUtility.Common.EntryPoint Экспорт из базы данных: ошибка. System.ArgumentNullException: Value cannot be null.
Parameter name: path1
at System.IO.Path.Combine(String path1, String path2)
at NpoComputer.DevelopmentTransferUtility.Common.TransferDevelopmentRunner.get_ExportUtilityFullFileName()
at NpoComputer.DevelopmentTransferUtility.Common.TransferDevelopmentRunner.Execute()
at NpoComputer.DevelopmentTransferUtility.Common.EntryPoint.ExportDevelopment(ICommandLineOptions options, String developmentFileName)
2017-10-17 08:24:29.7817 ERROR NpoComputer.DevelopmentTransferUtility.Common.EntryPoint Возникла ошибка: Value cannot be null.
Parameter name: path1
ОПытным путем выяснил: в параметре --devfolder "C:\DTU\DEV\" нужно убрать кавычки. А почему --clientpartpath понимает эти кавычки??
Алексей, с кавычками, при вызове из командной строки, действительно все не однозначно. Например, можно убрать из вашего пути "C:\DTU\DEV\" крайний слэш и такой вариант тоже сработает. Рекомендую попробовать для вызова утилиты использовать VBS-скрипт. Его, к тому же, проще менять.
Например, такой (переделал свой, не отлаживал):
Объясните плиз, что за информация выводится в первой колонке, где как я понимаю должно быть время?
Локальное время на компе 9:44 по москве. Из скрипта повершелл запускаю утилиту:
получаю вывод в окно терминала:
09:10:04 Экспорт из базы данных: запущен.
09:10:26 Экспорт из базы данных: завершен.
09:10:27 Преобразование пакета в структуру папок: запущено.
09:10:27 Чтение пакета ТМ: запущено.
09:10:27 Чтение пакета ТМ: завершено.
09:10:28 Экспорт типовых маршрутов: завершен (экспортировано 50)
09:10:29 Удаление типовых маршрутов: завершено (удалено 0)
09:10:29 Чтение пакета ТМ: запущено.
09:10:29 Чтение пакета ТМ: завершено.
09:10:29 Экспорт групп типовых маршрутов: завершен (экспортировано 8)
09:10:30 Удаление групп типовых маршрутов: завершено (удалено 0)
09:10:30 Чтение пакета ТМ: запущено.
09:10:30 Чтение пакета ТМ: завершено.
09:10:31 Экспорт ролей типовых маршрутов: завершен (экспортировано 28)
09:10:31 Удаление ролей типовых маршрутов: завершено (удалено 0)
09:10:31 Преобразование пакета в структуру папок: завершено.
09:10:32 Готово!
что за 9:10? когда у меня 9:44. и как он в 09:10:26 Экспорт из базы данных: завершен. если 09:10:32 Готово!??
и как он в 09:10:26 Экспорт из базы данных: завершен. если 09:10:32 Готово!??
с этим разобрался. остался вопрос что за время он выводит?
Сделайте возможным указывать в какой кодировке сохранять. UTF-8 надо.
Денис, по поводу времени: это ошибка в App.config. Там где, настраивается формат вывода (layout="${date:format=HH\:MM\:ss} ${message}") надо заменить MM на mm. Иначе выводится текущий месяц вместо минут:)
Спасибо! :)
Если нет TFS как ограничить импорт разработки только измененными элементами?
Например сделали полный экспорт всей разработки, потом модифицировали справочник/функцию и т.д., экспортировали в туже папку. Как теперь импортировать в другую базу только эту измененную разработку?
Денис, для фильтрации при импорте можно использовать параметр --importfolders. В нем нужно перечислить относительные пути до компонент, которые нужно импортировать, например: "RouteBlocks\AddTaskInfoToRRC,RouteBlocks\AllAssignmentsProcessed,RouteBlocks\ConfirmationEnter".
Если указать путь до справочника, он зависимости сможет подтянуть? функции которые из него вызываются например.
Денис, утилита учитывает те же зависимости, которые обрабатываются утилитой SBDte. То есть, например, связанные реквизиты подтянуться автоматически, а вот вызываемые в событиях функции - нет.
Исходники утилиты опубликованы на GitHub: DevelopmentTransferUtility
Спасибо!
теперь осталось сделать интеграцию DTU с гитом, и заживем....
Закинул на гитхабе иссью https://github.com/DirectumCompany/DevelopmentTransferUtility/issues/1.
Отличная утилита, но есть проблема с кодировкой выгружаемых XML, что препятствует полноценному использованию.
Добавили опцию для конвертации выгружаемой разработки в UTF-8 https://github.com/DirectumCompany/DevelopmentTransferUtility/pull/4
Проверили на своей разработке, в sourcetree и Visual Studio Code всё отображается корректно.
Было
Стало
а при импорте обратно в директум все работает (в 1251 перевод)?
Импорт в кодировке UTF-8 еще не проверяли.
Обратную конвертацию не делали. Сделаем если понадобится.
Как и ожидалось запаковка в UTF-8 не проходит. Чуть позже добавим обратную конвертацию налету перед упаковкой в пакет.
Итог:
Изменения тут https://github.com/DirectumCompany/DevelopmentTransferUtility/pull/4
Что-нибудь планируется сделать с тем, чтобы код МД выгружался с помощью утилиты аналогично ТМ?
(Хранение мастеров действий отдельными файлами)
Авторизуйтесь, чтобы написать комментарий