ওয়েবকনফিগ রূপান্তর ব্যবহার করে "প্রতিস্থাপন বা সন্নিবেশ" করার কোনও উপায় আছে কি?


182

আমি বিভিন্ন পরিবেশের জন্য কনফিগার তৈরি করতে নীচের পোস্টে বর্ণিত হিসাবে ওয়েবকনফিগ রূপান্তর ব্যবহার করছি।

http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html

আমি কীটির সাথে মিল রেখে একটি "প্রতিস্থাপন" রূপান্তর করতে পারি

<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />

এবং আমি উদাহরণস্বরূপ "সন্নিবেশ" করতে পারি

<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" />

তবে আমি যা সত্যিই দরকারী মনে করব তা হ'ল একটি প্রতিস্থাপনের স্থানান্তর রূপান্তর, কারণ আমি সবসময় মূল কনফিগার ফাইলে নির্ভর করতে পারি না / একটি নির্দিষ্ট কী না থাকা।

এই কাজ করতে কোন উপায় আছে কি?


আপনার দেওয়া লিঙ্কটি এখন পর্যন্ত কাজ করছে না। সহজে ধারণাটি বুঝতে আপনার অন্য কোনও লিঙ্ক আছে?
আশীষ-বেজভায়াল

@ আশিষজাইন লিঙ্কটি আমার পক্ষে ভাল কাজ করে
ক্রিস হেইনেস

উত্তর:


104

আমি একটি সস্তা কাজ খুঁজে পেয়েছি। এটি সুন্দর নয় এবং খুব ভাল কাজ করবে না যদি আপনার কাছে প্রচুর উপাদান থাকে যা "প্রতিস্থাপন বা সন্নিবেশ" হওয়া দরকার।

একটি "সরান" এবং তারপরে একটি "InsertAfter | InsertBefore" করুন।

উদাহরণ স্বরূপ,

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
  <deny users="?"/>
  <allow users="*"/>
</authorization>

17
যদি VS2012 ব্যবহার করে থাকেন তবে এর থেকে আরও ভাল সমাধান এখন। নীচে দেখুন স্ট্যাকওভারফ্লো.com
ক্রিস হেইনেস

1
"InsertIfMissing" সন্নিবেশ এবং প্রয়োজন হলে প্রতিস্থাপন করবে?
জেসি

InsertAfter ব্যবহার করার জন্য আমি অন্য বিকল্পগুলির চেয়ে এই বিকল্পটি পছন্দ করি। যদি আপনি যাইহোক একটি সরান কাজটি করে থাকেন তবে ইনসার্টইফমিসিং কোনও অর্থ দেয় না।
শেন কোর্ট্রিল

125

VS2012 xdt:Transform="Remove"ব্যবহারের সাথে একত্রে xdt:Transform="InsertIfMissing"

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
  <deny users="?"/>
  <allow users="*"/>
</authorization>

পারফেক্ট! আমরা এটির জন্য অপেক্ষা করছিলাম।
ক্রিস হেইনেস

9
এটি কোনওভাবেই ওপি অনুরোধ হিসাবে কাজ করে না।
ব্র্যাডলনেই

2
উত্তরটি কীভাবে আসল প্রশ্নের উত্তর দেয় তা আরও পরিষ্কারভাবে দেখানোর জন্য সম্পাদনা করা হয়েছে।
বন

25
আমি পাই না। যদি আপনি এটি অপসারণ করেন, অবশ্যই এটি নিখোঁজ হতে চলেছে, এটি ঠিক এই মুহুর্তে একটি sertোকান, তাই না?
চাদ শোগগিনস

