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


546

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

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

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


मैं निम्नलिखित लेख पर आया हूँ जो थोड़ा सरल लगता है लेकिन मैंने इसे स्वयं नहीं आजमाया है। fknut.blogspot.com/2009/11/… इसके अलावा, एमएस कनेक्ट पर एक सुविधा का अनुरोध है जो मतदान के लायक हो सकता है इसलिए यह अगले एसपी या संस्करण में बोर्ड में शामिल हो जाता है। connect.microsoft.com/VisualStudio/feedback/details/564414
Kim R

जवाबों:


413

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

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

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

यहाँ दो ट्रांसफ़ॉर्म हैं, एक XSLT का उपयोग कर रहा है और एक XML डॉक्यूमेंट ट्रांसफ़र सिंटैक्स / नेमस्पेस का उपयोग कर रहा है। XSLT में ऐसा करने के लिए सभी चीजों के साथ कई तरीके हैं, लेकिन आप सामान्य विचार प्राप्त करते हैं। XSLT एक सामान्यीकृत ट्री ट्रांसफ़ॉर्मेशन भाषा है, जबकि यह परिनियोजन सामान्य परिदृश्यों के एक विशिष्ट सबसेट के लिए अनुकूलित है। लेकिन, अच्छा हिस्सा यह है कि प्रत्येक XDT ट्रांसफ़र एक .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>

ओह, यह मीठा है! कई कॉन्फिग फाइल (log4net, nHibernate, web.config) के साथ एक ऐप रखें और उन सभी को बदलने के लिए याद रखना थोड़ा दर्द था। मैं कोड को क्रूज़कंट्रोल.नेट में ले जाने के लिए उत्सुक नहीं था, लेकिन ऐसा लगता है कि यह एक हवा भी है।
दिलबर्टडैव

10
FYI करें, SlowCheetah एक शानदार विस्तार था जो अब VS 2014 के बाद असमर्थित हो जाएगा। प्रति लेखक, सैयद इब्राहिम हाशिमी, sedodream.com/2014/08/11/…
14

5
@andrewb, मैंने पढ़ा कि यहाँ ; हालाँकि, यह एक साल पहले था। धागे को फिर से देखने, और टिप्पणियों को पढ़ने के बाद, ऐसा लगता है कि किसी ने एक संस्करण प्रदान किया है जो यहां VS2015 के साथ काम करता है
अनिल नाथ

2
विजुअल स्टूडियो 2017 और विजुअल एसटीडीओ 2019 के साथ पूरी तरह से काम करते हुए
डे जीसस सैंटोस


573

मैंने कई समाधानों की कोशिश की और यहाँ सबसे सरल है जो मैंने व्यक्तिगत रूप से पाया।
दान टिप्पणी में कहा कि मूल पोस्ट के अंतर्गत आता है ओलेग Sych - धन्यवाद, ओलेग!

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

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

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

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

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

3. बाइंड ऐप। *। फ़ाइलों को मुख्य App.config में कॉन्फ़िगर करें

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

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

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

नीचे दिए गए एक के साथ ऊपर XML बदलें:

<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. परिवर्तन परिवर्तनों को सक्रिय करें (केवल विजुअल स्टूडियो संस्करणों के लिए आवश्यक है VS2017 )

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

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

और फाइनल से पहले

</Project>

निम्नलिखित XML डालें:

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="CoreCompile" 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>

4
इसके लिए एक टन धन्यवाद! एक नोट, यदि आप csproj को संपादित करने के बाद नई .config फ़ाइलों को प्रोजेक्ट में जोड़ते हैं, तो वे App.config के तहत समूहीकृत दिखाई देंगे। मैंने csproj को संपादित करने से पहले एक जोड़ा और अनिवार्य रूप से इसे दो लिंक के साथ समाप्त किया, एक समूहीकृत और एक एकल।
जेफ स्वेनसेन

8
इस दृष्टिकोण के साथ एक समस्या यह है कि जब आप परियोजना के गुणों में "प्रकाशित करें" टैब को देखते हैं, और फिर "एप्लिकेशन फ़ाइलें" बटन पर क्लिक करते हैं ... आप उस ऐप को देख लेंगे। app.config, app.Debug.config, app.Release.config प्रकाशित प्रक्रिया के भाग के रूप में तैनात करने के लिए मजबूर किया जाता है। निश्चित रूप से, आपको सही MyApp.exe.config फ़ाइल मिलती है, लेकिन मैं नहीं चाहता कि अतिरिक्त सामान की तैनाती हो। एप्लिकेशन को रखने का एक तरीका होना चाहिए। * प्रोजेक्ट में फ़ाइलों को <Content> के बजाय <none> के रूप में कॉन्फ़िगर करें।
ली ग्रिसोम

