2012-01-24 15 views
41

क्या MSBuild के बाहर web.configs तैयार करने के लिए माइक्रोसॉफ्ट के एक्सएमएल दस्तावेज़ ट्रांसफॉर्म का उपयोग करना संभव है? मैं MSSuild इंजन के माध्यम से इसे चलाने के बिना इन परिवर्तनों को करने के लिए PowerShell का उपयोग करना चाहता हूं। यदि माइक्रोसॉफ्ट ने मानक एक्सएसएलटी का इस्तेमाल किया था तो PowerShell में करना आसान होगा। जो मैं बता सकता हूं उससे मुझे अपने सी: \ प्रोग्राम फ़ाइलें (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll का उपयोग करना होगा जिसके लिए एक बिल्ड इंजन की आवश्यकता है। धन्यवादवेब। कॉनफिग माइक्रोसॉफ्ट एमएसबिल्ड के बाहर बदलता है?

उत्तर

77

मैंने PowerShell में माइक्रोसॉफ्ट के एक्सएमएल दस्तावेज़ ट्रांसफॉर्म को संभालने के लिए एक छोटा सा फ़ंक्शन बनाया।

मैंने विजुअल स्टूडियो बिल्ड फ़ोल्डर से माइक्रोसॉफ्ट.Web.XmlTransform.dll फ़ाइल को मेरी स्क्रिप्ट के पथ पर कॉपी किया है, लेकिन यदि आप चाहें तो आप इसे स्रोत फ़ोल्डर से संदर्भित कर सकते हैं।

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") 
+0

बढ़िया, मुझे एक सी # संस्करण –

+10

लिखने की ज़रूरत है, मेरे पास एक स्वयं-बूटस्ट्रैपिंग पावरहेल स्क्रिप्ट है जिसका आप https://gist.github.com/sayedihashimi/f1fdc4bfba74d398ec5b –

+1

पर बहुत अच्छा उपयोग कर सकते हैं! मुझे $ xml और $ xdt पर Resolve-path को कॉल करना पड़ा, लेकिन इसके अलावा, यह बहुत उपयोगी है !, thx – PierrOz

10

परिवर्तन का तर्क ट्रांसफॉर्मएक्सएल कार्य के अंदर ही है। यदि आप इसे कोड से कॉल करना चाहते हैं तो आपको एमएसबील्ड एपीआई को नकली इंजन के साथ उपयोग करना होगा और इसे निष्पादित करना होगा। यदि आप चाहें तो मेरे पास इसके लिए कुछ कोड है।

आपके मामले में जब आपने PowerShell का उल्लेख किया है तो सबसे अच्छा काम यह है कि ट्रांसफॉर्मएक्सएल कार्य को आमंत्रित करने के लिए केवल एक रैपर MSBuild फ़ाइल बनाएं। मैं यह इसलिए कहता हूं क्योंकि PowerShell को .NET 2.0 के अंतर्गत चलाने के लिए कॉन्फ़िगर किया गया है, लेकिन TransformXml कार्य को .NET 4.0 की आवश्यकता है। इसे एक डमी एमएसबिल्ड फ़ाइल से कॉल करने के लिए आप 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> 
+2

धन्यवाद सैयद, मैं वास्तव में अपने समाधान के साथ चला गया। मैंने इसे 3 आइटमों के लिए प्रॉपर्टी ग्रुप को शामिल करने के लिए थोड़ा सा संशोधित किया, इसलिए मैं उन लोगों को पावरशेल से कमांड लाइन पर ओवरराइड कर सकता था। सीखा है कि आपकी किताब :) ' Web.config Web.Debug.config Web.Prod.config से \t \t \t \t <लक्ष्य का नाम = "TransConfig"> ' –

4

एक MSDeploy का उपयोग कर के बाद से यह PowerShell स्क्रिप्टिंग API शामिल हैं को बदलने और अपने पैकेज को तैनात करने की अनुमति है को देखा लें।

आप XML-Document-Transform पर भी देख सकते हैं, यदि आप चाहते हैं कि आप ट्रांसफॉर्म करने के लिए अपना कोड लिख सकें।

यहां एक कोडप्लेक्स प्रोजेक्ट है जो कुछ ऐसा ही करता है। XDT Transformation Tool

5

मिशेल के जवाब के आधार पर मैं एक सी # समारोह है कि एक ही पूरा होगा लिखा था।

बेशक आप और मामले किसी में इसलिए यहाँ यह है PowerShell के साथ परिणामी DLL आह्वान सकता है, लेकिन मैं वास्तव में एक पूरी तरह से programatic संस्करण के लिए देख रहा था, इसी तरह के समाधान की तलाश में है:

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 \ वेब \ Microsoft.Web.XmlTransform.dll

बस निम्नलिखित के संदर्भ में शामिल करने की ज़रूरत
+0

शानदार उत्तर, इसके लिए अधिक वोट चाहिए! – Matt

5

माइक्रोसॉफ्ट ने एक्सडीटी को कोडप्लेक्स http://xdt.codeplex.com पर और एक NuGet पैकेज https://www.nuget.org/packages/Microsoft.Web.Xdt/ के रूप में पोस्ट किया है। मैंने एमएसबिल्ड कार्य, ट्रांसफॉर्मएक्सएमएल और एक .exe के साथ एक NuGet सुअर भी बनाया है ताकि उन्हें https://www.nuget.org/packages/SlowCheetah.Xdt/1.1.6-beta का आह्वान किया जा सके।

पावरशेल के लिए मैंने एक स्वयं-बूटस्ट्रैपिंग स्क्रिप्ट बनाई है जिसे आप https://gist.github.com/sayedihashimi/f1fdc4bfba74d398ec5b का उपयोग कर सकते हैं।

http://sedodream.com/2014/07/22/StopCheckinginBinariesInsteadCreateSelfbootstrappingScripts.aspx पर स्वयं बूटस्ट्रैपिंग स्क्रिप्ट के बारे में अधिक जानकारी।

1

मैंने स्क्रिप्ट को पावरहेल के नवीनतम संस्करण के साथ काम करने के लिए थोड़ा सा अद्यतन किया और इसे थोड़ा आसान बना दिया।

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" 
संबंधित मुद्दे