Jak zmienić wartość atrybutu w sekcji appSettings za pomocą transformacji Web.config

260

Czy można przekształcić następujący plik Web.config appSettings:

<appSettings>
    <add key="developmentModeUserId" value="00297022" />
    <add key="developmentMode" value="true" />
    /* other settings here that should stay */
</appSettings>

w coś takiego:

<appSettings>
    <add key="developmentMode" value="false" />
    /* other settings here that should stay */
</appSettings>

Więc muszę usunąć klucz developmentModeUserId i muszę zastąpić wartość dla klucza developmentMode .

ważka
źródło

Odpowiedzi:

452

Chcesz coś takiego:

<appSettings>
  <add key="developmentModeUserId" xdt:Transform="Remove" xdt:Locator="Match(key)"/>
  <add key="developmentMode" value="false" xdt:Transform="SetAttributes"
          xdt:Locator="Match(key)"/>
</appSettings>

Zobacz też: Web.config Składnia transformacji do wdrażania projektu aplikacji sieci Web

Joe
źródło
24
Uwaga: w klawiszach rozróżniana jest wielkość liter!
Cosmin
2
Doskonała odpowiedź. Próbowałem opcji innych firm, takich jak Slow Cheetah i nigdzie się nie udawało - to było proste i idealne.
Steve,
2
@stevens: Potrzebujesz Slow Cheetah, jeśli chcesz przekształcić, powiedzmy, app.config dla aplikacji natywnych. Jeśli jednak pamiętam, składnia powinna być identyczna (minęło trochę czasu, odkąd musiałem używać Slow Cheetah).
Ellesedil
alternatywą dla powolnego oszusta jest utworzenie myotherconfig.staging.config, aw transformacji web.Staging.config transformacja odwołania do myotherconfig.config w web.config
nologo
3
Tylko drobne wyjaśnienie, które może pomóc niektórym osobom: xdt:Transform="SetAttributes" xdt:Locator="Match(key)"część należy użyć w pliku Web.Whokolwiek.config, a nie w pliku Web.config.
user3533716
11

Zastępowanie wszystkich ustawień aplikacji

Jest to przypadek nadmiaru, w którym po prostu chcesz zastąpić całą sekcję pliku web.config. W takim przypadku zastąpię wszystkie ustawienia aplikacji w pliku web.config wprowadzę nowe ustawienia w pliku web.release.config. To jest moja podstawowa aplikacja web.config Ustawienia:

<appSettings>
  <add key="KeyA" value="ValA"/>
  <add key="KeyB" value="ValB"/>
</appSettings>

Teraz w moim pliku web.release.config zamierzam utworzyć sekcję appSettings, ale dołączę atrybut xdt: Transform = „Replace”, ponieważ chcę po prostu zastąpić cały element. Nie musiałem używać xdt: Locator, ponieważ nie ma nic do zlokalizowania - chcę po prostu wyczyścić tablicę i wymienić wszystko.

<appSettings xdt:Transform="Replace">
  <add key="ProdKeyA" value="ProdValA"/>
  <add key="ProdKeyB" value="ProdValB"/>
  <add key="ProdKeyC" value="ProdValC"/>
</appSettings>

Zauważ, że w pliku web.release.config moja sekcja appSettings ma trzy klucze zamiast dwóch, a klucze nie są takie same. Teraz spójrzmy na wygenerowany plik web.config, co dzieje się, gdy publikujemy:

<appSettings>
   <add key="ProdKeyA" value="ProdValA"/>
   <add key="ProdKeyB" value="ProdValB"/>
   <add key="ProdKeyC" value="ProdValC"/>
 </appSettings>

Tak jak się spodziewaliśmy - ustawienia web.config zostały całkowicie zastąpione wartościami w web.release config. To było łatwe!

Joe
źródło
9

Jeśli chcesz przekształcić ustawienia aplikacji z pliku konfiguracji sieci do pliku web.Release.config, musisz wykonać następujące kroki. Niech plik ustawień aplikacji web.config to:

<appSettings>
     <add key ="K1" value="Debendra Dash"/>
  </appSettings>

Teraz jest web.Release.config do transformacji.

<appSettings>
    <add key="K1" value="value dynamicly from Realease"
       xdt:Transform="SetAttributes"
          xdt:Locator="Match(key)"   
         />
  </appSettings>

Spowoduje to przekształcenie wartości K1 na nową wartość w trybie rzeczywistym.

Debendra Dash
źródło
1

Nie lubię, aby transformacje zawierały więcej informacji niż było to konieczne. Zamiast przekształcać klucze, po prostu określam stan i intencję . O wiele łatwiej jest dostrzec zamiar, gdy robi się tak, przynajmniej IMO. Ponadto staram się umieścić wszystkie xdtatrybuty na pierwszym miejscu, aby wskazać czytelnikowi, że są to transformacje, a nie nowe rzeczy, które są definiowane.

<appSettings>
  <add xdt:Locator="Condition(@key='developmentModeUserId')" xdt:Transform="Remove" />
  <add xdt:Locator="Condition(@key='developmentMode')" xdt:Transform="SetAttributes"
       value="false"/>
</appSettings>

Na powyższym znacznie łatwiej jest zauważyć, że pierwszy usuwa element. Drugi to ustawianie atrybutów. Ustawi / zastąpi zdefiniowane tutaj atrybuty. W takim przypadku zostanie po prostu ustawione valuena false.

Kodowanie Yoshi
źródło