6
एक समस्या यह है कि कुछ के लिए छोड़ रहा है मूल रूप से ओलेग साइक से लिया गया उत्तर एक महत्वपूर्ण टुकड़ा है। यदि आपके व्यक्तिगत ऐप में। (env) .configs आप सूची नहीं करते हैं '<कॉन्फ़िगरेशन xmlns: xdt = " schemas.microsoft.com/XML-Document-Transform "> और कुछ ऐसा <appSettlet xdt: Transform = "बदलें"> या विशेषताएँ जो सेटिंग लाइनों पर समान कार्य करती हैं, यह काम नहीं करेगी। यह अंतिम जानकारी महत्वपूर्ण है और एक बार जब मैंने इसे जोड़ा, तो यह सब काम करना शुरू कर दिया।
djangojazz 16

24
आप बदल सकते v10.0के साथ v$(VisualStudioVersion)सुनिश्चित करें कि आपके परियोजना बनाम के सभी बाद के संस्करणों के साथ काम करता है बनाने के लिए
थिबॉल्ट डी।

14
मेरे पास एक त्रुटि थी MSBuild त्रुटि MSB3021: फ़ाइल की प्रतिलिपि बनाने में असमर्थ। बिल्ड के दौरान फ़ाइल 'obj \ Release \ ConsoleApp.exe' नहीं मिल सका। इसलिए मैं लक्ष्य का पुनः उपयोग करने के लिए थोड़ा सा समाधान बदलता हूं <लक्ष्य नाम = "AfterBuild"> समाधान में एक नया बनाने की बजाय अनुभाग
asidis

137

एक अन्य समाधान मैंने पाया है कि परिवर्तनों का उपयोग नहीं करना है, लेकिन बस एक अलग विन्यास फ़ाइल है, जैसे app .elease.config। फिर इस लाइन को अपनी csproj फाइल में जोड़ें।

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <AppConfig>App.Release.config</AppConfig>
  </PropertyGroup>

यह न केवल सही myprogram.exe.config फ़ाइल उत्पन्न करेगा, लेकिन यदि आप MSI उत्पन्न करने के लिए Visual Studio में सेटअप और परिनियोजन प्रोजेक्ट का उपयोग कर रहे हैं, तो यह परिनियोजन प्रोजेक्ट को सही कॉन्फ़िगरेशन फ़ाइल का उपयोग करने के लिए मजबूर करेगा जब पैकेजिंग।


6
MSBuild का अनकहा चमत्कार। अब मुझे आश्चर्य है कि और क्या संभव है। Btw। यह वीएस से सीधे क्लिकों की तैनाती के लिए भी काम करता है (उच्च-मतदान उत्तरों के विपरीत)।
बोरिस बी।

4
यदि कॉन्फ़िगरेशन में कई प्रविष्टियाँ हैं जो सभी बिल्ड के लिए SAME हैं, तो परिवर्तन बहुत अधिक हो सकते हैं और त्रुटि प्रवण हो सकते हैं। एक मुद्दे से निपटना अभी जहां एक पर्यावरण के .config में बदलाव से चूक गया, और निश्चित रूप से यह उत्पादन था।
जीपवर्न

1
कॉन्फ़िगर फ़ाइल की दो प्रतियां होने से कोई समस्या नहीं है, जब तक कि डेवलपर्स वे नहीं हैं जो मैन्युअल रूप से इसे बनाए रखते हैं।
AIBMer 13

1
यह सुंदर है, एक आकर्षण की तरह काम करता है! मैंने कॉन्फ़िगरेशन के लिए <AppConfig>App.Release.config</AppConfig>मौजूदा <PropertyGroupस्थिति के अंदर बस लाइन को चिपकाया था Releaseऔर आईडीई ने नीचे एक स्क्वीजी लाइन दिखाई <AppConfig>... लाइन यह स्कीमा या कुछ और में नहीं थी, लेकिन मैंने फ़ाइल को किसी भी तरह से बचाया और प्रोजेक्ट फ़ाइल को फिर से लोड किया और एक निर्माण किया में Releaseconfig और यह काम किया!
शिव

1
इसके साथ, आप सेटिंग डिजाइनर की कार्यक्षमता खो देंगे।
ओडिन्ज

33

