Преобразования исходного кода и файлов конфигурации
Преобразование исходного кода применяет одностороннюю замену токена к файлам в папке content
или contentFiles
пакета при установке пакета (content
для клиентов, использующих packages.config
и contentFiles
для PackageReference
) в тех случаях, когда токены ссылаются на свойства проекта Visual Studio. Это позволяет вставить файл в пространство имен проекта или настроить код, который обычно обращается к global.asax
в проекте ASP.NET.
Преобразование файла конфигурации позволяет изменять файлы, уже существующие в целевом проекте, такие как web.config
и app.config
. Например, для пакета может потребоваться добавить элемент в раздел modules
файла конфигурации. Это преобразование осуществляется путем включения в пакет особых файлов, которые описывают разделы, добавляемые в файлы конфигурации. При удалении пакета внесенные изменения отменяются, благодаря чему это преобразование является двусторонним.
Определение преобразований исходного кода
Файлы, которые требуется вставить в проект из пакета, должны располагаться в папках
content
иcontentFiles
пакета. Например, если требуется установить файлContosoData.cs
в папкуModels
целевого проекта, этот файл должен находиться в папкахcontent\Models
иcontentFiles\{lang}\{tfm}\Models
пакета.Чтобы задать в NuGet инструкцию для применения замены маркера во время установки, добавьте к имени файла исходного кода расширение
.pp
. После установки расширение.pp
у файла будет удалено.Например, чтобы выполнить преобразования в
ContosoData.cs
, присвойте файлу в пакете имяContosoData.cs.pp
. После установки он будет иметь имяContosoData.cs
.В файле исходного кода используйте маркеры без учета регистра символов вида
$token$
, чтобы указать значения, которые NuGet будет заменять свойствами проекта:namespace $rootnamespace$.Models { public struct CategoryInfo { public string categoryid; public string description; public string htmlUrl; public string rssUrl; public string title; } }
При установке NuGet заменяет
$rootnamespace$
наFabrikam
, используя свойства целевого проекта, корневым пространством имен которого являетсяFabrikam
.
Маркер $rootnamespace$
является одним из самых часто используемых свойств проекта. Остальные маркеры перечислены в статье ProjectProperties Interface (Интерфейс ProjectProperties). Естественно, необходимо учитывать, что некоторые свойства могут зависеть от типа проекта.
Определение преобразований файла конфигурации
Как описывается в следующих разделах, преобразования файла конфигурации могут быть выполнены двумя способами:
- Включите файлы
app.config.transform
иweb.config.transform
в папкуcontent
пакета. Расширение.transform
указывает NuGet на то, что эти файлы содержат XML-код, который следует добавить в файлы конфигурации при установке пакета. При удалении пакета такой XML-код также удаляется. - Включите файлы
app.config.install.xdt
иweb.config.install.xdt
в папкуcontent
пакета, используя синтаксис XDT для описания необходимых изменений. В этом случае также можно включить файл.uninstall.xdt
, который необходим для отмены изменений при удалении пакета из проекта.
Примечание.
Преобразования не применяются к файлам .config
, на которые задаются ссылки в Visual Studio.
Преимуществом использования XDT является то, что вместо простого объединения двух файлов предоставляется синтаксис для операций со структурой модели DOM XML с использованием элемента и атрибута, соответствующих применению полной поддержки XPath. XDT позволяет добавлять, обновлять и удалять элементы, помещать новые элементы в конкретное место, а также заменять или удалять элементы (включая дочерние узлы). Это позволяет легко создавать преобразования при удалении, которые обеспечивают отмену всех преобразований, выполненных во время установки пакета.
Преобразования XML
Файлы app.config.transform
и web.config.transform
в папке content
пакета содержат только те элементы, которые будут добавлены в существующие файлы app.config
и web.config
проекта.
Допустим, файл web.config
проекта изначально имеет следующее содержимое:
<configuration>
<system.webServer>
<modules>
<add name="ContosoUtilities" type="Contoso.Utilities" />
</modules>
</system.webServer>
</configuration>
Чтобы добавить элемент MyNuModule
в раздел modules
во время установки пакета, создайте файл web.config.transform
в папке content
пакета, который будет иметь следующий вид:
<configuration>
<system.webServer>
<modules>
<add name="MyNuModule" type="Sample.MyNuModule" />
</modules>
</system.webServer>
</configuration>
После того как NuGet установит пакет, файл web.config
будет иметь следующий вид:
<configuration>
<system.webServer>
<modules>
<add name="ContosoUtilities" type="Contoso.Utilities" />
<add name="MyNuModule" type="Sample.MyNuModule" />
</modules>
</system.webServer>
</configuration>
Обратите внимание, что NuGet не заменяет раздел modules
, а добавляет в него новую запись с новыми элементами и атрибутами. NuGet не изменяет какие-либо существующие элементы или атрибуты.
При удалении пакета NuGet снова проверяет файлы .transform
и удаляет содержащиеся в них элементы из соответствующих файлов .config
. Обратите внимание, что этот процесс не затрагивает строки файла .config
, которые были изменены после установки пакета.
В качестве расширенного примера можно привести пакет модулей ведения журнала и обработки ошибок ASP.NET (ELMAH), который добавляет множество записей в файл web.config
. При удалении пакета эти записи будут удалены.
Чтобы изучить соответствующий файл web.config.transform
, скачайте пакет ELMAH по приведенной выше ссылке, измените расширение пакета с .nupkg
на .zip
, после чего откройте файл content\web.config.transform
, содержащийся в этом ZIP-файле.
Чтобы просмотреть последствия установки и удаления пакета, создайте в Visual Studio новый проект ASP.NET (шаблон в разделе Visual C# > Интернет диалогового окна "Новый проект") и выберите приложение ASP.NET. Откройте файл web.config
, чтобы просмотреть его первоначальное состояние. Щелкните проект правой кнопкой мыши, выберите пункт Управление пакетами NuGet, перейдите к пакету ELMAH на веб-сайте nuget.org и установите его последнюю версию. Обратите внимание на все изменения в файле web.config
. Удалите пакет. Вы увидите, что было восстановлено исходное состояние файла web.config
.
Преобразования XDT
Примечание.
Как упоминалось в разделе о проблемах совместимости пакетов в документации по переходу с packages.config
на PackageReference
, описанные ниже преобразования XDT поддерживаются только packages.config
. Если добавить в пакет указанные ниже файлы, то у потребителей, использующих ваш пакет с PackageReference
, преобразования применены не будут (см. этот пример, чтобы обеспечить работу преобразований XDT сPackageReference
).
Вы можете изменять файлы конфигурации с помощью синтаксиса XDT. Кроме того, NuGet может заменять токены свойствами проекта, включая имена свойств с разделителями $
(без учета регистра символов).
Например, следующий файл app.config.install.xdt
вставит элемент appSettings
в файл app.config
, содержащий значения FullPath
, FileName
и ActiveConfigurationSettings
из проекта:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings xdt:Transform="Insert">
<add key="FullPath" value="$FullPath$" />
<add key="FileName" value="$filename$" />
<add key="ActiveConfigurationSettings " value="$ActiveConfigurationSettings$" />
</appSettings>
</configuration>
Предположим, файл web.config
проекта изначально имеет следующее содержимое:
<configuration>
<system.webServer>
<modules>
<add name="ContosoUtilities" type="Contoso.Utilities" />
</modules>
</system.webServer>
</configuration>
Чтобы добавить элемент MyNuModule
в раздел modules
при установке пакета, файл web.config.install.xdt
пакета должен иметь следующее содержимое:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.webServer>
<modules>
<add name="MyNuModule" type="Sample.MyNuModule" xdt:Transform="Insert" />
</modules>
</system.webServer>
</configuration>
После установки пакета файл web.config
будет иметь следующий вид:
<configuration>
<system.webServer>
<modules>
<add name="ContosoUtilities" type="Contoso.Utilities" />
<add name="MyNuModule" type="Sample.MyNuModule" />
</modules>
</system.webServer>
</configuration>
Чтобы удалить только элемент MyNuModule
во время удаления пакета, файл web.config.uninstall.xdt
должен иметь следующее содержимое:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.webServer>
<modules>
<add name="MyNuModule" xdt:Transform="Remove" xdt:Locator="Match(name)" />
</modules>
</system.webServer>
</configuration>