2011-03-18 3 views
1

x86, amd64 및 Itanium로 컴파일 된 Windows 서비스 exe가 있습니다. 이 서비스를 설치하는 데 사용되는 단일 x86 WiX/MSI 설치 프로그램을 작성하려고합니다. 설치 프로그램에는 아키텍처 특정 조건을 가진 세 가지 구성 요소가 있습니다 (예 : <Condition>NOT VersionNT64</Condition>이 x86 감지에 사용됨). 따라서 특정 아키텍처에만 구성 요소 중 하나만 설치됩니다. 이러한 구성 요소는 exe의 x86, x64 또는 Itanium 빌드를 설치합니다.다중 플랫폼 WiX 설치 프로그램에 아키텍처 종속 서비스 설치

이 모든 것이 올바르게 작동하고 올바른 이진 파일이 세 플랫폼 각각에 설치됩니다.

다음 단계는 설치에 ServiceInstall 태그를 사용하여 내 EXE에 대한 Windows 서비스이며, 우리가 문제로 실행하는 곳이다 : 분명히 ServiceInstall 태그의 Name 속성이 윅스 파일 내에서 고유해야합니다. 예 : 서비스에 전화하고 싶습니다. 세 플랫폼 모두에서 FooBar이지만 허용되지 않습니다. WiX 파일은 이름 충돌로 인해 컴파일되지 않습니다.

해결 방법으로 아키텍처 의존적 인 서비스 이름을 가질 수 있습니다 (예 : FooBar_ia64하지만 이것은 나쁘다. 코드베이스에는 서비스 이름에 대한 가정을하는 여러 장소가있다. 따라서 서비스 이름을 변경하면 코드 기반에서이 모든 장소를 찾아 수정해야 할 것이다.

나는 세 가지 아키텍처에 설치 될 자신의 ComponentServiceInstall를 이동하려고했으나 ServiceInstall 태그는 분명히 암시 적 중 하나가 작동하지 않았다 그래서 같은 Component에 정의 된 File 태그를 참조합니다.

아키텍처 당 하나의 설치 프로그램을 생성 할 수 있으므로 설치 프로그램에서 조건이 적용되지 않으며 문제가 해결되지 않을 수도 있다는 것을 알고 있습니다. 그러나 3 가지 아키텍처 모두에 대해 하나의 설치 프로그램을 사용하는 것과 거의 흡사 할 때 3 인스톨러를 사용한다는 생각은 정말 싫습니다 :-)

이 문제를 해결하는 다른 방법은 없을까요?

당신이 아직 이것을 파악하지 못했을 경우를 대비하여, 제가 상속 한 레거시 코드베이스이며, 기존 레거시 설치 프로그램을 대체 할 새로운 설치 프로그램을 빌드하려고합니다.

답변

2

이것은 실제로 WiX의 버그처럼 보입니다. 당신이 말하는 것을 할 때 그것은 중복 된 Primary Key에 대한 에러 메시지를 생성하지만 실제로 MSI SDK의 ServiceInstall 테이블은 Name 컬럼에 대해 아무 것도 말하지 않습니다. 상호 배타적 인 구성 요소 사용자는 여러 버전의 서비스를 작성하고 구성 요소 규칙을 위반하지 않아야합니다.

아마도 WiX 팀은 사람들이 더 보수적이어서 사람들이 스스로를 쏘지 못하게 할 것이라고 생각합니다. 그들이 말한 다른 것은 처음에는 하이브리드 설치 프로그램을 수행하지 않지만 이미 알고 있습니다.

내가 생각할 수있는 최선의 방법은 설치 시간에 사용자 지정 작업을 사용하여 ServiceInstall 테이블에 임시 행을 작성하여이 컴파일 시간 제한을 피하는 것입니다.

관련 문제