Преобразование Web.Config вне Microsoft MSBuild? - PullRequest
52 голосов
/ 24 января 2012

Можно ли использовать преобразование XML-документов Microsoft для подготовки web.configs вне MSBuild? Я хотел бы использовать PowerShell для выполнения этих преобразований без необходимости запуска этого через движок MSBuild. Если бы Microsoft использовала стандартный XSLT, это было бы легко сделать в PowerShell. Из того, что я могу сказать, я должен использовать их C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll, для которого требуется механизм сборки. Спасибо

Ответы [ 7 ]

98 голосов
/ 28 мая 2013

Я создал небольшую функцию для обработки XML-преобразования документов Microsoft в PowerShell.

Я скопировал файл Microsoft.Web.XmlTransform.dll из папки сборки Visual Studio в путь к моему сценарию, но вы можете сослаться на него изисходная папка, если вы хотите.

function XmlDocTransform($xml, $xdt)
{
    if (!$xml -or !(Test-Path -path $xml -PathType Leaf)) {
        throw "File not found. $xml";
    }
    if (!$xdt -or !(Test-Path -path $xdt -PathType Leaf)) {
        throw "File not found. $xdt";
    }

    $scriptPath = (Get-Variable MyInvocation -Scope 1).Value.InvocationName | split-path -parent
    Add-Type -LiteralPath "$scriptPath\Microsoft.Web.XmlTransform.dll"

    $xmldoc = New-Object Microsoft.Web.XmlTransform.XmlTransformableDocument;
    $xmldoc.PreserveWhitespace = $true
    $xmldoc.Load($xml);

    $transf = New-Object Microsoft.Web.XmlTransform.XmlTransformation($xdt);
    if ($transf.Apply($xmldoc) -eq $false)
    {
        throw "Transformation failed."
    }
    $xmldoc.Save($xml);
}

Чтобы преобразовать web.config с помощью web.release.config:

XmlDocTransform -xml "Web.config" -xdt "Web.Release.config"

В качестве альтернативы, вы можете использовать самозагрузку Sayed Xml Transformскрипт, который позаботится о получении Microsoft.Xml.Xdt.dll для вас:

https://gist.github.com/sayedihashimi/f1fdc4bfba74d398ec5b

12 голосов
/ 24 января 2012

Логика преобразования содержится внутри самой задачи TransformXml.Если вы хотите вызвать его из кода, вам придется использовать API MSBuild с имитатором и выполнить его.У меня есть некоторый код для этого, если хотите.

В вашем случае, поскольку вы упомянули PowerShell, лучше всего просто создать файл-оболочку MSBuild для вызова задачи TransformXml.Я говорю это потому, что PowerShell настроен для работы в .NET 2.0, но для задачи TransformXml требуется .NET 4.0.Чтобы вызвать его из фиктивного файла MSBuild, вы можете проверить мой блог на http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx,, но я также вставил образец по этой ссылке ниже.

<Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="TransformXml"
             AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>

    <Target Name="Demo">
        <TransformXml Source="app.config"
                      Transform="Transform.xml"
                      Destination="app.prod.config"/>
    </Target>
</Project>
10 голосов
/ 25 июля 2014

Microsoft отправила XDT в кодовый комплекс http://xdt.codeplex.com и в виде пакета NuGet https://www.nuget.org/packages/Microsoft.Web.Xdt/. Я также создал NuGet pig с задачей MSBuild, TransformXml и .exe для их вызова https://www.nuget.org/packages/SlowCheetah.Xdt/1.1.6-beta.

Для PowerShell я создал сценарий самозагрузки, который можно использовать https://gist.github.com/sayedihashimi/f1fdc4bfba74d398ec5b.

Подробнее о сценариях самозагрузки см. В http://sedodream.com/2014/07/22/StopCheckinginBinariesInsteadCreateSelfbootstrappingScripts.aspx.

9 голосов
/ 03 февраля 2014

Основываясь на ответе Мишеля, я написал функцию C #, которая будет выполнять то же самое.

Конечно, вы можете вызывать результирующую DLL с помощью PowerShell, но я на самом деле искал полностью программную версию, так что вот онаВ случае, если кто-то еще ищет подобное решение:

using Microsoft.Web.XmlTransform;

...

