11) Сборки

Лекция по технологии программирования

Относительно слайдов добавлено =

  • Комментарии к коду примера файла сборки

----------------------

Сборки на примере платформы дот нэт = .NET

Приложение

Приложение представляет собой набор файлов, который может включать:

  1. файлы с исходным кодом;
  2. файлы библиотек;
  3. ресурсные файлы (растровые изображения, пиктограммы, текстовые и двоичные данные и т.д.)

Создание приложения

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

Сборка

Сборкой (assembly) называется логический набор модулей, которые являются частью одной версии приложения

Сборка представляет собой единый элемент развертывания приложений: она используется для упаковки, загрузки и распространения модулей

Манифест сборки


Полная информация
о сборке хранится в ее манифесте

Манифестом сборки называется порция метаданных, содержащая информацию о местоположении всех модулей, входящих в сборку, ее версии, региональном стандарте, авторе

Имя сборки

Манифест присоединяется к одному из модулей сборки, либо для его хранения создается специальный пустой модуль

Сборка идентифицируется своим именем, которое, в общем случае, состоит из 4-х частей:

  1. «дружественного» текстового имени,
  2. номера версии,
  3. идентификатора регионального стандарта,
  4. идентификатора разработчика

О них подробнее =
1) Первая часть имени сборки (атрибут Name) является обязательной и, обычно, содержит имя файла, в котором находится манифест сборки

2) Идентификатор регионального стандарта (атрибут CultureInfo) применяется только в т.н. сателлитных сборках, которые могут хранить только ресурсные данные, но не код

3) Номер версии также состоит из 4-х чисел: =

  1. Major – основная версия,
  2. Minor – второстепенная версия приложения или библиотеки,
  3. Build – номер построения приложения или библиотеки,
  4. Revision – номер ревизии для текущего построения

Первые два (Major и Minor ) называются основной частью версии, а вторые (Build и Revision) - дополнительной.

4) Идентификатор разработчика- позволяет определить - кто является издателем приложения (/версии приложения)

Создание сборок

Создание сборок представляет собой сложный процесс, включающий большой перечень задач, в том числе: =

  1. компиляцию модулей с исходным кодом,
  2. генерацию части исходных кодов из декларативного описания;
  3. генерацию документации по исходным кодам проекта;
  4. генерацию дескрипторов развертывания по исходным кодам проекта

А также:

  1. конфигурирование проекта под различные версии библиотек;
  2. перекодирование и архивирование файлов;
  3. создание инсталлятора

Следует также иметь в виду, что сборка, может иметь специальное назначение (например - быть демоверсией приложения), что потребуется учитывать при ее создании .

АВТОМАТИЗАЦИЯ СБОРКИ

Для автоматизации процесса сборки приложения разработаны различные программные средства, т. н. системы сборки
Наиболее известными из них являются =

  1. make (в различных вариантах gmake, nmake),
  2. Ant (для Java-проектов),
  3. NAnt (для .NET-проектов) и др.

---------------------------------------------

Утилита NAnt

NAnt — это свободное (open source) инструментальное ПО для автоматизации процесса сборки приложений
От широко известного продукта Apache Ant отличается отсутствием привязки к языку Java
Первый релиз NAnt был зарегистрирован на Source Forge 18 июля 2001года

Файл сборки

Для создания сборки с помощью NAnt надо написать файл сборки (build-file),представляющий собой XML-файл, в котором с помощью специальных тегов описываются действия при сборке
причём =

  • [один] Файл сборки соответствует одному проекту
  • Файл сборки проекта состоит из заданий или целей (targets)

Атрибуты проекта

Для проекта дополнительно могут быть определены:
цель по умолчанию (default target), которая выполняется при отсутствии других целей;
базовый каталог (base directory ), используемый в качестве рабочего при сборке приложения
---------------
ПРИМЕР ПРОЕКТА ДЛЯ NAnt =

ВНИМАНИЕ= здесь и далее в примерах XML - по техническим причинам мы не можем корректно отобразить код - добавьте открывающий знак "меньше" для каждого тэга
Пример проекта (файл сборки)

