WIX- 설치 시퀀스를 알아 내려고합니다
-
13-09-2019 - |
문제
대형 앱을 설치하고 있으며 그 중 일부는 대상 데이터베이스에 대해 SQL 스크립트를 대량 실행하기 위해 "dbupdatemanager"라는 사용자 정의 서면 도구입니다.
현재 Wix 2.X 설치 작업은 작동하지만 한 가지 결함이 있습니다. 설치 중에는 몇 가지 Windows 서비스를 설치하여 선택적으로 즉시 시작할 수 있습니다. 그러나 DBUPDATEMANAGER가 아직 실행되지 않은 경우에는 실패 할 것입니다.
그래서 내가 성취하려는 것은 다음과 같습니다.
- 내 MSI에서 DBUPDATEMANAGER 및 내 서비스를 설치하십시오
- DBUPDATEMANAGER를 실행하십시오 전에 서비스가 시작됩니다
내 현재 Wix 소스는 다음과 같습니다.
<Directory Id='INSTALLDIR' Name='DbUpdMgr' LongName='DbUpdateManager' >
<!-- DbUpdateManager component with the necessary files -->
<Component Id='DbUpdateManagerComponent' Guid='...' DiskId='1'>
<File Id='DbUpdateManagerFile' LongName='DbUpdateManager.Wizard.exe'
Name='DbUmWz.exe' src='DbUpdateManager.Wizard.exe' KeyPath='no' />
</Component>
<!-- Component to install one of my Windows services -->
<Component Id='InstallServiceComponent' Guid='...' DiskId='1'>
<File Id='InstallServiceFile' LongName='MyService.exe'
Name='MyServic.exe' src='MyService.exe' KeyPath='yes'/>
<ServiceInstall Id='InstallMyService' Name='MyService'
Description='My Service' ErrorControl='normal'
Start='auto' Type='ownProcess' Vital='yes' />
<ServiceControl Id='UninstallMyService' Name='MyService'
Remove='uninstall' Wait='yes' />
</Component>
<!-- Feature for the DbUpdateManager referencing the above component -->
<Feature Id='DbUpdateManager' ConfigurableDirectory='INSTALLDIR'
AllowAdvertise='no' Description='DbUpdateManager' Level='1'
Title='Database Update Manager'>
<ComponentRef Id='DbUpdateManagerComponent'/>
</Feature>
<!-- Custom action for running DbUpdateManager -->
<CustomAction Id='RunDbUpdateManagerAction' FileKey='DbUpdateManagerFile'
ExeCommand='' Return='asyncWait' />
<!-- Calling the custom action in the install sequence -->
<InstallExecuteSequence>
<RemoveExistingProducts After='InstallInitialize' />
<Custom Action='RunDbUpdateManagerAction'
After='InstallFinalize'>&DbUpdateManager=3</Custom>
나는이 wix를 상속했고 그것이 작동하지만 내가 말했듯이 DBUPDATEMANAGER는 프로세스에서 너무 늦게 호출됩니다 ( "After = installingFinalize"만) 서비스는 처음에는 제대로 시작되지 않습니다 (두 번째로 잘 작동합니다. DBUPDATEMANAGER가 실행 된 후 수동으로 다시 시작할 때 주위).
나는 MSI 문서를 약간 찌르고 "StartServices"라는 멋진 단계를 발견 했으므로 내 직감은 내 커스텀 액션을 변경하는 것이 었습니다.
<InstallExecuteSequence>
<Custom Action='RunDbUpdateManagerAction'
Before='StartServices'>&DbUpdateManager=3</Custom>
불행히도,이 경우에는 전혀 아무 일도 일어나지 않습니다. DBUPDATEMANAGER는 결코 전화를받지 않습니다 ....
왜 아이디어가 있습니까? MSI/WIX 물건을 디버깅하는 것은 정말 까다로워서 더 이상 나무의 숲을 볼 수없는 것 같습니다 ....
감사! 마크
편집 : "rundbupdatemanageraction"은 MSI의 InstallexeCutesequence 테이블에서 올바른 위치에 배치됩니다. 설치 서비스 직후와 STARKERVICES 바로 직전에 작동하지 않습니다. ~ 아니다 설치 중에 나타납니다 :-(
편집 2 : 이제 내 행동이 실행되는 것처럼 보이고 적시에 - 불행히도, 나는 마법사를 보지 못합니다. 시작할 수 없습니다 "-WTF ???
MSI (S) (2C : D8) [20 : 53 : 36 : 383] : 행동 수행 : rundbupdatemanagerAction ACTION ACTION 20:53:36 : RundBupDatemanagerAction. 액션은 20:53:36에 시작되었습니다. MSI (S) (2C : D8) [20 : 53 : 36 : 383] : 작업 수행 : STARTERVICES ACTION 20:53:36 : STARTERVICES. 서비스가 시작되고 있습니다. 20:53:36 : STARKERVICES에 시작됩니다. 액션은 20:53:36에 완료되었습니다. 반환 값 1631.
다른 팁
글쎄, 나는 마침내 응답 한 모든 사람의 도움을 받아 Wix 튜토리얼 중 일부를 상담하고 웹에서 페이지를 도와 주면서 마침내 작동했습니다. MSI 설치 프로그램은 알아 내고 배우기가 쉽지 않습니다 ......
기본적으로, 나는 사용자 정의 조치의 실행을 "연기"(Rob이 제안한대로)로 변경했고 "After = installfiles"로 실행되는 시퀀스의 지점을 옮겼습니다. 나는 또한 조건을 변경했다u003CCustom> "설치되지 않은"태그는 내 시나리오에서 잘 작동하는 것 같습니다.
Rob의 두려움과 달리 DB 업데이트 관리자와 UI가 이런 식으로 잘 어울리 며 데이터베이스를 업데이트하는 프로세스가 이제 데이터베이스 (데이터베이스에 따라 다름)가 시작되기 전에 완료됩니다.
Wix 3.0 (및 미래)의 전체 RTM 릴리스를 기대합니다!
모든 사람 덕분에 - 불행히도, 나는 하나의 대답 만 받아 들일 수있었습니다 - 모두 그럴만 한 가치가 있었을 것입니다.
마크
사용자 정의는 설치중인 'dbupdatemanagerfile'에 따라 다릅니다. 즉, 사용자 정의를 예약해야합니다 ~ 후에 installfiles가 실행됩니다. Installexecutesequence에 두 번의 패스가 있다는 것을 기억하십시오. 먼저, 트랜잭션 로그를 구축하기 위해 "즉시"(또는 "예약 된"또는 "스크립트 생성") 조치가 실행됩니다 (일명 : "설치 스크립트"). 둘째, 트랜잭션 로그에서 "지연된"조치가 실행됩니다.
지금 당신의 사용자 정의가 "즉시"(기본값)이므로 실행하려고합니다. ~ 전에 파일은 실제로 컴퓨터에 복사됩니다. InstallFiles 동작은 사용자 정의 전에 스크립트에 있지만 아직 실행되지 않았습니다.
따라서, 당신은 당신의 사용자 정의를 "연기"라고 표시해야합니다. ~ 후에 파일이 설치되어 있습니다.
참고 : 연기 된 CA에서 UI를 보여줄 수는 없습니다. 이 도구가 UI를 보여줄 것으로 예상되는지 확신하지 못했습니다.
추신 : 잘 설명하지 않았다면 죄송합니다. 하루가 길었습니다.
.msi를 열 수 있습니다 범고래 그리고 Installexecutesequence 테이블을보고 실제로 어떤 순서가 일어나고 있는지 확인하십시오. 이것은 실제로 어떤 일이 일어나고 있는지에 대한 좋은 아이디어를 줄 수 있습니다.