public static void TransformConfig(string configFileName, string transformFileName)
{
     var document = new XmlTransformableDocument();
     document.PreserveWhitespace = true;
     document.Load(configFileName);

     var transformation = new XmlTransformation(transformFileName);
     if (!transformation.Apply(document))
     {
         throw new Exception("Transformation Failed");
     }
     document.Save(configFileName);
}

Вам просто нужно включить ссылку на следующее:

C: \ Program Files (x86) \ MSBuild \Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.XmlTransform.dll

6 голосов
/ 11 октября 2016

Я немного обновил скрипт, чтобы он работал с последней версией powershell и немного упростил его.

function XmlDocTransform($xml, $xdt)
{
      $scriptpath = $PSScriptRoot + "\"
      $xmlpath = $scriptpath + $xml
      $xdtpath = $scriptpath + $xdt

      if (!($xmlpath) -or !(Test-Path -path ($xmlpath) -PathType Leaf)) {
         throw "Base file not found. $xmlpath";
      }

      if (!($xdtpath) -or !(Test-Path -path ($xdtpath) -PathType Leaf)) {
         throw "Transform file not found. $xdtpath";
      }

      Add-Type -LiteralPath "$PSScriptRoot\Microsoft.Web.XmlTransform.dll"

      $xmldoc = New-Object   Microsoft.Web.XmlTransform.XmlTransformableDocument;
      $xmldoc.PreserveWhitespace = $true
      $xmldoc.Load($xmlpath);

      $transf = New-Object Microsoft.Web.XmlTransform.XmlTransformation($xdtpath);
      if ($transf.Apply($xmldoc) -eq $false)
      {
          throw "Transformation failed."
      }
      $xmldoc.Save($xmlpath);

      Write-Host "Transformation succeeded" -ForegroundColor Green
  }

И для вызова функции используйте

 XmlDocTransform "App.config" "App.acc.config"
5 голосов
/ 24 января 2012

Взгляните на использование MSDeploy, поскольку оно имеет API-интерфейсы сценариев PowerShell, которые позволяют преобразовывать и развертывать ваш пакет.

Вы также можете посмотреть XML-Document-Transform , который, если выхотел, чтобы вы могли написать свой собственный код для выполнения преобразования.

Вот проект кодекса, который сделал нечто подобное. XDT Transformation Tool

0 голосов
/ 07 марта 2019

Слегка расширенный для рекурсивной работы

    function XmlDocTransform($xml, $xdt)
    {
        if (!$xml -or !(Test-Path -path $xml -PathType Leaf)) {
            throw "File not found. $xml";
        }
        if (!$xdt -or !(Test-Path -path $xdt -PathType Leaf)) {
            throw "File not found. $xdt";
        }
        $scriptPath = (Get-Variable MyInvocation -Scope 1).Value.InvocationName | split-path -parent
        Add-Type -LiteralPath "$scriptPath\Microsoft.Web.XmlTransform.dll"
        $xmldoc = New-Object Microsoft.Web.XmlTransform.XmlTransformableDocument;
        $xmldoc.PreserveWhitespace = $true
        $xmldoc.Load($xml);
        $transf = New-Object Microsoft.Web.XmlTransform.XmlTransformation($xdt);
        if ($transf.Apply($xmldoc) -eq $false)
        {
            throw "Transformation failed."
        }
        $xmldoc.Save($xml);
    }
    function DoConfigTransform($webFolder, $environment)
    {
        $allConfigFiles = Get-ChildItem $webFolder -File -Filter *.config -Recurse
          $transformFiles = $allConfigFiles | Where-Object {$_.Name -like ("*." + $environment + ".config")} | %{$_.fullname}
          ForEach($item in $transformFiles)
          {
            $origFile = $item -replace("$environment.",'')
              XmlDocTransform -xml $origFile -xdt $origFile$item
              #Write-Output ("orig = " + $origFile + ", transform = " + $item)
          }
          cd C:\WebApplications\xxx\xxx\xxx\
          .\PostDeploy.ps1
    }
    DoConfigTransform -webFolder "C:\WebApplications\xxx\xxx\xxx" -environment "xx-xxx-xx"

Итак, логика DoConfigTransform выглядит следующим образом:

  • Поиск всех файлов конфигурации рекурсивно
  • Поиск всех шаблонов преобразования длясреда, в которой мы #passed в качестве параметра
  • Для каждого файла преобразования найдите соответствующую конфигурацию
  • Затем выполните преобразование
  • Код запускает сценарий пост-развертывания для удаления всех нежелательных преобразованийфайлы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...