Проблема с преобразованием app.config при установке на новое решение
У меня есть пакет, который применяет преобразования app.config к проекту. Файл преобразования выглядит так
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="handlerId" value="$assemblyname$"/> <!--populate from project params-->
<--other params-->
</appSettings>
</configuration>
Случай таков: добавить пакет в новый проект без app.config, вручную обновить app.config в проекте, а затем обновить пакет.
Если я включаю app.config.transform в свой пакет, nuget создает app.config в проекте, но если я изменяю значение одного из параметров и обновляю / переустанавливаю пакет, он создает копию этого параметра со значением package вместо его пропуска.
Например: установленный пакет при чистом проекте
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="handlerId" value="MyApp"/>
</appSettings>
</configuration>
Затем изменил значение handlerId на MyApp1
и обновить пакет. Результатом трансформации является
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="handlerId" value="MyApp1"/>
<add key="handlerId" value="MyApp"/> <!--shouldn't appear!-->
</appSettings>
</configuration>
Я попытался использовать преобразования XDT вместо этого. Они отлично работают при обновлении пакета или установке пакета в проекте с помощью app.config, но если app.config отсутствует, nuget не создает его.
2 ответа
Столкнувшись с той же проблемой. В моем случае дублированный ключ добавляется, когда наш сервер CI создает проект, что приводит к сбою тестов.
Я работал над этим, комментируя каждый элемент. Так что мой app.config.transform
файл:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--add key="handlerId" value="MyApp"/-->
</appSettings>
</configuration>
Когда вы устанавливаете пакет, пользователь может раскомментировать новые настройки.
Не очень хорошее решение, но оно работает.
Процесс.transform не различает атрибут ключа или значения. Они оба просто атрибуты. Следовательно, он не понимает, что ваше конкретное изменение несущественно, и что ему не нужно снова добавлять определенный элемент.
http://docs.nuget.org/docs/creating-packages/configuration-file-and-source-code-transformations
Когда NuGet объединяет файл преобразования с файлом конфигурации проекта, он только добавляет элементы или добавляет атрибуты к существующим элементам в файле конфигурации; он не изменяет существующие элементы или атрибуты любым другим способом.
Насколько известно nuGet, значение ="MyApp" может определять что-то, что требуется для его конкретного пакета, и если этот элемент + атрибут (ы) дословно отсутствует, пакет не будет функционировать.