Ручное преобразование конфигурации на этапе сборки TFS

У меня есть файл решения, содержащий проект веб-сайта (среди других типов проектов). Он использует профиль публикации для развертывания, и я пытаюсь перенести все это на TFS (2015), чтобы автоматизировать процесс сборки и развертывания. Как указано здесь, я не могу управлять конфигурацией сборки, поскольку это проект веб-сайта и, следовательно, не может использовать функцию преобразования Web.config.

Я хотел бы выполнить какое-то преобразование, возможно, на этапе сборки. Я могу вручную создать и поддерживать файл web.release.config, но не знаю, как вручную его преобразовать. Существует ли файл XLST для его преобразования вне Visual Studio (например, этап сборки cmd для вызова процессора XSLT)?

Дополнение: преобразование в веб-проект определенно решит проблему, но не решение для меня, поскольку для этого потребуется участие удаленных подрядчиков, вносящих свой вклад в нашу базу кода - решение на уровне сборки TFS является единственным вещь, которую я ищу.


person mlhDev    schedule 28.12.2016    source источник
comment
Вы должны изменить свой проект на веб-приложение, чтобы получить дополнительные функции, а также стабильность и согласованность в вашем приложении.   -  person MrHinsh - Martin Hinshelwood    schedule 28.12.2016
comment
Решает ли решение CeCe вашу проблему?   -  person starian chen-MSFT    schedule 02.01.2017
comment
Я не думаю, что это будет, так как для этого потребуется либо дополнительный базовый файл (в результате чего web.config, используемый во время разработки, не будет использоваться во время процесса сборки), либо потребуются токены, которые будут сохранены в файле web.config сам по себе, делая web.config бесполезным во время разработки, если только локальный шаг после сборки не был добавлен, чтобы также выполнять локальную замену токенов (если я правильно понимаю плагин).   -  person mlhDev    schedule 03.01.2017


Ответы (2)


Как упоминалось в комментарии @MrHinsh, предлагается создать проект веб-приложения вместо проекта веб-сайта, поскольку проект веб-сайта по умолчанию не имеет файла web.release.config, в то время как проект веб-приложения имеет.

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

введите описание изображения здесь

person Cece Dong - MSFT    schedule 29.12.2016

Поскольку мои фактические преобразования были относительно простыми, я разработал это преобразование XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>
  <xsl:variable name="xformPath">web.Prod.config</xsl:variable>
  <xsl:variable name="xform" select="document($xformPath)"></xsl:variable>

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

  <xsl:template name="output-transform">
    <xsl:param name="xformNode" />
    <xsl:variable name="key" select="@key" />
    <xsl:choose>
      <xsl:when test="$xformNode">
        <xsl:copy-of select="$xformNode" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="/configuration/appSettings/add">
    <xsl:variable name="key" select="@key" />
    <xsl:call-template name="output-transform">
      <xsl:with-param name="xformNode" select="$xform/configuration/appSettings/add[@key=$key]" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="/configuration/connectionStrings/add">
    <xsl:variable name="name" select="@name" />
    <xsl:call-template name="output-transform">
      <xsl:with-param name="xformNode" select="$xform/configuration/connectionStrings/add[@name=$name]" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="/configuration/system.web/customErrors">
    <xsl:call-template name="output-transform">
      <xsl:with-param name="xformNode" select="$xform/configuration/system.web/customErrors" />
    </xsl:call-template>
  </xsl:template>
</xsl:stylesheet>

У этого есть очевидные недостатки,

  • Элементы, подлежащие замене, должны быть определены вручную
  • Заменяет весь элемент, а не только указанные атрибуты
  • Не поддерживает дочерние элементы (например, я пытался изменить system.web/compilation@debug на false, но я потерял все свои system.web/compilation/assemblies записи)

Я планирую добавить это на этапе командной строки, между этапами сборки Visual Studio и этапом копирования файлов, а также вызвать либо msxsl.exe, либо механизм преобразования Saxon HE.

person mlhDev    schedule 03.01.2017