web.config 변환을 사용하여“바꾸기 또는 삽입”을 수행하는 방법이 있습니까?


183

다른 환경에 대한 구성을 생성하기 위해 아래 게시물에 설명 된대로 web.config 변환을 사용하고 있습니다.

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

그러나 실제로 유용한 것은 ReplaceOrInsert 변환입니다. 왜냐하면 항상 특정 키가 있거나없는 원래 구성 파일에 의존 할 수는 없기 때문입니다.

이것을 할 수있는 방법이 있습니까?


제공하신 링크가 현재 작동하지 않습니다. 개념을 쉽게 이해할 수있는 다른 링크가 있습니까?
Ashish-BeJovial

@AshishJain 링크가 잘 작동합니다
Chris Haines

답변:


105

저렴한 해결 방법을 찾았습니다. "바꾸거나 삽입"해야하는 요소가 많으면 예쁘지 않고 잘 작동하지 않습니다.

"제거"와 "삽입 후 | 삽입 전"을 수행하십시오.

예를 들어

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

17
VS2012를 사용하는 경우 더 나은 솔루션이 있습니다. 아래를 참조하십시오 stackoverflow.com/a/16679201/32055
Chris Haines

1
필요한 경우 "InsertIfMissing"이 삽입 및 교체됩니까?
Jessy

InsertAfter를 사용하기 때문에 다른 옵션보다이 옵션을 선호합니다. InsertIfMissing은 어쨌든 Remove를 수행하는 경우 의미가 없습니다.
셰인 코트 릴

125

VS2012에서의 xdt:Transform="Remove"사용 과 함께 xdt:Transform="InsertIfMissing".

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

완전한! 이것이 우리가 기다리고 있었던 것입니다.
Chris Haines

9
이것은 OP 요청과는 전혀 관련이 없습니다.
BradLaney

2
원래 질문에 대한 답변을보다 명확하게 보여주기 위해 답변이 편집되었습니다.
Bon

25
나는 그것을 얻지 못한다. 물론 그것을 제거하면 누락 될 것입니다. 그 시점의 삽입물 일뿐입니까?
Chad Schouggins

6
@ChadSchouggins는 반드시 그런 것은 아닙니다. Remove작업은 첫 번째 항목 만 제거합니다. 일부 요소는 여러 번 나타날 수 있습니다. 나는 당신이 이것을 원한다고 상상할 수 없지만, 그것은 첫 번째 발생을 제거하고 InsertIfMissing작업을 건너 뛸 것입니다. 그러나 그가 RemoveAll대신 사용한다면 당신은 옳았을 것입니다.
Steven Liekens

89

InsertIfMissingappSetting이 존재하는지 확인 하려면 변환을 사용하십시오 .
그런 다음 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>

기존 노드가 상위 노드의 맨 아래로 이동하지 않기 때문에 이러한 기술은 remove + insert보다 훨씬 낫습니다. 새로운 노드가 끝에 추가됩니다. 기존 노드는 소스 파일에있는 그대로 유지됩니다.

이 답변은 최신 버전의 Visual Studio (2012 이상)에만 적용됩니다.


7

더 좋은 방법은 특정 속성 만 설정하기 때문에 요소가 존재하지 않는 경우에만 요소를 삽입하는 것입니다. 요소를 제거하면 기본 요소의 다른 속성이 있으면 버립니다.

예 : web.config (요소 없음)

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

web.config (요소 포함)

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

XPath 표현식과 함께 로케이터를 사용하여 노드가 존재하지 않으면 노드를 추가 한 다음 속성을 설정하십시오.

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

결과 web.config 파일에는 모두 includeExceptionDetailInFaults = "true"가 있고 두 번째 파일에는 remove / insert 메소드가없는 httpsHelpPageEnabled 속성이 유지됩니다.


1
이 아이디어가 마음에 들지만 요소가 이미 "소스 문서의 요소와 일치하지 않습니다 ..."가 있으면 오류가 발생합니다. 즉, "존재하지 않는"오류가 있으면 오류입니다.
goodeye

이것은 새로운 "InsertIfMissing"요소를 지원하지 않는 XDT 버전을 사용할 때 필요한 기술입니다.
IanBru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.