visual studio - उन परियोजनाओं के लिए App.Config परिवर्तन जो विजुअल स्टूडियो 2010 में वेब प्रोजेक्ट नहीं हैं?




visual-studio .net-4.0 (10)

आप कॉन्फ़िगरेशन के लिए एक अलग कॉन्फ़िगरेशन फ़ाइल का उपयोग कर सकते हैं, जैसे app.Debug.config, app.Release.config और फिर अपनी प्रोजेक्ट फ़ाइल में कॉन्फ़िगरेशन चर का उपयोग करें:

<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

इसके बाद आप उस कॉन्फ़िगरेशन के आधार पर सही ProjectName.exe.config फ़ाइल बनायेंगे।

विजुअल स्टूडियो 2010 वेब आधारित एप्लिकेशन के लिए हमारे पास कॉन्फ़िगर ट्रांसफ़ॉर्मेशन सुविधाएं हैं जिनके द्वारा हम विभिन्न वातावरणों के लिए एकाधिक कॉन्फ़िगरेशन फ़ाइलों को बनाए रख सकते हैं। लेकिन विंडोज़ सर्विसेज / विनफॉर्म या कंसोल एप्लिकेशन के लिए ऐप.कॉन्फिग फाइलों के लिए एक ही सुविधा उपलब्ध नहीं है।

यहां सुझाए गए एक वर्कअराउंड उपलब्ध है: XDT जादू को App.Config पर लागू करना

हालांकि यह सीधा नहीं है और इसके लिए कई कदमों की आवश्यकता है। क्या app.config फ़ाइलों के लिए इसे हासिल करने का कोई आसान तरीका है?


इस प्रश्न में ओलेग और अन्य लोगों द्वारा प्रेरित, मैंने निम्नलिखित को सक्षम करने के लिए समाधान https://.com/a/5109530/2286801 एक कदम आगे ले लिया।

  • ClickOnce के साथ काम करता है
  • वीएस 2010 में सेटअप और परिनियोजन परियोजनाओं के साथ काम करता है
  • वीएस -2010, 2013, 2015 के साथ काम करता है (2012 का परीक्षण नहीं किया गया हालांकि यद्यपि भी काम करना चाहिए)।
  • टीम बिल्ड के साथ काम करता है। (आपको या तो ए) विजुअल स्टूडियो या बी स्थापित करना होगा) माइक्रोसॉफ्ट। वेब.पublishing.targets और माइक्रोसॉफ्ट.Web.Publishing.Tasks.dll)

यह समाधान MSBuild प्रक्रिया में पहली बार app.config का संदर्भ देने से पहले app.config रूपांतरण करके काम करता है। यह कई परियोजनाओं में आसान प्रबंधन के लिए बाहरी लक्ष्य फ़ाइल का उपयोग करता है।

निर्देश:

दूसरे समाधान के लिए इसी तरह के कदम। मैंने उद्धृत किया है कि वही रहता है और इसे पूर्णता और आसान तुलना के लिए शामिल किया गया है।

0. AppConfigTransformation.targets नामक अपनी प्रोजेक्ट में एक नई फ़ाइल जोड़ें

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Transform the app config per project configuration.-->
  <PropertyGroup>
    <!-- This ensures compatibility across multiple versions of Visual Studio when using a solution file.
         However, when using MSBuild directly you may need to override this property to 11.0 or 12.0 
         accordingly as part of the MSBuild script, ie /p:VisualStudioVersion=11.0;
         See http://blogs.msdn.com/b/webdev/archive/2012/08/22/visual-studio-project-compatability-and-visualstudioversion.aspx -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />

  <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" 
          Condition="exists('app.$(Configuration).config')">
    <PropertyGroup>
      <!-- Force build process to use the transformed configuration file from now on. -->
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <Message Text="AppConfig transformation destination: = $(AppConfig)" />
  </Target>

  <!-- Transform the app.config after the prepare for build completes. -->
  <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(AppConfig)" Transform="app.$(Configuration).config" />
  </Target>

</Project>

1. परियोजना में प्रत्येक कॉन्फ़िगरेशन के लिए एक एक्सएमएल फ़ाइल जोड़ें।