<?xml version="1.0"?>
    project name="Hello World" default="build" basedir=".">
        description>The Hello World of build files.</description>
        property name="debug" value="true" overwrite="false" /> /**/
        target name="clean" description="remove all generated files"> /* ЦЕЛЬ*/
            delete file="HelloWorld.exe" failonerror="false" /> /*удаление файла*/
            delete file="HelloWorld.pdb" failonerror="false" />
        /target>
        target name="build" description="compiles the source code"> /* начало описания цели = цель
 компиляции исходного кода*/
            csc target="exe" output="HelloWorld.exe" debug="${debug}">  /*начало описания команды =
  указываем формат выходного файла и его полное имя . 
сборка физически может  быть реализована
 в виде exe (исполняюемый файл) или DLL  
(библиотека функций, пристёгиваемая к исполняемому файлу) . С помощью DLL обычно распространяются компонанты  */
                sources>   /*дин из параметров для выполнения команды -
 указываем файл с исходным кодом на си шарпе*/
                    includes name="HelloWorld.cs" />
                /sources>
            /csc>
        /target>
    /project>

В приведенном примере определены следующие две цели =

  1. «clean»
  2. и «build»

Выполняемой по умолчанию является цель «build».

О ЗНАЧЕНИИ ТЭГОВ ЧИТАЙТЕ ДАЛЕЕ

Цель

Цель идентифицируется именем – name и может иметь дополнительные атрибуты:

  1. depends – список имен целей, от которых зависит данная;
  2. if – условие, при котором должно выполняться задание;
  3. unless – условие, при котором данное задание должно игнорироваться;
  4. description – краткое описание цели

Зависимости целей

Цели могут зависеть от других целей: в этом случае перед выполнением текущей цели выполняются все цели, от которых она зависит
Цепочка зависимостей целей может быть достаточно длинной

В следующем примере задачи должны выполняться в последовательности A -> B -> C -> D:

   <target name="A"/>
 	target name="B" depends="A" />
 	target name="C" depends="B" /> 
	target name="D" depends="C,B,A" /> 

Задачи

Каждая цель описывается в виде последовательности команд или задач (tasks)
Команды могут иметь параметры, которые в файлах сборки записываются в виде атрибутов соответствующих тегов

Свойства

При указании параметров можно ссылаться на переменные (свойства) с помощью конструкции

${propertyname}

Свойства имеют имена и значения и определяются командой property:
Эта команда имеет ряд параметров, основными из которых являются параметры name и value

Примеры описания свойств

property name="project.name" value="HelloWorld" />   = задаём имя переменной и её значение

  property name="project.dir"
            value="${project::get-base-directory()}" />

  property name="nant.home"
            value="${environment::get-variable('NANT_HOME')}"
            if="${environment::variable-exists('NANT_HOME')}" /> /*  = здесь задаётся имя и значение 
свойства (NANT_HOME)  в случае её пресутствие (по крайней мере такова трактовка преподавателя) 
*/
  property name="nantcontrib.home"
            value="${environment::get-variable('NANTCONTRIB_HOME')}"
            if="${environment::variable-exists('NANTCONTRIB_HOME')}" /> 
			

Глобальные свойства

Часто свойства определяются отдельно от какой-либо цели, т.е. в глобальном контексте
При этом эти команды задания свойств будут выполнены до выполнения какой-либо цели сборки; таким способом, как правило, устанавливаются свойства проекта, подключаются дополнительные модули NAnt и т.п.

----------------

Функции

Кроме переменных при определении параметров доступен ряд функции – в приведенном выше примере это

project::get-base-directory

(возвращает имя базового каталога) и

environment::get-variable  

---------------------------

=================================

КАМАНДЫ NAnt =

Список команд NAnt (ЗНАЧЕНИЯ ТЭГОВ ДЛЯ ПРИМЕРА ВЫШЕ)=

Команды NAnt
Здесь приводятся только часть наиболее часто используемых команд, весь список доступных команд, а также параметры команд приведены в документации.

