Web.Config преобразуется за пределы Microsoft MSBuild?

Можно ли использовать преобразование 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, для которых требуется механизм сборки. благодаря

Я создал небольшую функцию для обработки XML-документа XML в 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("Web.config", "Web.Release.config") 

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

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

       

Основываясь на ответе Мишеля, я написал функцию 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

Microsoft разместила XDT для кодового пакета http://xdt.codeplex.com и как пакет NuGet https://www.nuget.org/packages/Microsoft.Web.Xdt/ . Я также создал свинью NuGet с задачей 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 .

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

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

Вот проект codeplex, который сделал что-то подобное. Инструмент преобразования XDT

Я немного обновил скрипт, чтобы он работал с последней версией 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" 
Давайте будем гением компьютера.