MSBuildの外部でweb.configを準備するために、MicrosoftのXMLドキュメントトランスフォームを使用することは可能ですか? PowerShellを使用して、MSBuildエンジンで実行せずにこれらの変換を実行したいと思います。 Microsoftが標準のXSLTを使用していた場合、PowerShellで簡単に実行できます。私が言えることから、ビルドエンジンを必要とするC:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dllを使用する必要があります。ありがとう
PowerShellでMicrosoftのXMLドキュメント変換を処理する小さな関数を作成しました。
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.release.configを使用してweb.configを変換するには:
XmlDocTransform -xml "Web.config" -xdt "Web.Release.config"
または、Sayedの自己ブートストラップXml Transformスクリプトを使用して、Microsoft.Xml.Xdt.dllを取得することもできます。
変換のロジックは、TransformXmlタスク自体の内部に含まれています。コードから呼び出す場合は、MSBuild APIを模擬エンジンで使用して実行する必要があります。必要に応じて、このためのコードをいくつか用意しています。
あなたの場合、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>
MicrosoftはXDTをcodeplex http://xdt.codeplex.com に投稿し、NuGetパッケージとして https:/ /www.nuget.org/packages/Microsoft.Web.Xdt/ 。また、MSBuildタスク、TransformXml、およびそれらを呼び出す.exeを使用してNuGet豚を作成しました https://www.nuget.org/packages/SlowCheetah.Xdt/1.1.6-ベータ 。
PowerShellの場合、 https://Gist.github.com/sayedihashimi/f1fdc4bfba74d398ec5b を使用できるセルフブートストラップスクリプトを作成しました。
自己ブートストラップスクリプトの詳細については、 http://sedodream.com/2014/07/22/StopCheckinginBinariesInsteadCreateSelfbootstrappingScripts.aspx を参照してください。
Michelの答えに基づいて、同じことを実現するC#関数を作成しました。
もちろん、PowerShellで結果のDLLを呼び出すことができますが、実際には完全にプログラムされたバージョンを探していました。
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
最新バージョンの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"
MSDeployにはパッケージを変換および展開できるPowerShellスクリプトAPIがあるため、MSDeployの使用を検討してください。
XML-Document-Transform を参照することもできます。これは、必要に応じて、変換を実行する独自のコードを作成できます。
同様のことをしたcodeplexプロジェクトを以下に示します。 XDT Transformation Tool
再帰的に動作するようにわずかに拡張されました
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ロジックは次のようになります。