Могу ли я вставить элементы в web.config с помощью Web Deploy? - PullRequest
9 голосов
/ 19 апреля 2011

Можно ли вставить элемент XML в мой файл web.config с помощью системы Parameters.xml системы Web Deploy ?

Параметр XmlFile"kind", по-видимому, наиболее близок к тому, что мне нужно, но его атрибут match принимает только запрос XPath, и я не могу указать не элемент в моем запросе XPath. (Вернее, я могу указать несуществующий элемент - Web Deploy просто игнорирует его.) В частности, я хотел бы преобразовать это:

<configuration>
   <plugins>
      <add name="bleh"/>
   </plugins>
</configuration>

в это:

<configuration>
   <plugins>
      <add name="bleh">
        <option name="foo" value="bar"/>
      </add>
   </plugins>
</configuration>

(К сожалению, я не могу предварительно заполнить web.config пустым элементом option, потому что этой конкретной системе плагинов не нравятся нераспознанные / пустые опции.)

Спасибо за любые идеи!

Ответы [ 4 ]

3 голосов
/ 27 января 2016

Такие вещи теперь возможны, начиная с Web Deploy V3. См. официальную документацию .

Вот один пример файла parameters.xml, который добавит newNode ко всем узлам, включая корень в целевом xml-файле:

<parameters>
  <parameter name="Additive" description="Add a node" defaultValue="&lt;newNode />" tags="">
    <parameterEntry kind="XmlFile" scope=".*" match="//*" />
  </parameter>
</parameters>
1 голос
/ 26 апреля 2011

Xpath - это только язык запросов для документов XML - он не может самостоятельно изменять документ XML или создавать новый документ XML .

Язык, специально разработанный для преобразования XML-документа, называется XSLT.

Вот очень короткое и простое XSLT-преобразование, которое решает вашу проблему :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="add[@name='bleh']">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <option name="foo" value="bar"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML :

<configuration>
    <plugins>
        <add name="bleh"/>
    </plugins>
</configuration>

желаемый, правильный результат получается :

<configuration>
   <plugins>
      <add name="bleh">
         <option name="foo" value="bar"/>
      </add>
   </plugins>
</configuration>
1 голос
/ 02 мая 2011

Рассматривали ли вы использование configSource ?Это позволяет вам разбить ваши файлы конфигурации на несколько небольших файлов.Файл web.config будет выглядеть следующим образом:

<configuration>
   <plugins>
      <add name="bleh"/>
   </plugins>
</configuration>

С помощью configSource:

<configuration>
   <plugins configSource="plugins.config"/>
</configuration>

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

0 голосов
/ 19 апреля 2011

Можете ли вы просто использовать обычные методы преобразования web.config? http://blogs.msdn.com/b/webdevtools/archive/2009/05/04/web-deployment-web-config-transformation.aspx

Вы можете сделать код ниже, который заменит весь ваш раздел на следующий. На самом деле то, что у вас есть в ваших вопросах, должно заменить весь раздел на тот, который вы указали, если это был ваш файл Web.Release.config.

Web.Release.config:

<plugins>
  <add name="bleh">
     <option name="foo" value="bar"/>
  </add>
</plugins>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...