Какое имя имеет исполняемый файл созданного проекта
После нажатия клавиш Применить и ОК откроется подготовленный проект с пустым полем редактора кода, в котором можно начать писать программы. В этом редакторе наберем программу, выводящую традиционное приветствие «Hello, World». Для компиляции созданной программы можно обратиться в меню Build или, например, нажать клавиши Ctrl + F7 . В случае успешной компиляции получим экранную форму, показанную на рис. 1.17.
Рис. 1.17. Успешно скомпилированная первая программа на языке С
Для приведенного кода программы запуск на ее исполнение из окна редактора в Visual Studio 2010 выполняется нажатием клавиши F5 (рис. 1.18).
Рис. 1.18. Консольный вывод первой программы на языке С
сообщает системе, что именем программы является main() – главная функция и что она возвращает целое число, о чем указывает аббревиатура int . Имя main() – это специальное имя, которое указывает, где программа должна начать выполнение [3]. Наличие круглых скобок после слова main свидетельствует о том, что это имя функции. Если содержимое этих скобок отсутствует или в них представлено служебное слово void , то это означает, что в функцию main() не передается никаких аргументов. Тело функции main() ограничено парой фигурных скобок. Все утверждения программы, заключенные в них, будут относиться к этой функции.
В теле функции main() имеются еще три функции. Во-первых, функция printf() находится в библиотеке компилятора языка С и печатает или отображает те аргументы, которые были подставлены вместо параметров. Символ \n означает единый символ newline (новая строка), т. е. с его помощью выполняется перевод на новую строку. Символ \t осуществляет табуляцию, т. е. начало вывода результатов программы с отступом вправо.
Функция без параметров _getch() извлекает символ из потока ввода. С другими компиляторами, может потребоваться getch() без префиксного нижнего подчеркивания.
Последнее утверждение в первой программе return 0;
указывает на то, что выполнение функции main() закончено и что в систему возвращается значение 0 (целое число). Нуль используется в соответствии с соглашением об индикации успешного завершения программы [2].
Все действия в программе завершаются символом точки с запятой.
Все файлы проекта сохраняются в той папке, которая сформировалась после указания в поле Location имени проекта (hello). На рис. 1.19 показаны пап-
ки и файлы проекта Visual Studio 2010 .
Рис. 1.19. Файлы и папки созданного проекта
Каждый файл обладает некоторым значением:
hello.sln – файл решения для созданной программы. Он содержит информацию о том, какие проекты входят в данное решение. Обычно эти проекты расположены в отдельных подкаталогах. Например, наш проект находится в подкаталоге hello;
hello.suo – файл настроек среды Visual Studio при работе с решением включает информацию об открытых окнах, их расположении и прочих пользовательских параметрах.
hello.sdf – файл, содержащий вспомогательную информацию о проекте, который используется инструментами анализа кода Visual Studio, такими как IntelliSense для отображения подсказок об именах и т. д.
Файлы папки Debug представлены на рис.1.20.
Рис. 1.20. Файлы папки Debug
Рассмотрим файлы папки Debug:
hello.exe – исполняемый файл проекта;
hello.ilk – файл «incremental linker», используемый компоновщиком для ускорения процесса компоновки;
hello.pdb – отладочная информация(информация об именах в исполняемых файлах, используемая отладчиком).
Файлы папки hello показаны на рис. 1.21.
Рис. 1.21. Содержимое папки hello
Характеристика содержимого папки hello :
main.c – файл исходного программного кода;
hello.vcxproj – файл проекта;
hello.vcxproj.filters – файл с описанием фильтров, используемых Visual Studio Solution Explorer для организации и отображения файлов с исходным кодом.
Выполните задания на основе рассмотренной программы hello .
1. Напишите программу, которая выводила бы на консоль название факультета, где Вы учитесь, номер группы, Ваши фамилию, имя и отчество в разных строках дисплея (консоли) с помощью одной функции
2. Вывод выполните с помощью нескольких функций printf() (количество функций должно соответствовать каждой порции информации).
3. Для задания 2 вывод информации выполните в различных строках подряд, т. е. без межстрочного пропуска.
4. Проверьте программу без ключевого слова void для функции main() .
П р и м е ч а н и е . Вывод требуемой информации осуществляется с помощью букв латинского алфавита. Комментарии в программе могут быть сделаны
после символа // или внутри комбинации символов /*
1. Какие компиляторы языка С Вам известны?
2. Какое имя имеет исполняемый файл созданного проекта?
3. Каково назначение заголовочных файлов stdio.h , conio.h ?
4. Как будет работать программа без заголовочного файла conio.h ?
5. В каком месте программы находится точка ее входа?
6. Как осуществляется табуляция строки на консоли и на сколько позиций выполняется отступ от левого края?
7. Какое значение имеет главная функция проекта main() в программах на языке С ?
1. Керниган Б. У . Язык программирования С : пер. с англ./Б. У. Керниган, Д. М. Ритчи. – 2-е изд. – М. : Вильямс, 2007. – 304 с.
2. Кочан С . Программирование на языке С : пер. с англ./С. Кочан. –
3-е изд. – М. : Вильямс, 2007. – 496 с.
3. Дейтл Х. М . Как программировать на С : пер. с англ./Х. М. Дейтл, П. Дж. Дейтл. – 4-е изд. – М. : Бином-Пресс, 2006. – 912 с.
ПЕРЕМЕННЫЕ И БАЗОВЫЕ ТИПЫ ДАННЫХ ЯЗЫКА С
Ставится задача изучения базовых типов языка программирования С и их размеров, объявлений и программ с переменными, включая простейшие арифметические операции. В практической части рассматриваются примеры с их полной программной реализацией.
Фундаментальные объекты данных, с которыми работает программа, – это переменные и константы [1]. Используемые в программе переменные перечисляются в объявлениях или декларациях, в которых указывается их тип, а также иногда их начальные значения.
С именами переменных связывается тип данных, который контролируется компилятором и для которого выделяется определенное количество байтов памяти [2]. Имена переменных должны начинаться с буквы латинского алфавита или символа подчеркивания (например, _aza ), за которым могут следовать любые комбинации букв в любом регистре (прописные или строчные), символы подчеркивания либо цифры 0–9. В языке С имеется различие между заглавными и строчными буквами. Поэтому переменная World будет отличаться от переменной world и т. п. При этом в определении переменной не разрешаются символ пробела (пробелов) и некоторые другие символы, например $ .
Стандарт С89 определяет пять базовых типов данных [4]:
int – целочисленный тип, целое число;
float – вещественное число одинарной точности с плавающей точкой;
double – вещественное число двойной точности с плавающей точкой;
char – символьный тип для определения одного символа;
void – тип без значения.
Кроме того, существуют модификаторы, которые могут применяться к указанным базовым типам [1]. Ряд компиляторов поддерживает еще и логический тип _Bool . Тип void служит для объявления функции, не возвращающей значения, или для создания универсального указателя (pointer).
Объект типа char всегда занимает 1 байт памяти [4]. Размеры объектов других типов, как правило, зависят от среды программирования и операционной системы. Приведем модификаторы базовых типов данных. К ним относятся следующие спецификаторы:
signed, unsigned, long, short
Базовый тип int может быть модифицирован каждым из перечисленных спецификаторов, тип char – с помощью unsigned и signed , тип double – с помощью long [4].
В табл.2.1 приведены допустимые комбинации типов данных языка С с их минимальным диапазоном значений и типичным размером [4].
Типы данных языка С
Минимально допустимый диапазон
от –32 767 до 32 767
от –32 767 до 32 767
от –32 767 до 32 767
unsigned short int
signed short int
от –32 767 до 32 767
от –2 147 483 647 до 2 147 483 647
от –(2 63 – 1 ) до (2 63 – 1) для С99
signed long int
от –2 147 483 647 до 2 147 483 647
unsigned long int
от 0 до 4 294 967 295
unsigned long long int
от 0 до (2 64 – 1) для С99
от 1Е – 37 до 1Е + 37 (с точностью
не менее 6 значащих десятичных
от 1Е – 37 до 1Е + 37 (с точностью
не менее 10 значащих десятичных
от 1Е – 37 до 1Е + 37 (с точностью
не менее 10 значащих десятичных
Для базового типа int возможны следующие записи с модификатором:
short или short int .
Для данных вещественного типа максимальные значения абсолютных ве-
личин представлены в табл.2.2 [4].
Вещественные типы данных языка С
Диапазон абсолютных величин
от 3.4Е – 4932 до 1.1Е + 4932
В языке С предусматриваются преобразование типов в выражениях и приведение типов. Если в выражении смешаны различные типы литералов и переменных, то компилятор преобразует их в один. Во-первых, все char и short int значения автоматически преобразуются (с расширением «типоразмера») в тип int . Этот процесс называется целочисленным расширением (integral promotion). Во-вторых, все операнды преобразуются (также с расширением «типоразмера») в тип самого большого операнда . Этот процесс называется расширением типа (type promotion), выполняется он пооперационно. Например, если один операнд имеет тип int , а другой – long int , то тип i nt расширяется в тип long int . Или если хотя бы один из операндов имеет тип double , то любой другой операнд приводится к типу double . Это означает, что такие преобразования, как char в double , вполне допустимы (если предусматривать, к чему это приведет). После преобразования оба операнда будут иметь один и тот же тип, а результат операции – тип, совпадающий с типом операндов [4]. Приведем последовательность преобразования типов в выражениях по старшинству.
Если операнд имеет тип long double ,
то второй операнд преобразуется в long double . Иначе если операнд имеет тип double ,
то второй операнд преобразуется в double . Иначе если операнд имеет тип float ,
то второй операнд преобразуется в float . Иначе если операнд имеет тип unsigned long ,
то второй операнд преобразуется в unsigned long . Иначе если операнд имеет тип long ,
то второй операнд преобразуется в long . Иначе если операнд имеет тип unsigned int ,
то второй операнд преобразуется в unsigned int .
Кроме того, действует правило: если один из операндов имеет тип long , второй – unsigned int , а значение unsigned int не может быть представлено типом long , то оба операнда преобразуются в значение типа unsigned long .
В языке С предусматривается явное преобразование (приведение) типов. Общая форма оператора явного приведениявыглядит так: (тип) выражение . Здесь тип – это любой поддерживаемый тип данных. Явное преобразование типа – это операция. Оператор приведения типа является унарным и имеет тот же приоритет, что и остальные унарные операторы.
В приводимых ниже программах используются такие средства ввода-
вывода, как printf() , getchar() , gets() , scanf() . Приведем характе-
ристику данных функций в соответствии с их прототипами [4]. Прототип функции printf() имеет следующий вид: int printf(const char *format, );
Функция printf() записывает в стандартный поток stdout (стандартный выходной поток данных) значения аргументов из заданного списка в соответствии со строкой форматирования, адресуемой параметром format . Строка форматирования состоит из элементов двух типов. К элементам первого типа относятся символы, которые выводятся на экран. Элементы второго типа содержат спецификации формата, определяющие способ отображения аргументов. Спецификация формата начинается символом процента % , за которым следует код формата. На спецификации могут воздействовать модификаторы, задающие ширину поля, точность и признак выравнивания по левому краю. Целое значение, расположенное между % и командой форматирования, играет роль спецификации минимальной ширины поля. Наличие этого спецификатора приводит к тому, что результат будет заполнен пробелами или нулями, чтобы выводимое значение занимало поле, ширина которого не меньше заданной минимальной ширины. По умолчанию в качестве заполнителя используется пробел (пробелы). Для заполнения нулями перед спецификацией ширины поля нужно поместить нуль. Например, спецификация формата %05d дополнит нулями выводимое целое число, в котором менее пяти цифр, чтобы общая длина равнялась пяти символам. Действие модификатора точности зависит от кода формата, к которому он применяется. Чтобы добавить этот модификатор, следует поставить за спецификатором ширины поля десятичную точку, а после – требуемое значение точности (число знаков после десятичной точки). Применительно к целым числам модификатор точности задает минимальное количество выводимых цифр. При необходимости перед целым числом будут добавлены нули. Если данный модификатор применяется к строкам, то число, следующее за точкой, задает максимальную длину поля. Например, спецификация %5.7s выведет строку длиной не менее пяти, но не более семи символов. Если выводимая строка окажется длиннее максимальной длины поля, конечные символы будут отсечены. По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, то оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак «минус» ( – ) сразу после знака процента. Например, спецификация формата %–10.4f обеспечит выравнивание вещественного числа с четырьмя десятичными знаками по левому краю в 10-символьном поле. Существуют два модификатора формата, позволяющие функции printf() отображать короткие и длинные целые числа. Модификатор l (латинская буква «эль») уведомляет функцию printf() о длинном типе значения. Модификатор h сообщает функции printf() , что нужно вывести число короткого целого типа. Кроме того, модификатор l можно поставить перед командами форматирования вещественных чисел, в этом случае он уведомит о выводе зна-
сообщает системе, что именем программы является main() – главная функция , и что она возвращает целое число , о чем указывает аббревиатура "int". Имя main() – это специальное имя, которое указывает, где программа должна начать выполнение [1.1]. Наличие круглых скобок после слова main() свидетельствует о том, что это имя функции . Если содержимое круглых скобок отсутствует или в них содержится служебное слово void, то это означает, что в функцию main() не передается никаких аргументов. Тело функции main() ограничено парой фигурных скобок. Все утверждения программы, заключенные в фигурные скобки , будут относиться к функции main() .
В теле функции main() имеются еще три функции. Во-первых, функции printf() находятся в библиотеке компилятора языка С, и они печатают или отображают те аргументы, которые были подставлены вместо параметров. Символ "\n" составляет единый символ newline (новая строка), т.е. с помощью этого символа осуществляется перевод на новую строку. Символ "\t" осуществляет табуляцию, т.е. начало вывода результатов программы с отступом вправо.
Функция без параметров _getch() извлекает символ из потока ввода (т.е. ожидает нажатия почти любой клавиши). С другими компиляторами, возможно, потребуется getch() , т.е. без префиксного нижнего подчеркивания.
Последнее утверждение в первой программе
указывает на то, что выполнение функции main() закончено и что в систему возвращается значение 0 ( целое число ). Нуль используется в соответствии с соглашением об индикации успешного завершения программы [1.3].
В завершение следует отметить, что все действия в программе завершаются символом точки с запятой.
Все файлы проекта сохраняются в той папке, которая сформировалась после указания в поле Location имени проекта (hello). На рис. 1.19 показаны папки и файлы проекта Visual Studio 2010..
На рис. 1.19 файлы с полученными расширениями означают:
hello.sln – файл решения для созданной программы. Он содержит информацию о том, какие проекты входят в данное решение. Обычно, эти проекты расположены в отдельных подкаталогах. Например, наш проект находится в подкаталоге hello;
hello.suo – файл настроек среды Visual Studio при работе с решением, включает информацию об открытых окнах, их расположении и прочих пользовательских параметрах.
hello.sdf – файл содержащий вспомогательную информацию о проекте, который используется инструментами анализа кода Visual Studio , такими как IntelliSense для отображения подсказок об именах и т.д.
Файлы папки Debug показаны на рис. 1.20.
Рассмотрим файлы в соответствии с рис. 1.20.
hello.exe – исполняемый файл проекта;
hello.ilk – файл " incremental linker", используемый компоновщиком для ускорения процесса компоновки;
hello.pdb – отладочная информация / информация об именах в исполняемых файлах, используемая отладчиком.
Файлы папки hello показаны на рис. 1.21.
Характеристика содержимого папки hello:
main.c – файл исходного программного кода,
hello.vcxproj – файл проекта,
hello.vcxproj.filters – файл с описанием фильтров, используемых Visual Studio Solution Explorer для организации и отображения файлов с исходным кодом.
Разделение файлов Project для поддержки нескольких сред
Предположим, что вы хотите иметь возможность развернуть решение в нескольких средах, таких как тестовые серверы, промежуточные платформы и рабочие среды. Конфигурация может существенно отличаться между этими средами, а не только с точки зрения имен серверов, строк подключения и т. д., но и потенциально с точки зрения учетных данных, параметров безопасности и многих других факторов. Если это нужно делать регулярно, не рекомендуется изменять несколько свойств в файле проекта при каждом переключении целевой среды. Кроме того, это идеальное решение для предоставления бесконечного списка значений свойств процессу сборки.
К счастью, есть альтернатива. MSBuild позволяет разделить конфигурацию сборки между несколькими файлами проекта. Чтобы узнать, как это работает, обратите внимание, что в примере решения есть два пользовательских файла проекта:
- Publish.proj, который содержит свойства, элементы и целевые объекты, общие для всех сред.
- Env-Dev.proj, который содержит свойства, относящиеся к среде разработчика.
Теперь обратите внимание, что файл Publish.proj содержит элемент Import сразу под открывающим тегом Project.
Элемент Import используется для импорта содержимого другого файла проекта MSBuild в текущий файл проекта MSBuild. В этом случае параметр TargetEnvPropsFile предоставляет имя файла проекта, который требуется импортировать. При запуске MSBuild можно указать значение для этого параметра.
Это эффективно объединяет содержимое двух файлов в один файл проекта. С помощью этого подхода можно создать один файл проекта, содержащий универсальную конфигурацию сборки и несколько дополнительных файлов проекта, содержащих свойства конкретной среды. В результате простое выполнение команды с другим значением параметра позволяет развернуть решение в другой среде.
Разделение файлов проекта таким образом является рекомендуемым способом. Это позволяет разработчикам развертывать в нескольких средах, выполняя одну команду, избегая дублирования свойств универсальной сборки в нескольких файлах проекта.
Инструкции по настройке файлов проекта для конкретной среды для собственных серверных сред см. в разделе "Настройка свойств развертывания для целевой среды".
Свойства и условия
Файл проекта обычно должен предоставлять множество различных фрагментов информации, чтобы успешно выполнить сборку и развертывание проектов. Эти сведения могут включать имена серверов, строки подключения, учетные данные, конфигурации сборки, пути к исходному и целевому файлам, а также любые другие сведения, которые вы хотите включить для поддержки настройки. В файле проекта свойства должны быть определены в элементе PropertyGroup . MSBuild свойства состоят из пар "ключ-значение". В элементе PropertyGroup имя элемента определяет ключ свойства, а содержимое элемента определяет значение свойства. Например, можно определить свойства с именами ServerName и ConnectionString для хранения имени статического сервера и строки подключения.
Чтобы получить значение свойства, используйте формат $(PropertyName). Например, чтобы получить значение свойства ServerName , необходимо ввести следующее:
Вы увидите примеры использования значений свойств далее в этом разделе.
Внедрение сведений в виде статических свойств в файл проекта не всегда является идеальным подходом к управлению процессом сборки. В большинстве сценариев вам потребуется получить информацию из других источников или предоставить пользователю возможность предоставлять информацию из командной строки. MSBuild позволяет указать любое значение свойства в качестве параметра командной строки. Например, пользователь может указать значение serverName при выполнении MSBuild.exe из командной строки.
Дополнительные сведения о аргументах и параметрах, которые можно использовать с MSBuild.exe, см. в MSBuild справочнике по командной строке.
Для получения значений переменных среды и встроенных свойств проекта можно использовать тот же синтаксис свойств свойств. Для вас определены многие часто используемые свойства, и их можно использовать в файлах проекта, включив соответствующее имя параметра. Например, чтобы получить текущую платформу проекта (например, x86 или AnyCpu), можно включить ссылку на свойство $(Platform) в файл проекта. Дополнительные сведения см. в разделе "Макросы" для команд и свойств сборки, общих MSBuild Project свойств и зарезервированных свойств.
Свойства часто используются в сочетании с условиями. Большинство MSBuild элементов поддерживают атрибут Condition, который позволяет указать критерии, по которым MSBuild должен оценивать элемент. Например, рассмотрим это определение свойства:
Когда MSBuild обрабатывает это определение свойства, сначала проверяется, доступно ли значение свойства $(OutputRoot). Если значение свойства пусто ( другими словами, пользователь не предоставил значение для этого свойства), условие принимает значение true , а значение свойства — .. \Publish\Out. Если пользователь предоставил значение для этого свойства, условие принимает значение false , а значение статического свойства не используется.
Дополнительные сведения о различных способах указания условий см. в разделе MSBuild Условия.
Заключение
В этом разделе приводятся общие сведения о MSBuild файлах проекта и описано, как создавать собственные пользовательские файлы проекта для управления процессом сборки. Она также представила концепцию разделения файлов проекта на универсальные инструкции сборки и свойства сборки для конкретной среды, чтобы упростить сборку и развертывание проектов в нескольких местах назначения.
В следующем разделе, в разделе "Общие сведения о процессе сборки", вы узнаете, как использовать файлы проекта для управления сборкой и развертыванием, пройдя по развертыванию решения с реалистичным уровнем сложности.
Практическая часть
В практической части выполните следующие задания на основе рассмотренной программы hello:
- Напишите программу, которая выводила бы на консоль название факультета, где учитесь, номер группы, свою фамилию, имя и отчество в разных строках дисплея (консоли) с помощью одной функции printf() .
- Вывод выполните с помощью нескольких функций printf() (количество функций должно соответствовать каждой порции информации).
- Для задания пункта 2 вывод информации выполните в различных строках подряд, т.е. без межстрочного пропуска.
- Проверьте программу без ключевого слова void для функции main() .
Примечание. Вывод требуемой информации осуществляется с помощью букв латинского алфавита. Комментарии в программе могут быть сделаны после символа "//" или внутри комбинации символов "/* */".
сообщает системе, что именем программы является main() – главная функция , и что она возвращает целое число , о чем указывает аббревиатура "int". Имя main() – это специальное имя, которое указывает, где программа должна начать выполнение [1.1]. Наличие круглых скобок после слова main() свидетельствует о том, что это имя функции . Если содержимое круглых скобок отсутствует или в них содержится служебное слово void, то это означает, что в функцию main() не передается никаких аргументов. Тело функции main() ограничено парой фигурных скобок. Все утверждения программы, заключенные в фигурные скобки , будут относиться к функции main() .
В теле функции main() имеются еще три функции. Во-первых, функции printf() находятся в библиотеке компилятора языка С, и они печатают или отображают те аргументы, которые были подставлены вместо параметров. Символ "\n" составляет единый символ newline (новая строка), т.е. с помощью этого символа осуществляется перевод на новую строку. Символ "\t" осуществляет табуляцию, т.е. начало вывода результатов программы с отступом вправо.
Функция без параметров _getch() извлекает символ из потока ввода (т.е. ожидает нажатия почти любой клавиши). С другими компиляторами, возможно, потребуется getch() , т.е. без префиксного нижнего подчеркивания.
Последнее утверждение в первой программе
указывает на то, что выполнение функции main() закончено и что в систему возвращается значение 0 ( целое число ). Нуль используется в соответствии с соглашением об индикации успешного завершения программы [1.3].
В завершение следует отметить, что все действия в программе завершаются символом точки с запятой.
Все файлы проекта сохраняются в той папке, которая сформировалась после указания в поле Location имени проекта (hello). На рис. 1.19 показаны папки и файлы проекта Visual Studio 2010..
На рис. 1.19 файлы с полученными расширениями означают:
hello.sln – файл решения для созданной программы. Он содержит информацию о том, какие проекты входят в данное решение. Обычно, эти проекты расположены в отдельных подкаталогах. Например, наш проект находится в подкаталоге hello;
hello.suo – файл настроек среды Visual Studio при работе с решением, включает информацию об открытых окнах, их расположении и прочих пользовательских параметрах.
hello.sdf – файл содержащий вспомогательную информацию о проекте, который используется инструментами анализа кода Visual Studio , такими как IntelliSense для отображения подсказок об именах и т.д.
Файлы папки Debug показаны на рис. 1.20.
Рассмотрим файлы в соответствии с рис. 1.20.
hello.exe – исполняемый файл проекта;
hello.ilk – файл " incremental linker", используемый компоновщиком для ускорения процесса компоновки;
hello.pdb – отладочная информация / информация об именах в исполняемых файлах, используемая отладчиком.
Файлы папки hello показаны на рис. 1.21.
Характеристика содержимого папки hello:
main.c – файл исходного программного кода,
hello.vcxproj – файл проекта,
hello.vcxproj.filters – файл с описанием фильтров, используемых Visual Studio Solution Explorer для организации и отображения файлов с исходным кодом.
Структура файла Project
Прежде чем подробно ознакомиться с процессом сборки, стоит ознакомиться с базовой структурой файла проекта MSBuild. В этом разделе приводятся общие сведения о наиболее распространенных элементах, которые вы столкнетесь при просмотре, изменении или создании файла проекта. В частности, вы узнаете:
- Использование свойств для управления переменными для процесса сборки.
- Как использовать элементы для идентификации входных данных процесса сборки, таких как файлы кода.
- Использование целевых объектов и задач для предоставления инструкций по выполнению для MSBuild с помощью свойств и элементов, определенных в другом месте файла проекта.
Здесь показана связь между ключевыми элементами в файле проекта MSBuild:
соглашения об именовании файлов Project
При создании собственных файлов проекта можно использовать любое расширение файла. Тем не менее, чтобы упростить понимание решений для других пользователей, следует использовать следующие общие соглашения:
- Используйте расширение PROJ при создании файла проекта, который создает проекты.
- Используйте расширение TARGETS при создании повторно используемого файла проекта для импорта в другие файлы проекта. Файлы с расширением TARGETS обычно не создают ничего самостоятельно, они просто содержат инструкции, которые можно импортировать в PROJ-файлы.
Элементы и группы элементов
Одной из важных ролей файла проекта является определение входных данных для процесса сборки. Как правило, эти входные данные являются файлами кода, файлами конфигурации, файлами команд и другими файлами, которые необходимо обработать или скопировать в процессе сборки. В схеме проекта MSBuild эти входные данные представлены элементами Item. В файле проекта элементы должны быть определены в элементе ItemGroup . Как и в случае с элементами Property , вы можете присвоить имя элементу Item . Однако необходимо указать атрибут Include , чтобы определить файл или подстановочный знак, представленный элементом.
Указав несколько элементов Item с одинаковым именем, вы фактически создаете именованный список ресурсов. Хорошим способом увидеть это в действии является просмотр одного из файлов проекта, которые Visual Studio создаются. Например, файл ContactManager.Mvc.csproj в примере решения содержит множество групп элементов, каждая из которых содержит несколько идентичных именованных элементов Item .
Таким образом, файл проекта предписывает MSBuild создавать списки файлов, которые необходимо обработать таким же образом. Список ссылок включает сборки, которые должны быть на месте для успешной сборки, список компиляции включает файлы кода, которые необходимо скомпилировать, а список содержимого содержит ресурсы, которые необходимо скопировать без изменений. Мы рассмотрим, как процесс сборки ссылается и использует эти элементы далее в этом разделе.
Элементы элемента также могут включать дочерние элементы ItemMetadata . Это определяемые пользователем пары "ключ-значение" и, по сути, представляют свойства, относящиеся к этому элементу. Например, многие элементы элемента Компиляции в файле проекта включают дочерние элементы DependentUpon .
Помимо метаданных элементов, созданных пользователем, все элементы назначаются различными общими метаданными при создании. Дополнительные сведения см. в разделе "Известные метаданные элементов".
Элементы ItemGroup можно создавать в элементе Project корневого уровня или в определенных элементах Target. Элементы ItemGroup также поддерживают атрибуты condition, что позволяет адаптировать входные данные к процессу сборки в соответствии с такими условиями, как конфигурация проекта или платформа.
Практическая часть
В практической части выполните следующие задания на основе рассмотренной программы hello:
- Напишите программу, которая выводила бы на консоль название факультета, где учитесь, номер группы, свою фамилию, имя и отчество в разных строках дисплея (консоли) с помощью одной функции printf() .
- Вывод выполните с помощью нескольких функций printf() (количество функций должно соответствовать каждой порции информации).
- Для задания пункта 2 вывод информации выполните в различных строках подряд, т.е. без межстрочного пропуска.
- Проверьте программу без ключевого слова void для функции main() .
Примечание. Вывод требуемой информации осуществляется с помощью букв латинского алфавита. Комментарии в программе могут быть сделаны после символа "//" или внутри комбинации символов "/* */".
Вы также можете использовать MSBuild файлы проекта со службой Team Build в Team Foundation Server (TFS). Например, файлы проекта можно использовать в сценариях непрерывной интеграции (CI) для автоматизации развертывания в тестовой среде при возврате нового кода. Дополнительные сведения см. в разделе "Настройка Team Foundation Server для автоматического веб-развертывания".
Практическая часть
В практической части выполните следующие задания на основе рассмотренной программы hello:
- Напишите программу, которая выводила бы на консоль название факультета, где учитесь, номер группы, свою фамилию, имя и отчество в разных строках дисплея (консоли) с помощью одной функции printf() .
- Вывод выполните с помощью нескольких функций printf() (количество функций должно соответствовать каждой порции информации).
- Для задания пункта 2 вывод информации выполните в различных строках подряд, т.е. без межстрочного пропуска.
- Проверьте программу без ключевого слова void для функции main() .
Примечание. Вывод требуемой информации осуществляется с помощью букв латинского алфавита. Комментарии в программе могут быть сделаны после символа "//" или внутри комбинации символов "/* */".
сообщает системе, что именем программы является main() – главная функция , и что она возвращает целое число , о чем указывает аббревиатура "int". Имя main() – это специальное имя, которое указывает, где программа должна начать выполнение [1.1]. Наличие круглых скобок после слова main() свидетельствует о том, что это имя функции . Если содержимое круглых скобок отсутствует или в них содержится служебное слово void, то это означает, что в функцию main() не передается никаких аргументов. Тело функции main() ограничено парой фигурных скобок. Все утверждения программы, заключенные в фигурные скобки , будут относиться к функции main() .
В теле функции main() имеются еще три функции. Во-первых, функции printf() находятся в библиотеке компилятора языка С, и они печатают или отображают те аргументы, которые были подставлены вместо параметров. Символ "\n" составляет единый символ newline (новая строка), т.е. с помощью этого символа осуществляется перевод на новую строку. Символ "\t" осуществляет табуляцию, т.е. начало вывода результатов программы с отступом вправо.
Функция без параметров _getch() извлекает символ из потока ввода (т.е. ожидает нажатия почти любой клавиши). С другими компиляторами, возможно, потребуется getch() , т.е. без префиксного нижнего подчеркивания.
Последнее утверждение в первой программе
указывает на то, что выполнение функции main() закончено и что в систему возвращается значение 0 ( целое число ). Нуль используется в соответствии с соглашением об индикации успешного завершения программы [1.3].
В завершение следует отметить, что все действия в программе завершаются символом точки с запятой.
Все файлы проекта сохраняются в той папке, которая сформировалась после указания в поле Location имени проекта (hello). На рис. 1.19 показаны папки и файлы проекта Visual Studio 2010..
На рис. 1.19 файлы с полученными расширениями означают:
hello.sln – файл решения для созданной программы. Он содержит информацию о том, какие проекты входят в данное решение. Обычно, эти проекты расположены в отдельных подкаталогах. Например, наш проект находится в подкаталоге hello;
hello.suo – файл настроек среды Visual Studio при работе с решением, включает информацию об открытых окнах, их расположении и прочих пользовательских параметрах.
hello.sdf – файл содержащий вспомогательную информацию о проекте, который используется инструментами анализа кода Visual Studio , такими как IntelliSense для отображения подсказок об именах и т.д.
Файлы папки Debug показаны на рис. 1.20.
Рассмотрим файлы в соответствии с рис. 1.20.
hello.exe – исполняемый файл проекта;
hello.ilk – файл " incremental linker", используемый компоновщиком для ускорения процесса компоновки;
hello.pdb – отладочная информация / информация об именах в исполняемых файлах, используемая отладчиком.
Файлы папки hello показаны на рис. 1.21.
Характеристика содержимого папки hello:
main.c – файл исходного программного кода,
hello.vcxproj – файл проекта,
hello.vcxproj.filters – файл с описанием фильтров, используемых Visual Studio Solution Explorer для организации и отображения файлов с исходным кодом.
Дополнительные материалы
Интеграция с технологиями развертывания
Базовая технология, лежащая в основе этих возможностей, называется конвейером веб-публикации (WPP). WPP по сути объединяет MSBuild и веб-развертывание, чтобы обеспечить полный процесс сборки, пакета и развертывания для веб-приложений.
Хорошая новость заключается в том, что вы можете воспользоваться преимуществами точек интеграции, которые WPP предоставляет при создании пользовательских файлов проекта для веб-проектов. Инструкции по развертыванию можно включить в файл проекта, который позволяет создавать проекты, создавать пакеты веб-развертывания и устанавливать эти пакеты на удаленных серверах с помощью одного файла проекта и одного вызова MSBuild. Вы также можете вызывать любые другие исполняемые файлы в рамках процесса сборки. Например, можно запустить программу командной строки VSDBCMD.exe для развертывания базы данных из файла схемы. В рамках этого раздела вы узнаете, как воспользоваться преимуществами этих возможностей в соответствии с требованиями сценариев развертывания предприятия.
Целевые объекты и задачи
В схеме MSBuild элемент Task представляет отдельную инструкцию сборки (или задачу). MSBuild включает множество предопределенных задач. Пример:
Полные сведения о задачах, доступных вне поля, см. в MSBuild справочнике по задачам. Дополнительные сведения о задачах, включая создание собственных пользовательских задач, см. в разделе MSBuild Задачи.
Целевой объект можно вызвать из командной строки с помощью переключателя /t , чтобы указать целевой объект.
Кроме того, можно добавить атрибут DefaultTargets в элемент Project, чтобы указать целевые объекты, которые требуется вызвать.
В этом случае не нужно указывать целевой объект из командной строки. Вы можете просто указать файл проекта, и MSBuild вызовет целевой объект FullPublish.
Как целевые объекты, так и задачи могут включать атрибуты условия . Таким образом, можно опустить все целевые объекты или отдельные задачи, если выполняются определенные условия.
Как правило, при создании полезных задач и целевых объектов необходимо ссылаться на свойства и элементы, которые вы определили в другом месте файла проекта:
- Чтобы использовать значение свойства, введите $(PropertyName), где PropertyName — это имя элемента Property или имя параметра.
- Чтобы использовать элемент, введите @(ItemName),где ItemName — это имя элемента Item .
Помните, что при создании нескольких элементов с одинаковым именем создается список. В отличие от этого, при создании нескольких свойств с одинаковым именем последнее значение свойства будет перезаписывать все предыдущие свойства с тем же именем, а свойство может содержать только одно значение.
Например, в файле Publish.proj в примере решения просмотрите целевой объект BuildProjects .
В этом примере можно наблюдать следующие ключевые моменты:
Если параметр BuildingInTeamBuild указан и имеет значение true, ни одна из задач в этом целевом объекте не будет выполнена.
Целевой объект содержит один экземпляр задачи MSBuild. Эта задача позволяет создавать другие проекты MSBuild.
Элемент ProjectsToBuild передается в задачу. Этот элемент может представлять список файлов проекта или решения, определенных элементами элементов ProjectsToBuild в группе элементов. В этом случае элемент ProjectsToBuild ссылается на один файл решения.
Значения свойств, передаваемые задаче MSBuild, включают параметры OutputRoot и Configuration. Они задаются в качестве значений параметров, если они указаны, или статических значений свойств, если они отсутствуют.
Вы также можете увидеть, что задача MSBuild вызывает целевой объект с именем Build. Это один из нескольких встроенных целевых объектов, которые широко используются в Visual Studio файлах проекта и доступны для вас в пользовательских файлах проекта, таких как сборка, очистка, перестроение и публикация. Дополнительные сведения об использовании целевых объектов и задач для управления процессом сборки, а также о задаче MSBuild, в частности, далее в этом разделе.
Дополнительные сведения о целевых объектах см. в разделе MSBuild Targets.
Практическая часть
В практической части выполните следующие задания на основе рассмотренной программы hello:
- Напишите программу, которая выводила бы на консоль название факультета, где учитесь, номер группы, свою фамилию, имя и отчество в разных строках дисплея (консоли) с помощью одной функции printf() .
- Вывод выполните с помощью нескольких функций printf() (количество функций должно соответствовать каждой порции информации).
- Для задания пункта 2 вывод информации выполните в различных строках подряд, т.е. без межстрочного пропуска.
- Проверьте программу без ключевого слова void для функции main() .
Примечание. Вывод требуемой информации осуществляется с помощью букв латинского алфавита. Комментарии в программе могут быть сделаны после символа "//" или внутри комбинации символов "/* */".
сообщает системе, что именем программы является main() – главная функция , и что она возвращает целое число , о чем указывает аббревиатура "int". Имя main() – это специальное имя, которое указывает, где программа должна начать выполнение [1.1]. Наличие круглых скобок после слова main() свидетельствует о том, что это имя функции . Если содержимое круглых скобок отсутствует или в них содержится служебное слово void, то это означает, что в функцию main() не передается никаких аргументов. Тело функции main() ограничено парой фигурных скобок. Все утверждения программы, заключенные в фигурные скобки , будут относиться к функции main() .
В теле функции main() имеются еще три функции. Во-первых, функции printf() находятся в библиотеке компилятора языка С, и они печатают или отображают те аргументы, которые были подставлены вместо параметров. Символ "\n" составляет единый символ newline (новая строка), т.е. с помощью этого символа осуществляется перевод на новую строку. Символ "\t" осуществляет табуляцию, т.е. начало вывода результатов программы с отступом вправо.
Функция без параметров _getch() извлекает символ из потока ввода (т.е. ожидает нажатия почти любой клавиши). С другими компиляторами, возможно, потребуется getch() , т.е. без префиксного нижнего подчеркивания.
Последнее утверждение в первой программе
указывает на то, что выполнение функции main() закончено и что в систему возвращается значение 0 ( целое число ). Нуль используется в соответствии с соглашением об индикации успешного завершения программы [1.3].
В завершение следует отметить, что все действия в программе завершаются символом точки с запятой.
Все файлы проекта сохраняются в той папке, которая сформировалась после указания в поле Location имени проекта (hello). На рис. 1.19 показаны папки и файлы проекта Visual Studio 2010..
На рис. 1.19 файлы с полученными расширениями означают:
hello.sln – файл решения для созданной программы. Он содержит информацию о том, какие проекты входят в данное решение. Обычно, эти проекты расположены в отдельных подкаталогах. Например, наш проект находится в подкаталоге hello;
hello.suo – файл настроек среды Visual Studio при работе с решением, включает информацию об открытых окнах, их расположении и прочих пользовательских параметрах.
hello.sdf – файл содержащий вспомогательную информацию о проекте, который используется инструментами анализа кода Visual Studio , такими как IntelliSense для отображения подсказок об именах и т.д.
Файлы папки Debug показаны на рис. 1.20.
Рассмотрим файлы в соответствии с рис. 1.20.
hello.exe – исполняемый файл проекта;
hello.ilk – файл " incremental linker", используемый компоновщиком для ускорения процесса компоновки;
hello.pdb – отладочная информация / информация об именах в исполняемых файлах, используемая отладчиком.
Файлы папки hello показаны на рис. 1.21.
Характеристика содержимого папки hello:
main.c – файл исходного программного кода,
hello.vcxproj – файл проекта,
hello.vcxproj.filters – файл с описанием фильтров, используемых Visual Studio Solution Explorer для организации и отображения файлов с исходным кодом.
Элемент Project
Элемент Project является корневым элементом каждого файла проекта. Помимо определения СХЕМЫ XML для файла проекта, элемент Project может включать атрибуты для указания точек входа для процесса сборки. Например, в примере решения Диспетчера контактов файл Publish.proj указывает, что сборка должна начинаться путем вызова целевого объекта с именем FullPublish.
Читайте также: