Можно ли использовать преобразование документа Microsoft XML для подготовки web.configs за пределами MSBuild? Я хотел бы использовать PowerShell для выполнения этих преобразований без необходимости запускать это через движок MSBuild. Если Microsoft использовала стандартный XSLT, это было бы легко сделать в PowerShell. Из того, что я могу сказать, мне нужно использовать их файлы C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll, для которых требуется механизм сборки. Благодаря
Web.Config преобразуется за пределы Microsoft MSBuild?
Ответ 1
Я создал небольшую функцию для обработки Microsoft XML Document Transform в PowerShell.
Я скопировал файл Microsoft.Web.XmlTransform.dll из папки сборки Visual Studio в мой путь script, но вы можете ссылаться на нее из исходной папки, если хотите.
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")
Ответ 2
Логика преобразования содержится внутри самой задачи 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>
Ответ 3
Основываясь на ответе Michel, я написал функцию С#, которая выполнит то же самое.
Конечно, вы могли бы вызвать результирующую 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
Ответ 4
Microsoft опубликовала XDT для codeplex 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 я создал самозагружаемый script, который вы можете использовать https://gist.github.com/sayedihashimi/f1fdc4bfba74d398ec5b.
Подробнее о сценариях самонастраивания при загрузке http://sedodream.com/2014/07/22/StopCheckinginBinariesInsteadCreateSelfbootstrappingScripts.aspx.
Ответ 5
Посмотрите на использование MSDeploy, поскольку у него есть API-интерфейсы сценариев PowerShell, которые позволяют вам преобразовывать и развертывать ваш пакет.
Вы также можете посмотреть XML-Document-Transform, который, если вы захотите, может написать свой собственный код для выполнения Transform.
Вот проект codeplex, который сделал что-то подобное. Инструмент преобразования XDT
Ответ 6
Я немного обновил script, чтобы он работал с последней версией 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"