(Имя команды = Описание команды)

  1. call = выполнение какой-либо цели из текущего скрипта сборки
  2. copy = копирования файлов/директорий
  3. csc = компиляция C# файлов
  4. delete = удаление файлов/директорий
  5. echo = вывод сообщения
  6. exec = выполнение внешней команды (exe, bat и т.п.)
  7. fail = генерация ошибки сборки
  8. foreach = выполнение вложенных действий для каждого элемента списка (список может быть списком файлов)
  9. get = загрузка файла по URL
  10. if = выполнение вложенных действий по условию
  11. ifnot = выполнение вложенных действий по невыполнению условия
  12. include = подключение к текущему внешнего скрипта сборки
  13. loadfile = загрузка содержимого файла в свойство
  14. loadtasks = загрузка расширения NAnt
  15. mail = отправка email-сообщения
  16. mkdir = создание директории
  17. move = перемещение файлов/директорий
  18. nant = запуска отдельного NAnt в отдельном процессе
  19. nunit = запуск тестов NUnit V1.0
  20. nunit2 = запуск тестов NUnit V2.2
  21. property = установка значения свойства
  22. readregistry = чтение значений реестра Windows в свойства
  23. regex = установка значения свойства по результатам вычисления регулярного выражения
  24. script = выполнение C#/Vb/… кода, записанного внутри тега
  25. setenv = установка значения переменной окружения
  26. sleep = задержка выполнения скрипта на промежуток времени
  27. tar архивирование файлов в формат tar
  28. unzip = извлечение файлов из архива zip
  29. zip = архивирование файлов в формат zip

=========================
----------------------------------------------------

Средства конфигурирования

Все команды NAnt имеют атрибуты if и unless, в которых можно задать условие, по которому будет выполняться или не выполняться данная команда

Кроме того, имеются команды if и ifnot, которые выполняют вложенные команды в случае выполнения или невыполнения какого-либо условия

----------------

Расширения NAnt

NAnt поддерживает расширения-плагины, в которых могут быть определены дополнительные команды, функции и т.п.
Наиболее известным расширением NAnt является проект NAntContrib (в этом проекте описаны, например, команды для работы с системой контроля версий SVN)

ДАЛЕЕ - СПИСОК КОМАНД

Команды NAntContrib

Здесь приводятся только часть наиболее часто используемых команд, весь список доступных команд, а также параметры команд приведены в документации к проекту NAntContrib

(Имя команды = Описание команды)

astyle = форматирование исходных кодов в соответствии с каким-либо стилем кодирования
cd = смена текущей директории
checksum = вычисление хеш-значения для файлов
codestats = вычисление статистики по исходным кодам
comregister = регистрация сборки в качестве com-сервера
concat = объединение нескольких файлов в один
iniread = чтение значений из ini-файла в свойства
iniwrite = запись значения в ini-файл
msi = создание Windows Installer пакета
nunitreport = генерация html-отчета по NUnit-тестированию
nunit2report = генерация html-отчета по NUnit-тестированию (второй вариант)
sql =выполнение sql-команд в СУБД (подключение по OLEDB)
svn = svn
svn-checkout = svn checkout
svn-update = svn update
version = управление версией программы (хранится в текстовом файле)
wsdl = генерация proxy-классов для взаимодействия с web-сервисом, описанным с помощью wsdl

+++++++++++++++++++++=

Итак - сборки нажны чтобы собрать все необхожимые фалы в одно целое - всё это описыается в файле манифеста.

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

=======================================

Запуск NAnt

Запуск NAnt-сборки осуществляется из командной строки с помощью команды =

nant 

В качестве параметра указывается цель, которую необходимо выполнить. По умолчанию выполняется файл сборки с именем .build или nant.build в текущей директории
Имя файла сборки может быть задано c помощью параметра

 –buildfile

=======================КОНЕЦ ЛЕКЦИИ==================

Далее - примеры файлов ,

пример .build файла (main.build) =

?xml version="1.0"?>