मेरे अनुभव में, मुझे पर्यावरण-विशिष्ट बनाने के लिए जिन चीजों की आवश्यकता है, वे हैं कनेक्शन स्ट्रिंग्स, एपसेटिंग और अक्सर स्मैप सेटिंग्स। कॉन्फ़िगरेशन सिस्टम इन चीज़ों को अलग-अलग फ़ाइलों में निर्दिष्ट करने की अनुमति देता है। तो आप इसे अपने 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) को स्रोत नियंत्रण में नहीं रखा जाना चाहिए (क्योंकि वे उत्पन्न होते हैं)। फिर भी आपको उन्हें प्रोजेक्ट फ़ाइल में जोड़ना चाहिए और अपनी आउटपुट टाइप प्रॉपर्टी को 'हमेशा कॉपी' या 'यदि नया हो तो कॉपी' सेट करना चाहिए।

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


मेरे पास ठीक वही कॉन्फ़िगरेशन है जो आपके पास है। लेकिन मुझे smtp फ़ाइल को बदलने में समस्याएं हैं। आप मूल और tranformation को रोक सकते हैं? ये मेरे हैं: आधार फ़ाइल: <?xml version="1.0"?> <smtp deliveryMethod="SpecifiedPickupDirectory"> <specifiedPickupDirectory pickupDirectoryLocation="C:\mail"/> <network host="localhost"/> </smtp> परिवर्तन:<?xml version="1.0"?> <smtp xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace" from="user@email.com" deliveryMethod="Network"> <network .../> </smtp>
जर्जा

मुझे यकीन नहीं कि मैं समझा हूँ। इस विन्यास में मैं कुछ भी रूपांतरित नहीं करता, यह सिर्फ फाइलों की नकल है ...
२३:४०

ओह, मैंने कॉपी वाला हिस्सा नहीं देखा। मैं इसे कॉपी करने के बजाय कॉन्फिगरेशन को ट्रांसफॉर्म करता हूं फिर भी धन्यवाद।
जर्जा

मुझे यह समाधान पसंद है। एक छोटा सुझाव: स्रोत के ऊपर कॉपी उदाहरण में और कॉपी के लिए लक्षित तर्क उद्धरणों से घिरा होना चाहिए; अन्यथा प्री-बिल्ड उनके नाम में अंतरिक्ष के साथ निर्देशिकाओं के लिए असफल हो जाएगा
vandre

32

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

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

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

निर्देश:

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

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. प्रोजेक्ट के लिए प्रत्येक कॉन्फ़िगरेशन के लिए एक XML फ़ाइल जोड़ें।

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

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

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

3. बाइंड ऐप। *। फ़ाइलों को मुख्य App.config में कॉन्फ़िगर करें

प्रोजेक्ट फ़ाइल अनुभाग ढूंढें जिसमें सभी 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>

निम्नलिखित XML डालें:

<Import Project="AppConfigTransformation.targets" />

किया हुआ!


1
वीएस कम्युनिटी 2015 आरसी में कोशिश की गई है और यह ऐप की अनदेखी करता है।
खिनिस्तार

मैंने सफलतापूर्वक WinForms परियोजना पर स्वीकृत उत्तर का उपयोग किया है .. लेकिन कुछ चौंकाने वाले कारणों के लिए स्वीकृत ans लागू नहीं किया जा सका। एक और WinForms परियोजना के लिए (सभी एक ही समाधान में)। @Bdeem का यह उत्तर मेरी नई कहानी है - क्योंकि यह मेरी MSI परियोजना के साथ सही ढंग से जुड़ा हुआ है - बड़ा धन्यवाद!
bkwdesign

यह वीएस 2015 में काम नहीं कर रहा था। मैंने 10 से 12 तक विज़ुअलस्टडियोवर्जन को अपडेट किया लेकिन कोई पासा नहीं। कोई विचार?
सिनास्टैटिक

क्या आप हमें अधिक जानकारी दे सकते हैं? VS 2015 अल्टीमेट, कम्यूनिटी, इत्यादि VB.NET, C #, कोई त्रुटि?
बडेम

VS2015 एंटरप्राइज। कोई त्रुटि नहीं। यह सिर्फ कुछ भी नहीं करता है।
सिनास्टैटिक

27

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

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

इसके बाद आपके द्वारा बनाए जा रहे कॉन्फ़िगरेशन के आधार पर सही ProjectName.exe.config फ़ाइल बनाई जाएगी।


धन्यवाद, मैंने आपके द्वारा की जा रही समस्या को हल करने के लिए आपके सटीक उदाहरण का उपयोग नहीं किया था, लेकिन आपके उदाहरण ने मुझे सोचने पर मजबूर कर दिया और मुझे कॉपी कार्य का उपयोग करते हुए एक और समान आत्मा की ओर ले गया।
जिपरसन

वीएस 2015 कम्युनिटी आरसी के तहत इसकी कोशिश की गई है और यह बनाता है, लेकिन फिर ऐप की सामग्री को नजरअंदाज कर देता है। * कॉन्फ़िगर मैंने जोड़ा है।
खिनिस्तार

