Web.Config在Microsoft MSBuild之外转换?

是否有可能在MSBuild之外使用Microsoft的XML文档转换来准备web.configs? 我想使用PowerShell来做这些转换,而不必通过MSBuild引擎运行。 如果微软使用标准的XSLT,在PowerShell中很容易。 从我能告诉我必须使用他们的C:\ Program Files文件(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll需要一个生成引擎。 谢谢

我创build了一个小函数来处理Microsoft的PowerShell中的XML文档转换。

我将Visual Studio生成文件夹中的Microsoft.Web.XmlTransform.dll文件复制到我的脚本path中,但是如果需要,可以从源文件夹中引用它。

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.release.config转换web.config:

 XmlDocTransform("Web.config", "Web.Release.config") 

转换的逻辑包含在TransformXml任务本身的内部。 如果你想从代码调用它,你将不得不使用MSBuild API与模拟引擎并执行它。 如果你想的话,我有一些代码。

在你提到PowerShell的情况下,你最好的办法就是创build一个包装MSBuild文件来调用TransformXml任务。 我这样说是因为PowerShellconfiguration为在.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> 

看看使用MSDeploy,因为它有PowerShell脚本API,允许您转换和部署您的软件包。

你也可以看一下XML-Document-Transform ,如果你想要的话你可以编写你自己的代码来执行Transform。

这是一个codeplex项目,做了类似的事情。 XDT转换工具

基于Michel的回答,我写了一个C#函数来完成相同的function。

当然,你可以使用PowerShell来调用生成的DLL,但是我实际上是在寻找一个完全的程序化版本,所以在这里,如果其他人正在寻找类似的解决scheme:

 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

微软已经将XDT发布到codeplex http://xdt.codeplex.com,并作为一个NuGet包https://www.nuget.org/packages/Microsoft.Web.Xdt/ 。 我还创build了一个带有MSBuild任务的NuGet猪,TransformXml和一个.exe来调用它们https://www.nuget.org/packages/SlowCheetah.Xdt/1.1.6-beta

对于PowerShell,我创build了一个自引导脚本,您可以使用https://gist.github.com/sayedihashimi/f1fdc4bfba74d398ec5b

有关自引导脚本的更多信息,请参见http://sedodream.com/2014/07/22/StopCheckinginBinariesInsteadCreateSelfbootstrappingScripts.aspx

我稍微更新了一下脚本,使它能够与最新版本的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"