project name="${project.name}">

  include buildfile="doc.build.props" />

  property name="presentation"
            value="${project.sandcastle.presentation}" />


  target name="build_doc" depends="prepare">
    property name="doc.sandcastle.dir" value="${doc.dir}/sandcastle" />
   property name="doc.chm.dir" value="${doc.dir}/chm" />

    mkdir dir="${doc.sandcastle.dir}" />
    mkdir dir="${doc.chm.dir}" />

    property name="sandcastle.config"
              value="${sandcastle.home}/Presentation/${presentation}/Configuration/Sandcastle.config" />

    setenv name="DXROOT" value="${sandcastle.home}" />

    exec program="${sandcastle.mrefbuilder}" workingdir="${doc.sandcastle.dir}"> 
      arg value="/config:${sandcastle.config}" />
      arg value="${bin.debug.dir}/*.dll" />
      arg value="${bin.debug.dir}/*.exe" />
      arg value="/dep:${bin.debug.dir}/*.dll" />
      arg value="/out:reflection.xml" />
    /exec>

    exec program="${sandcastle.xsltransform}" workingdir="${doc.sandcastle.dir}">
      arg value="reflection.xml" />
      arg value="/xsl:${sandcastle.home}/ProductionTransforms/ApplyVSDocModel.xsl" />
      arg value="/xsl:${sandcastle.home}/ProductionTransforms/AddFriendlyFilenames.xsl" />
      arg value="/arg:IncludeAllMembersTopic=true" />
      arg value="/arg:IncludeInheritedOverloadTopics=true" />
      arg value="/out:reflection.xml" />
    /exec>

    exec program="${sandcastle.xsltransform}" workingdir="${doc.sandcastle.dir}">
      arg value="reflection.xml" />
      arg value="/xsl:${sandcastle.home}/ProductionTransforms/ReflectionToManifest.xsl" />
      arg value="/out:manifest.xml" />
    /exec>

    mkdir dir="${doc.sandcastle.dir}/output" />
    mkdir dir="${doc.sandcastle.dir}/output/html" />
    mkdir dir="${doc.sandcastle.dir}/output/icons" />
    mkdir dir="${doc.sandcastle.dir}/output/scripts" />
    mkdir dir="${doc.sandcastle.dir}/output/styles" />
    mkdir dir="${doc.sandcastle.dir}/output/media" />
    copy todir="${doc.sandcastle.dir}/output">
      fileset basedir="${sandcastle.home}/Presentation/${presentation}">
        include name="icons/**/*" />
        include name="scripts/**/*" />
        include name="styles/**/*" />
      /fileset>
    /copy>

    exec program="${sandcastle.buildassembler}" workingdir="${doc.sandcastle.dir}">
      arg value="manifest.xml" />
      arg value="/config:${sandcastle.config}" />
    /exec>

    exec program="${sandcastle.xsltransform}" workingdir="${doc.sandcastle.dir}">
      arg value="reflection.xml" />
      arg value="/xsl:${sandcastle.home}/ProductionTransforms/CreateVSToc.xsl" />
      arg value="/out:toc.xml" />
    /exec>

    exec program="${sandcastle.chmbuilder}" workingdir="${doc.sandcastle.dir}">
      arg value="/project:${project.name}" />
      arg value="/html:output/html" />
      arg value="/lcid:1049" />
      arg value="/toc:toc.xml" />
      arg value="/out:${doc.chm.dir}" />
    /exec>

    exec program="${sandcastle.dbcsfix}">
      arg value="/d:${doc.chm.dir}" />
      arg value="/l:1049" />
    /exec>

    mkdir dir="${doc.chm.dir}/icons" />
    mkdir dir="${doc.chm.dir}/scripts" />
    mkdir dir="${doc.chm.dir}/styles" />
    mkdir dir="${doc.chm.dir}/media" />
    copy todir="${doc.chm.dir}">
      fileset basedir="${doc.sandcastle.dir}/output">
       exclude name="html/**/*" />
        include name="**/*" />
      /fileset>
    /copy>

    trycatch>
      try>
        exec program="${htmlhelp.hhc}" workingdir="${doc.chm.dir}">
          arg value="${project.name}.hhp" />
        /exec>
        fail message="realerror" />
      /try>
      catch property="errormessage">
        fail message="hhc error"
              if="${property::get-value('errormessage')=='realerror'}" />
      /catch>
    /trycatch>

  /target>

/project>

===============================

пример.bat файла (buid.bat) =

--------------

@echo off

call %~sdp0_props.bat


%NANT% -buildfile:%~sdp0main.build build

-------------------------

=======================================================

vedro-compota's picture

(содержимое комментария перенесено в тело сообщения)

_____________
матфак вгу и остальная классика =)