web-dev-qa-db-ja.com

Web.ConfigはMicrosoft MSBuildの外部で変換しますか?

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を使用する必要があります。ありがとう

52

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を取得することもできます。

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

98
Mike DaCosta

変換のロジックは、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>
12

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 を参照してください。

10

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

9
Sebastian K

最新バージョンの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"
6
c_wiz_kid

MSDeployにはパッケージを変換および展開できるPowerShellスクリプトAPIがあるため、MSDeployの使用を検討してください。

XML-Document-Transform を参照することもできます。これは、必要に応じて、変換を実行する独自のコードを作成できます。

同様のことをしたcodeplexプロジェクトを以下に示します。 XDT Transformation Tool

5

再帰的に動作するようにわずかに拡張されました

    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ロジックは次のようになります。

  • すべての構成ファイルを再帰的に検索する
  • パラメータとして渡された環境のすべての変換テンプレートを検索します
  • 変換ファイルごとに、対応する構成を見つけます
  • その後、変換を行います
  • コードはデプロイ後のスクリプトを実行して、不要な変換ファイルをすべて削除します。
0
Olusegun Orija