6
@ চ্যাড শোগগিনগুলি অগত্যা নয়: Removeটাস্কটি কেবল প্রথম ঘটনাটি সরিয়ে দেয়। কিছু উপাদান একাধিক ঘটনা থাকতে পারে। আমি ভাবতে পারি না যে আপনি এটি চাইবেন তবে তারপরে এটি প্রথম ঘটনাটি সরিয়ে ফেলবে এবং InsertIfMissingকাজটি এড়িয়ে যাবে । তবে তিনি যদি এর RemoveAllপরিবর্তে ব্যবহার করেন তবে আপনি ঠিকই থাকতেন ।
স্টিভেন লাইকেন্স 13

87

InsertIfMissingঅ্যাপসেটিং উপস্থিত রয়েছে তা নিশ্চিত করতে রূপান্তরটি ব্যবহার করুন ।
তারপরে Replaceরূপান্তরটি এর মান নির্ধারণ করতে ব্যবহার করুন ।

<appSettings>
  <add key="Environment" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>

SetAttributesপরিবর্তে আপনি রূপান্তরটিও ব্যবহার করতে পারেন Replace। পার্থক্যটি হ'ল SetAttributesশিশু নোডগুলি স্পর্শ করে না।

<appSettings>  
  <add key="UseLivePaymentService" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="UseLivePaymentService" value="true" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>

এই কৌশলগুলি + সন্নিবেশ করানোর চেয়ে অনেক ভাল কারণ বিদ্যমান নোডগুলি তাদের পিতামাতার নোডের নীচে সরানো হয় না। নতুন নোডগুলি শেষে যুক্ত করা হয়। বিদ্যমান নোডগুলি যেখানে তারা সোর্স ফাইলে থাকে সেখানে থাকে।

এই উত্তরটি শুধুমাত্র ভিজ্যুয়াল স্টুডিওর (2012 বা আরও নতুন) নতুন সংস্করণে প্রযোজ্য।


7

আমার পক্ষে আরও ভাল পদ্ধতিটি ছিল কেবলমাত্র উপাদানটি সন্নিবেশ করানো যখন আমি কেবলমাত্র কিছু নির্দিষ্ট বৈশিষ্ট্য নির্ধারণ করছি। উপাদানটি সরিয়ে ফেলা হলে মূল উপাদানটির অন্য কোনও বৈশিষ্ট্য যদি তা বিদ্যমান থাকে তবে তা বাতিল করে দেবে।

উদাহরণ: ওয়েবকনফিগ (উপাদান ছাড়াই)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

ওয়েবকনফিগ (উপাদান সহ)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceDebug httpsHelpPageEnabled="true" />
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

এক্সপথ এক্সপ্রেশন দিয়ে লোকেটারটি ব্যবহার করে, নোডটি উপস্থিত না থাকলে আমি যুক্ত করি এবং তারপরে আমার বৈশিষ্ট্যটি সেট করি:

<serviceDebug xdt:Transform="Insert"
  xdt:Locator="XPath(/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior[not(serviceDebug)])" />
<serviceDebug includeExceptionDetailInFaults="true" xdt:Transform="SetAttributes" />

ফলস্বরূপ উভয় ওয়েবকনফাইগ ফাইলেই এক্সসেপশনডেটাইলআইএনএফএল্টস = "সত্য" রয়েছে এবং দ্বিতীয়টি httpsHelpPEEn اهل বৈশিষ্ট্যটি সংরক্ষণ করে যেখানে সরান / সন্নিবেশ পদ্ধতিটি ব্যবহার করে না।


1
আমি এই ধারণাটি পছন্দ করি, তবে উপাদানটি ইতিমধ্যে উপস্থিত থাকলে "উত্স নথিতে কোনও উপাদান মেলে না ..." মিলিয়ে একটি ত্রুটি পাচ্ছি। এটি যদি বিদ্যমান থাকে তবে "না" ব্যর্থ হচ্ছে, সুতরাং এটি একটি ত্রুটি।
goodeye

আপনি যখন XDT এর সংস্করণগুলি ব্যবহার করছেন তখন এটি আপনার প্রয়োজনীয় কৌশল যা নতুন (ইশ) "InsertIfMissing" উপাদান সমর্থন করে না।
ইয়ানব্রু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.