आम तौर पर आपके पास डीबग और रिलीज कॉन्फ़िगरेशन होंगे, इसलिए अपनी फ़ाइलों को App.Debug.config और App.Release.config नाम दें। मेरी प्रोजेक्ट में, मैंने प्रत्येक प्रकार के एनरोनमेंट के लिए कॉन्फ़िगरेशन बनाया है ताकि आप इसके साथ प्रयोग करना चाहें।

2. परियोजना को अनलोड करें और संपादन के लिए .csproj फ़ाइल खोलें

विजुअल स्टूडियो आपको संपादक में .csproj को संपादित करने की अनुमति देता है-आपको बस पहले प्रोजेक्ट को अनलोड करना होगा। फिर उस पर राइट-क्लिक करें और संपादित करें .csproj का चयन करें।

3. मुख्य ऐप.कॉन्फिग में कॉन्फ़िगर करें

प्रोजेक्ट फ़ाइल अनुभाग खोजें जिसमें सभी App.config और App। *। कॉन्फ़िगर संदर्भ हैं और निम्नानुसार प्रतिस्थापित करें। आप देखेंगे कि हम सामग्री के बजाय किसी का भी उपयोग नहीं करते हैं।

<ItemGroup>
  <None Include="app.config"/>
  <None Include="app.Production.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.QA.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.Development.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
</ItemGroup>

4. परिवर्तन जादू सक्रिय करें

फ़ाइल के अंत में

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

और अंतिम से पहले

</Project>

निम्नलिखित एक्सएमएल डालें:

<Import Project="AppConfigTransformation.targets" />

किया हुआ!


प्रस्तावित समाधान तब काम नहीं करेगा जब कॉन्फ़िगरेशन फ़ाइल वाले क्लास लाइब्रेरी को किसी अन्य प्रोजेक्ट से संदर्भित किया जाता है (मेरे मामले में यह एज़ूर वर्कर प्रोजेक्ट लाइब्रेरी थी)। यह सही परिवर्तन फ़ाइल को obj फ़ोल्डर से bin\##configuration-name## फ़ोल्डर में कॉपी नहीं करेगा। इसे न्यूनतम परिवर्तनों के साथ काम करने के लिए, आपको AfterCompile लक्ष्य को पहले BeforeCompile बदलने की आवश्यकता है:

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">

मार्केटप्लेस से विजुअल स्टूडियो में "कॉन्फ़िगरेशन ट्रांसफॉर्म टूल" इंस्टॉल करें और वीएस को पुनरारंभ करें। आप app.config के लिए मेनू पूर्वावलोकन ट्रांसफॉर्म भी देख पाएंगे।

https://marketplace.visualstudio.com/items?itemName=GolanAvraham.ConfigurationTransform


मेरे अनुभव में, जिन चीजों को मुझे पर्यावरण-विशिष्ट बनाने की आवश्यकता है वे कनेक्शन स्ट्रिंग्स, ऐपेटिंग्स और अक्सर सेटिंग्स को स्मॉल करते हैं। कॉन्फ़िगरेशन सिस्टम इन चीजों को अलग फ़ाइलों में निर्दिष्ट करने की अनुमति देता है। तो आप इसे अपने app.config / web.config में उपयोग कर सकते हैं:

 <appSettings configSource="appsettings.config" />
 <connectionStrings configSource="connection.config" />
 <system.net>
    <mailSettings>
       <smtp configSource="smtp.config"/>
    </mailSettings>
 </system.net>

मैं आमतौर पर इन कॉन्फ़िगर-विशिष्ट अनुभागों को अलग-अलग फ़ाइलों में कॉन्फ़िगर करता हूं, कॉन्फ़िगराइल नामक उपफोल्डर में (या तो समाधान रूट में या प्रोजेक्ट स्तर पर निर्भर करता है)। मैं प्रति कॉन्फ़िगरेशन फ़ाइल को परिभाषित करता हूं, उदाहरण के लिए smtp.config.Debug और smtp.config.Release।