14

मैंने वेब एप्लिकेशन प्रोजेक्ट में निर्मित ऐप की तरह एप्लिकेशन को बदलने के लिए अच्छा विस्तार लिखा है कॉन्फ़िगरेशन ट्रांसफ़ॉर्म

इस विस्तार का सबसे बड़ा लाभ यह है कि आपको इसे सभी बिल्ड मशीनों पर स्थापित करने की आवश्यकता नहीं है


1
बहुत उपयोगी विस्तार, विशेष रूप से अब जब स्लो चीता रखरखाव मोड में प्रवेश कर रहा है और भविष्य में इसका समर्थन नहीं किया जा सकता है।
दशहरा

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

5

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

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


1
यह पूरी तरह से काम करता है और इसके लिए बहुत कम प्रयास या सोच की आवश्यकता होती है। बहुत सराहना की। धन्यवाद। ('ट्रांसफॉर्मेशन ट्रांसफॉर्मेशन' काम नहीं करता, लेकिन वीएस 2017 में 'ऐड ट्रांसफॉर्मेशन' पूरी तरह से समस्या के बिना काम करता है)। इसके अलावा अक्सर अद्यतन प्राप्त करने के लिए लगता है।
adudley

1
समाधान के लिए बहुत बहुत धन्यवाद, दृश्य के पीछे, यह वही करता है जो डैन अब्रामोव ने ऊपर समझाया है, अपने हाथ को गंदा किए बिना
मोहम्मद दाऊद अंसारी

यह परम उपाय है। पूर्वावलोकन वी.एस. 2019 के साथ ठीक काम करने लगता है।
काइल चैंपियन

1
मैं इसे प्यार करता हूँ, लेकिन यह csproj के कुछ संपादन के बिना अन्य गैर app.config फ़ाइलों का समर्थन नहीं किया। हालांकि पूर्वावलोकन देखने के लिए अभी भी बहुत अच्छा है।
I191971

4

इसलिए मैंने कुछ अलग तरीका अपनाया। मैंने चरण 3 के माध्यम से डैन के चरणों का पालन किया, लेकिन एक और फ़ाइल जोड़ी: App.Base.Config। इस फ़ाइल में वह कॉन्फ़िगरेशन सेटिंग शामिल है जो आप प्रत्येक जेनरेट किए गए App.Config में चाहते हैं। तब मैं पहले कॉन्फ़िगरेशन को आधार विन्यास के साथ अपग्रेड करने के लिए App.config में बेस कॉन्फिगरेशन को बदलने के लिए पहले-पहले (यूरी के अलावा ट्रांसफॉर्मएक्सएमएल) का उपयोग करता हूं। निर्माण की प्रक्रिया तब सामान्य रूप में रूपांतरित App.config का उपयोग करती है। हालाँकि, एक झुंझलाहट यह है कि आप कभी-कभी बदलने वाले App.config को स्रोत नियंत्रण से बाहर करना चाहते हैं, लेकिन दूसरी कॉन्फ़िगरेशन फ़ाइलें अब इस पर निर्भर हैं।

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

3

समाधान के लिए बस थोड़ा सुधार जो अब हर जगह पोस्ट किया गया लगता है:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • जब तक आप अपने वर्तमान वीएस संस्करण के साथ हमेशा के लिए रहने की योजना नहीं बना रहे हैं

क्या आप कृपया समझा सकते हैं कि आप थोड़ा सा जवाब दें या इसे समझाने के लिए स्रोत दें?
roydukkey

4
$(VisualStudioVersion)MSBuild का सीधे उपयोग करते समय ऐसा नहीं लगता है।
जेरेमी स्मिथ

यह stackoverflow.com/a/5109530/2003763 पर एक टिप्पणी होनी चाहिए (मैंने अभी एक टिप्पणी के रूप में वही जानकारी जोड़ी है)
थिबॉल्ट डी।

2

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

समाधान में एक एकल MSBuild परियोजना होती है जो एक बार अस्तित्व में आने वाली विंडोज़ अनुप्रयोग परियोजना (* .csproj) में आयात की जाती है, जो निर्माण प्रक्रिया को app.config रूपांतरण पर विचार करने के लिए विस्तारित करती है।

आप Visual Studio App.config XML परिवर्तन पर अधिक विस्तृत विवरण पढ़ सकते हैं और MSBuild प्रोजेक्ट फ़ाइल GHHub से डाउनलोड की जा सकती है


1

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

<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" />

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


0

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

<Target Name="BeforeCompile" Condition="exists('app.$(Configuration).config')">
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.