Главная страница   /   19.1. Принципы организации пакетов с помощью NuGet (ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

Джеффри Палермо

19.1. Принципы организации пакетов с помощью NuGet

Мы затрагивали вопрос использования пакетов NuGet в главе 14, а теперь мы рассмотрим вопрос о том, что представляет собой пакет.

Пакет NuGet – это всего лишь zip-файл, содержащий манифест и файлы, которые должны быть установлены в проекте Visual Studio. В него также должны входить три PowerShell скрипта, используемые для того, чтобы добавить автоматизацию во время инсталляции, удаления и запуска проекта. Пакет NuGet идентифицируется по его ID, который представляет собой строку, используемую для однозначной идентификации пакета и номера его версии. Файл манифеста содержит информацию о том, какие файлы должны быть добавлены в проект во время инсталляции, список зависимых пакетов и дополнительные метаданные, включая автора, URL веб-сайта проекта и лицензию URL.

NuGet предоставляет инструмент командной строки для создания пакетов и GUI-инструмент для просмотра существующих пакетов. Для того чтобы создать пакет, вам необходимо создать файл спецификации, который является XML-файлом. Этот файл используется в качестве входных данных для инструмента командной строки. Далее мы рассмотрим простую область, а затем упакуем ее.

Простая область, которую необходимо упаковать

Выделенная область – это проект библиотеки классов, содержащий контроллеры и представления. Он обладает всеми атрибутами ASP.NET MVC проекта: контроллерами, папками для представлений и самими представлениями. Для того чтобы извлечь AccountController, мы переместим те связанные файлы из используемого по умолчанию шаблона в новый проект библиотеки классов.

В целом структура проекта остается той же, но это не веб-проект, как это показано на рисунке 19-1. Разработчики, хорошо разбирающиеся в шаблоне, который используется в ASP.NET MVC по умолчанию, узнают большинство файлов в выделенной области.

Рисунок 19-1: Проект выделенной области библиотеки классов

Так же, как и регулярные области, выделенные области должны быть зарегистрированы. Это делается с помощью наследования от базового класса, предоставляемого MvcContrib, PortableAreaRegistration, как это продемонстрировано ниже.

Листинг 19-1: Наследование от PortableAreaRegistration
public class AreaRegistration : PortableAreaRegistration
{
	public override string AreaName
	{
		get { return "login"; }
	}
	public override void RegisterArea (AreaRegistrationContext context, IApplicationBus bus)
	{
		context.MapRoute(
			"login",
			"login/{controller}/{action}",
			new { controller = "Account", action = "index" });
	}
}

В этом листинге мы регистрируем нашу выделенную область. Это похоже на регулярные AreaRegistration классы, о которых мы писали в главе 13.

Следующим шагом является упаковка ее в NuGet пакет. Для этого мы введем несколько команд в окно NuGet Package Manager Console. Команды продемонстрированы в следующем листинге.

Листинг 19-2: Создание NuGet пакета
PM> install-package NuGet.CommandLine
Successfully installed 'NuGet.CommandLine 1.5.20830.9001'.
PM> cd .\PortableArea
PM> nuget spec
Created 'PortableArea.nuspec' successfully.
PM> nuget pack
Attempting to build package from 'PortableArea.csproj'.
Packing files from
	'C:\code\mvc4ia\src\Chapter19\PortableArea\PortableArea\bin\Debug'.
Using 'PortableArea.nuspec' for metadata.
Found packages.config. Using packages listed as dependencies
Successfully created package
	'C:\code\mvc4ia\src\Chapter19\PortableArea\PortableArea\PortableArea.1.0
	.nupkg'.

При использовании NuGet первым шагом является установка в вашем проекте пакета NuGet.CommandLine. Далее нам необходимо создать spec-файл. Вы могли бы сделать это вручную, но если вы введете команду nuget spec, то инструмент командной строки создаст файл-каркас, который вы сможете отредактировать вручную. Файл примера показан ниже:

Листинг 19-3: Файл Nuspec для организации пакетов простой области
<?xml version="1.0" ?>
<package>
	<metadata>
		<id>PortableArea</id>
		<version>1.0</version>
		<title>My Portable Area</title>
		<authors>erichexter</authors>
		<owners>erichexter</owners>
		<requireLicenseAcceptance>false</requireLicenseAcceptance>
		<description>Example package for MVC4 in Action</description>
		<copyright>Copyright 2011</copyright>
		<tags>Tag1 Tag2</tags>
	</metadata>
</package>

После того, как spec-файл будет сохранен, последним шагом будет запуск команды nuget pack в консольном окне. Эта команда создаст файл с расширением .nupkg. Это файл пакета. Отсюда вы можете загрузить пакет в галерею, или поместить его в папку и загрузить в проект из файловой системы. Более подробная информация о загрузке в галерею представлена в документации NuGet на сайте http://docs.nuget.org.

После создания пакета вы можете просмотреть содержимое пакета с помощью NuGet Package Explorer (рисунок 19-2). Вы увидите, что в состав выделенной области входят файлы представлений.

Рисунок 19-2: Просмотр содержимого пакета с помощью NuGet Package Explorer

В следующем разделе мы будем использовать выделенную область в нашем текущем приложении.

Применение выделенных областей

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

Сначала вам необходимо установить в вашем проекте пакет Portable Area с помощью следующей команды.

Листинг 19-4: Установка выделенной области
PM> Install-Package PortableArea
Attempting to resolve dependency 'MvcContrib.Mvc3-ci (? 3.0.86.0)'.
Attempting to resolve dependency 'Mvc3Futures'.
Successfully installed 'PortableArea 1.0'.
Successfully added 'PortableArea 1.0' to MvcApp.

Для того чтобы в вашем приложении можно было использовать нашу новую область, вам необходимо вызвать API RegisterAllAreas в Global.asax.cs, как это продемонстрировано ниже.

Листинг 19-5: Использование выделенной области в регулярном ASP.NET MVC проекте
protected void Application_Start()
{
	AreaRegistration.RegisterAllAreas();
	RegisterRoutes(RouteTable.Routes);
}

При вызове AreaRegistration.RegisterAllAreas будет выполняться поиск любых комплектов в папке bin – если используемое вами приложение ссылается на ваш проект выделенной области, то поиск автоматически перемещается туда. Если наше приложение не ссылается на комплект выделенной области, то нам необходимо поместить его в папку bin. Это может быть сделано автоматически при помощи postbuild step, настраиваемого в закладке Build диалогового окна свойств проекта.

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

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