2011-12-22 4 views
5

VS 프로젝트가 아닌 명령 줄에서 Wix 3.6 베타를 사용하고 있습니다. 난 열로 수확되는 웹 응용 프로그램을 디렉토리로 가지고있다. 이 작동합니다. 각 대상 환경 web.config 파일을 관리하기 위해 web.config 변형을 사용하고 있습니다. 이것들은 msbuild로 출력됩니다.이 기능은 Visual Studio 및 소스 컨트롤에서 작업을 계속 볼 수있게합니다.Wix 사용 ASP.net 웹 응용 프로그램을 설치하는 동안 여러 web.config 파일 중 하나를 배포하는 방법

나는 수동으로 product.wxs에 조건을 포함하는 구성 요소를 포함시키는 여러 web.config 파일 중 하나를 배포하는 데 문제가 발생했습니다. 모든 구성 요소를 배포 가능한 기능으로 포함하고 조건을 활성으로 선택하도록했습니다. 예를 들면 :

 <DirectoryRef Id="wwwroot"> 
     <Component Id="setup_a" Guid="some_guid" > 
      <File Source="$(var.ConfigSourceDir)\setup_a\web.config" /> 
      <Condition>ENVIRON = setup_a</Condition> 
     </Component> 

     <Component Id="setup_b" Guid="some_guid" > 
      <File Source="$(var.ConfigSourceDir)\setup_b\web.config" /> 
      <Condition>ENVIRON = setup_b</Condition> 
     </Component> 

이동하거나 문제를 삭제, 모든 파일 이름 바꾸기를 만들 수 있지만 여러 Web.config의 파일이 동일한 대상에 매핑하는 매우 근본적인 문제가이 날의 빛 오류를 제공하지 않은이 (파일, 구성 요소, 기능)의 ID가 모두 중복되어 있는지 확인하십시오. ID : "Product.wxs (xxx) : 오류 LGHT0091 : 중복 된 심볼 'File : web.config' 독특합니다. "

다른 방법은 Web.config의 수 하나를 이동/다른의 .config라는 이름의 파일을 사용하고 이름을 변경, 그래서 뭔가 같은 : 이것은 CopyFile 수 BOT, 오류가 발생하지 않습니다

 <DirectoryRef Id="wwwroot"> 
       <Component Id="setup_a" Guid="some_guid" > 
       <File Id="setup_a.config" Source="$(var.ConfigSourceDir)\setup_a.config" /> 
       <CopyFile Id="moveit" SourceDirectory="wwwroot" SourceName="setup_a.config" DestinationDirectory="wwwroot" DestinationName="web.config" /> 
       </Component> 

명령은 아무것도하지 않습니다. wwwroot 폴더에 setup_a.config가 생겼습니다.

 <DirectoryRef Id="wwwroot"> 
       <Component Id="setup_a" Guid="some_guid" > 
       <File Id="setup_a.config" Source="$(var.ConfigSourceDir)\setup_a.config" > 
        <CopyFile Id="moveit" DestinationName="web.config"/> 
       </File> 
       </Component> 

을 ...하지만 중첩 된 CopyFile 수는 I가 (이 허용되지 않는 것) 삭제 = "예"속성을 추가 할 수 없음을 의미 :

내가 둥지는 CopyFile 수는 파일 안에 복사 작업은 다음 작동하는 경우 '이동'동작을 만듭니다. 대신 wwwroot 폴더에 setup_a.config와 web.config가 둘 다 있습니다. 나도 같은 구성 요소 내에 별도의 removefile를 추가하는 경우 또는, 그것은 또한 않습니다 아무것도 : 그래서

<RemoveFile Id="removefile" On="install" Directory="wwwroot" Name="setup_a.config"/> 
</Component> 

, 나는 작업 예를 조건부 배포에서 여러 Web.config의 파일을 처리하는 방법의에 대한 바라고 있어요 파일을 남기지 않습니다. web.config의 대상 파일 이름은 프레임 워크에 의해 고정되며 변경할 수 없습니다. 다른 설정은 설정 변환을 사용하여 wix 외부에서 미리 생성됩니다.이 설정은 변경할 수 없지만 생성 된 파일 이름은 아무 것도 될 수 없습니다.

환호!

답변

7

당신은 너무 복잡합니다. 이 작업을해야합니다 :

<Component Id="setup_a" Guid="some_guid" > 
     <File Name="web.config" Id="config_a" Source="$(var.ConfigSourceDir)\setup_a\web.config" /> 
     <Condition>ENVIRON = setup_a</Condition> 
    </Component> 

    <Component Id="setup_b" Guid="some_guid" > 
     <File Name="web.config" Id="config_b" Source="$(var.ConfigSourceDir)\setup_b\web.config" /> 
     <Condition>ENVIRON = setup_b</Condition> 
    </Component> 

에주의를 여기에 몇 가지에 :

  • 파일/@ 이름은 동일합니다 - 그것은 당신이하고자하는 대상 파일 이름 (웹입니다.설정)
  • 파일/@의 ID가 먼저 언급 한 빛 오류를 방지하기 위해 각 파일에 대해 다른
  • 파일/@ 소스가 아무것도 할 수 있습니다 - 그냥 소스로 어떤 파일을 취할 설명

이 샘플 라이트는 경고 LGHT1076에도 여전히 불만을 표시하지만 이는 단지 경고 일뿐입니다. 문제를 피하기 위해 조건은 상호 배타적이어야합니다.

+0

아아 이름 속성이 없어서 파일 요소가 엉망이되어서 이것이 작동하지 않는다고 생각하게되었습니다. 당신의 본보기가 작동했습니다, Yan에게 감사드립니다. –

+1

조금 깔끔하게 정리합니다 (ICE 유효성 경고 경고는 피하십시오). 구성 요소/파일을 web.config-a 및 web.config로 작성한 다음 CopyFile 요소를 사용하여 web.config에 복제합니다. ICE 좋고 깨끗합니다. 단점은 상자에 여분의 파일입니다. 위의 파일은 누군가 내가 web.config를 조작하고 비교/되돌리기를 원한다면 어떤 선택을했는지에 대한 시각적 단서와 처녀 파일의 복사본을 제공합니다. –

2

나는 보통 다른 접근 방식을 사용합니다. 여러 개의 상호 배타적 인 파일을 특정 인스턴스에 밀접하게 결합 된 설치 프로그램에 배치하는 대신 설치 프로그램에 일반 파일을 넣고 XML 변경을 사용하여 연결 문자열과 같은 변경 지점 데이터로 XML을 변환합니다.

이렇게하면 몇 가지 속성과 명령 줄을 전달하는 것만으로 어디서나 배포 할 수있는 설치 프로그램을 만들 수 있습니다.