फिर आप प्री-बिल्ड इवेंट को इस प्रकार परिभाषित कर सकते हैं:

copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config

टीम के विकास में, आप इस सम्मेलन में% COMPUTERNAME% और / या% USERNAME% को शामिल करके इसे आगे बढ़ा सकते हैं।

बेशक, इसका तात्पर्य है कि लक्ष्य फ़ाइलों (x.config) को स्रोत नियंत्रण में नहीं रखा जाना चाहिए (क्योंकि वे उत्पन्न होते हैं)। आपको अभी भी उन्हें प्रोजेक्ट फ़ाइल में जोड़ना चाहिए और अपनी आउटपुट प्रकार की संपत्ति को 'हमेशा कॉपी करें' या 'अगर नई हो तो कॉपी करें' पर सेट करना चाहिए।

सरल, एक्स्टेंसिबल, और यह सभी प्रकार के विजुअल स्टूडियो प्रोजेक्ट्स (कंसोल, विनफॉर्म, डब्ल्यूपीएफ, वेब) के लिए काम करता है।


मैं इस समस्या को http://ctt.codeplex.com/ साथ हल करता हूं। मैं संकुल बनाने के लिए इसे CCNet / nAnt स्क्रिप्ट के साथ उपयोग करता हूं।


मैंने कई समाधानों की कोशिश की और यहां मुझे सबसे सरल मिला है।
Dan ने टिप्पणियों में बताया कि मूल पोस्ट ओलेग सिच से संबंधित है - धन्यवाद, ओलेग!

यहां निर्देश दिए गए हैं:

1. परियोजना में प्रत्येक कॉन्फ़िगरेशन के लिए एक एक्सएमएल फ़ाइल जोड़ें।

आम तौर पर आपके पास Debug और Release कॉन्फ़िगरेशन होंगे, इसलिए अपनी फ़ाइलों को App.Debug.config और App.Release.config नाम App.Release.config । मेरी परियोजना में, मैंने प्रत्येक प्रकार के पर्यावरण के लिए एक विन्यास बनाया है, इसलिए आप इसके साथ प्रयोग करना चाहेंगे।

2. परियोजना को अनलोड करें और संपादन के लिए .csproj फ़ाइल खोलें

विजुअल स्टूडियो आपको संपादक में .csproj फ़ाइलों को संपादित करने की अनुमति देता है-आपको बस पहले प्रोजेक्ट को अनलोड करना होगा। फिर उस पर राइट-क्लिक करें और <ProjectName> .csproj संपादित करें का चयन करें

3. मुख्य ऐप.कॉन्फिग में कॉन्फ़िगर करें

प्रोजेक्ट फ़ाइल अनुभाग खोजें जिसमें सभी App.config और App.*.config संदर्भ शामिल हैं। आप देखेंगे कि उनके निर्माण कार्य किसी भी पर सेट None :

<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />

सबसे पहले, उन सभी के लिए Content लिए कार्रवाई का निर्माण सेट करें।
इसके बाद, सभी कॉन्फ़िगरेशन-विशिष्ट फ़ाइलों को मुख्य App.config पर निर्भर करें ताकि विज़ुअल स्टूडियो समूह उन्हें डिज़ाइनर और कोड-बैक फाइलों के समान बना सकें।

ऊपर दिए गए एक्सएमएल को ऊपर से बदलें:

<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>

4. परिवर्तन जादू सक्रिय करें

फ़ाइल के अंत में

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

और अंतिम से पहले

</Project>

निम्नलिखित एक्सएमएल डालें:

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="app.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

अब आप प्रोजेक्ट को फिर से लोड कर सकते हैं, इसे बना सकते हैं और App.config ट्रांसफॉर्मेशन का आनंद ले सकते हैं!

FYI करें

सुनिश्चित करें कि आपकी App.*.config फ़ाइलों में इस तरह का सही सेटअप है:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>

