Ответ 1
Используйте xdt:Transform="InsertIfMissing"
с задачей XmlTransform
в VS2012. Это не похоже, что Microsoft обновила свою документацию, чтобы отразить это.
Я хотел бы применить преобразование тогда и только тогда, когда совпадающий элемент не существует в целевом объекте. Попробуйте различные выражения xpath с помощью http://webconfigtransformationtester.apphb.com/, но пока не повезло.
например. если целевой web.config выглядит следующим образом:
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
тогда вывод должен выглядеть следующим образом:
<configuration>
<connectionStrings>
<add name="MyCs" provider="System.Data.SqlClient" connectionString="" />
<add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" />
</connectionStrings>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
Но если цель выглядит так:
<configuration>
<connectionStrings>
<add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
</connectionStrings>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
то результат преобразования должен выглядеть следующим образом:
<configuration>
<connectionStrings>
<add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
<add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" />
</connectionStrings>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
Другими словами, я просто хочу добавить иную строку соединения в конфигурацию, но пусть администратор заполнит ее своими собственными значениями. Я думал, что это будет так же просто, как xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)"
(добавить раздел конфигурации cs, если он не существует), но, по-видимому, нет.
Используйте xdt:Transform="InsertIfMissing"
с задачей XmlTransform
в VS2012. Это не похоже, что Microsoft обновила свою документацию, чтобы отразить это.
В моем случае xdt:Transform="InsertIfMissing"
не работал без xdt:Locator="Match(name)"
Попробуйте это альтернативное преобразование для xdt: Transform = "InsertIfMissing":
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<nodeToInsertIfMissing xdt:Transform="Insert" />
<nodeToInsertIfMissing xdt:Transform="Remove" xdt:Locator="XPath(/configuration/nodeToInsertIfMissing[2])" />
</configuration>
Он должен работать после документации MSDN:
Вставить - добавляет элемент, определенный в файле преобразования, как родственный элемент к выбранному элементу или элементам. Новый элемент добавлен в конце любой коллекции.
Итак, если node уже существует, мы добавим второй, а затем удалим этот node (2nd). В противном случае мы добавим новый уникальный node, но операция удаления завершится неудачно.
Примечание. Кажется, он не работает с преобразованием NuGet *. (un) install.xdt. InsertIfMissing тоже.
Используйте xdt:Transform="Remove"
, а затем xdt:Transform="Insert"
. xdt:Transform="InsertIfMissing"
, предложенный в другом месте, не работал у меня, выглядит как его версия.
Подтверждена работа в VS2015 и версии хоста консоли менеджера пакетов 3.4.4.1321 (вы можете найти это при открытии консоли диспетчера пакетов).
Это будет вставляться, если "configuration\connectionStrings\add\@name" не существует.
Файл app.config.install.xdt:
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings xdt:Transform="InsertIfMissing">
<add name="MyCs" provider="System.Data.SqlClient" connectionString="" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/>
</connectionStrings>
</configuration>
Файл .nuspec:
<files>
<file src="app.config.install.xdt" target="content\app.config.install.xdt" />