xpath - वेब कॉन्फ़िगर ट्रांसफॉर्म: अगर मौजूद नहीं है तो सम्मिलित करें




web-config web-config-transform (4)

यदि मैं लक्ष्य में एक मिलान तत्व मौजूद नहीं है तो मैं केवल एक परिवर्तन लागू करना चाहता हूं। http://webconfigtransformationtester.apphb.com/ का उपयोग करके विभिन्न xpath अभिव्यक्तियों को आजमाएं लेकिन अभी तक कोई भाग्य नहीं है।

उदाहरण के लिए यदि लक्ष्य web.config इस तरह दिखता है:

<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
</configuration>

तो आउटपुट इस तरह दिखना चाहिए:

<configuration>
  <connectionStrings>
    <add name="MyCs" provider="System.Data.SqlClient" connectionString="" />
    <add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" />
  </system.web>
</configuration>

लेकिन यदि लक्ष्य इस तरह दिखता है:

<configuration>
  <connectionStrings>
    <add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" />
  </system.web>
</configuration>

तो परिवर्तन का नतीजा इस तरह दिखना चाहिए:

<configuration>
  <connectionStrings>
    <add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
    <add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" />   
  </connectionStrings>
  <system.web>
    <compilation debug="true" />
  </system.web>
</configuration>

दूसरे शब्दों में, मैं सिर्फ कॉन्फ़िगरेशन में नामित कनेक्शन स्ट्रिंग जोड़ना चाहता हूं लेकिन व्यवस्थापक को इसे अपने मूल्यों से भरने दें। मैंने सोचा कि यह xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)" जितना आसान होगा xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)" (यदि कोई अस्तित्व नहीं है तो एक सीएस कॉन्फ़िगरेशन अनुभाग जोड़ने के लिए) लेकिन स्पष्ट रूप से नहीं।


मेरे मामले में xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" बिना काम नहीं किया xdt:Locator="Match(name)"


वीएस2015 और पैकेज मैनेजर कंसोल होस्ट संस्करण 3.4.4.1321 में काम करने की पुष्टि की गई (जब आप पैकेज प्रबंधक कंसोल खोलते हैं तो आप इसे पा सकते हैं)।

अगर 'कॉन्फ़िगरेशन \ कनेक्शनस्ट्रिंग \ add \ @name' मौजूद नहीं है तो यह सम्मिलित होगा।

App.config.install.xdt:

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <connectionStrings xdt:Transform="InsertIfMissing">
        <add name="MyCs" provider="System.Data.SqlClient" connectionString="" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/>
    </connectionStrings>
</configuration>

.nuspec फ़ाइल:

<files>
    <file src="app.config.install.xdt" target="content\app.config.install.xdt" />

xdt:Transform="Remove" उपयोग करें xdt:Transform="Remove" xdt:Transform="Insert" ट्रांसफॉर्म। xdt:Transform="InsertIfMissing" सुझाया गया है कहीं और मेरे लिए काम नहीं किया, यह अपने संस्करण विशिष्ट की तरह दिखता है।


Xdt के लिए इस वैकल्पिक परिवर्तन का प्रयास करें : ट्रांसफॉर्म = "InsertIfMissing" :

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <nodeToInsertIfMissing xdt:Transform="Insert" />
  <nodeToInsertIfMissing xdt:Transform="Remove" xdt:Locator="XPath(/configuration/nodeToInsertIfMissing[2])" />
</configuration>

इसे एमएसडीएन दस्तावेज के बाद काम करना चाहिए:

सम्मिलित करें - उस तत्व को जोड़ता है जिसे ट्रांसफॉर्म फ़ाइल में चयनित तत्व या तत्वों के लिए एक भाई के रूप में परिभाषित किया गया है। नया तत्व किसी भी संग्रह के अंत में जोड़ा जाता है

इसलिए, यदि नोड पहले से मौजूद है, तो हम दूसरा जोड़ते हैं और फिर इस नोड को हटा दें (2)। अन्यथा, हम नया, अद्वितीय नोड जोड़ते हैं लेकिन ऑपरेशन हटाना विफल हो जाएगा।

नोट: ऐसा लगता है कि NuGet *। (Un) install.xdt रूपांतरण के साथ काम नहीं कर रहा है। InsertIfMissing भी।