मैंने विशाल जोशी द्वारा पोस्ट किए गए एक के लिए एक और विकल्प बनाया है जहां सामग्री पर निर्माण कार्य को बदलने की आवश्यकता को हटा दिया गया है और क्लिकऑन परिनियोजन के लिए बुनियादी समर्थन भी लागू किया गया है। मैं मूल कहता हूं, क्योंकि मैंने इसे पूरी तरह से परीक्षण नहीं किया है, लेकिन इसे ठेठ क्लिकऑन परिनियोजन परिदृश्य में काम करना चाहिए।

समाधान में एक एकल एमएसबिल्ड प्रोजेक्ट होता है जो एक बार एक मौजूदा विंडोज़ एप्लिकेशन प्रोजेक्ट (* .csproj) में आयात किया जाता है, जिससे app.config रूपांतरण पर विचार करने के लिए बिल्ड प्रक्रिया को बढ़ाया जाता है।

आप विजुअल स्टूडियो App.config एक्सएमएल ट्रांसफॉर्मेशन पर एक और विस्तृत स्पष्टीकरण पढ़ सकते हैं और एमएसबिल्ड परियोजना फाइल गिटहब से डाउनलोड की जा सकती है


यदि आप एक टीएफएस ऑनलाइन (क्लाउड संस्करण) का उपयोग करते हैं और आप किसी प्रोजेक्ट में App.Config को बदलना चाहते हैं, तो आप बिना किसी अतिरिक्त टूल इंस्टॉल किए निम्नलिखित कर सकते हैं। वीएस => से परियोजना को अनलोड करें => प्रोजेक्ट फ़ाइल संपादित करें => फ़ाइल के नीचे जाएं और निम्न जोड़ें:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutDir)\$(AssemblyName).dll.config" />

असेंबलीफाइल और गंतव्य स्थानीय उपयोग और टीएफएस ऑनलाइन (क्लाउड) सर्वर के लिए काम करता है।


यह अब इस आलेख में विज़ुअल स्टूडियो एडइन के साथ काम करता है: SlowCheetah - Web.config ट्रांसफ़ॉर्मेशन सिंटेक्स अब किसी भी XML कॉन्फ़िगरेशन फ़ाइल के लिए सामान्यीकृत है

आप अपने web.config पर राइट-क्लिक कर सकते हैं और "कॉन्फ़िगर ट्रांसफॉर्म जोड़ें" पर क्लिक कर सकते हैं। जब आप ऐसा करते हैं, तो आपको एक web.debug.config और एक web.release.config मिल जाएगा। यदि आप चाहें तो एक वेब.whatever.config बना सकते हैं, जब तक कि कॉन्फ़िगरेशन प्रोफ़ाइल के साथ नाम पंक्तियां हों। ये फ़ाइलें केवल आपके द्वारा किए गए परिवर्तन हैं, न कि आपके web.config की एक पूर्ण प्रति।

आपको लगता है कि आप वेब.कॉन्फिग को बदलने के लिए एक्सएसएलटी का उपयोग करना चाहते हैं, लेकिन जब वे सहजता से सही महसूस करते हैं तो यह वास्तव में बहुत ही वर्बोज़ है।

यहां दो ट्रांसफॉर्म हैं, एक एक्सएसएलटी का उपयोग कर रहा है और एक्सएमएल दस्तावेज़ ट्रांसफॉर्म सिंटैक्स / नेमस्पेस का उपयोग कर एक ही है। जैसा कि सभी चीजों के साथ XSLT में ऐसा करने के कई तरीके हैं, लेकिन आपको सामान्य विचार मिलता है। एक्सएसएलटी एक सामान्यीकृत वृक्ष परिवर्तन भाषा है, जबकि इस परिनियोजन को सामान्य परिदृश्यों के विशिष्ट उप-समूह के लिए अनुकूलित किया गया है। लेकिन, अच्छा हिस्सा यह है कि प्रत्येक एक्सडीटी ट्रांसफॉर्म एक .NET प्लगइन है, ताकि आप अपना खुद का बना सकें।

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
  <xsl:copy>           
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/configuration/appSettings">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    <xsl:element name="add">
      <xsl:attribute name="key">NewSetting</xsl:attribute>
      <xsl:attribute name="value">New Setting Value</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

या तैनाती के माध्यम से वही बात बदलती है:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>






web-config-transform