문제

대형 앱을 설치하고 있으며 그 중 일부는 대상 데이터베이스에 대해 SQL 스크립트를 대량 실행하기 위해 "dbupdatemanager"라는 사용자 정의 서면 도구입니다.

현재 Wix 2.X 설치 작업은 작동하지만 한 가지 결함이 있습니다. 설치 중에는 몇 가지 Windows 서비스를 설치하여 선택적으로 즉시 시작할 수 있습니다. 그러나 DBUPDATEMANAGER가 아직 실행되지 않은 경우에는 실패 할 것입니다.

그래서 내가 성취하려는 것은 다음과 같습니다.

  1. 내 MSI에서 DBUPDATEMANAGER 및 내 서비스를 설치하십시오
  2. 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'>&amp;DbUpdateManager=3</Custom>

나는이 wix를 상속했고 그것이 작동하지만 내가 말했듯이 DBUPDATEMANAGER는 프로세스에서 너무 늦게 호출됩니다 ( "After = installingFinalize"만) 서비스는 처음에는 제대로 시작되지 않습니다 (두 번째로 잘 작동합니다. DBUPDATEMANAGER가 실행 된 후 수동으로 다시 시작할 때 주위).

나는 MSI 문서를 약간 찌르고 "StartServices"라는 멋진 단계를 발견 했으므로 내 직감은 내 커스텀 액션을 변경하는 것이 었습니다.

   <InstallExecuteSequence>
          <Custom Action='RunDbUpdateManagerAction' 
                  Before='StartServices'>&amp;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.

도움이 되었습니까?

해결책

설치의 로그 파일을 가져 와서 여기의 시퀀스 순서와 사용자 정의 작업을 수행 할 조건 값을 찾으십시오.

명령 줄에서 이것을 사용하십시오 : msiexec /i [msiname] /l*v [filename

편집 : 의견을 읽은 후이 페이지를 살펴보십시오. 여기 조건에 설치되지 않도록 추가 할 수 있습니다.

edit2 : 나는 이것을 발견했다 페이지 오류 번호 1631을 검색하십시오

다른 팁

글쎄, 나는 마침내 응답 한 모든 사람의 도움을 받아 Wix 튜토리얼 중 일부를 상담하고 웹에서 페이지를 도와 주면서 마침내 작동했습니다. MSI 설치 프로그램은 알아 내고 배우기가 쉽지 않습니다 ......

기본적으로, 나는 사용자 정의 조치의 실행을 "연기"(Rob이 제안한대로)로 변경했고 "After = installfiles"로 실행되는 시퀀스의 지점을 옮겼습니다. 나는 또한 조건을 변경했다u003CCustom> "설치되지 않은"태그는 내 시나리오에서 잘 작동하는 것 같습니다.

Rob의 두려움과 달리 DB 업데이트 관리자와 UI가 이런 식으로 잘 어울리 며 데이터베이스를 업데이트하는 프로세스가 이제 데이터베이스 (데이터베이스에 따라 다름)가 시작되기 전에 완료됩니다.

Wix 3.0 (및 미래)의 전체 RTM 릴리스를 기대합니다!

모든 사람 덕분에 - 불행히도, 나는 하나의 대답 만 받아 들일 수있었습니다 - 모두 그럴만 한 가치가 있었을 것입니다.

마크

사용자 정의는 설치중인 'dbupdatemanagerfile'에 따라 다릅니다. 즉, 사용자 정의를 예약해야합니다 ~ 후에 installfiles가 실행됩니다. Installexecutesequence에 두 번의 패스가 있다는 것을 기억하십시오. 먼저, 트랜잭션 로그를 구축하기 위해 "즉시"(또는 "예약 된"또는 "스크립트 생성") 조치가 실행됩니다 (일명 : "설치 스크립트"). 둘째, 트랜잭션 로그에서 "지연된"조치가 실행됩니다.

지금 당신의 사용자 정의가 "즉시"(기본값)이므로 실행하려고합니다. ~ 전에 파일은 실제로 컴퓨터에 복사됩니다. InstallFiles 동작은 사용자 정의 전에 스크립트에 있지만 아직 실행되지 않았습니다.

따라서, 당신은 당신의 사용자 정의를 "연기"라고 표시해야합니다. ~ 후에 파일이 설치되어 있습니다.

참고 : 연기 된 CA에서 UI를 보여줄 수는 없습니다. 이 도구가 UI를 보여줄 것으로 예상되는지 확신하지 못했습니다.

추신 : 잘 설명하지 않았다면 죄송합니다. 하루가 길었습니다.

.msi를 열 수 있습니다 범고래 그리고 Installexecutesequence 테이블을보고 실제로 어떤 순서가 일어나고 있는지 확인하십시오. 이것은 실제로 어떤 일이 일어나고 있는지에 대한 좋은 아이디어를 줄 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top