2017-09-20 14 views
0

필자의 좌절감이 10에 가까워지고 있습니다. 저는 몇 주 동안 wix 설치 프로그램을 작업 해 왔습니다. 이 설치 프로그램은 Google 소프트웨어의 전제 조건을 설치합니다. 비주얼 스튜디오가 없기 때문에 배치 파일을 만들어서 (명령 행 읽기 만) wix 프로젝트를 만들었습니다. 이 번들에는 .msi, .msu 및 .exe 파일을 포함하는 약 9 가지 선행 조건이 있습니다.Wix ExePackage는 설치시 DetectCondition, InstallCondition과 상관없이 항상 설치됩니다.

제 질문은 체인 요소에 설명 된 ExePackage와 관련이 있습니다. DetectCondition, InstallCondition, Install 및 Unistall과 상관없이 여러 개의 ExePackages가 항상 설치됩니다. 로그 파일에는 DetectCondition = true 및 InstallCondition = false가 표시되지만 ExePackages는 여전히 실행 및 설치됩니다. 마다. 시각.

나는 지난 2 주간의 좌절감에서 어딘가에 ExePackages가 설치 프로그램에서 .msi 파일과 동일한 가시성을 허용하지 않으며 그 때문에 내가 다루고있는 것과 정확히 같은 문제를 일으킬 수 있다고 읽었습니다. exePackage가 실행되고 실제 .exe 파일에 적절한 내부 플래그가없는 경우이를 제거하는 대신 설치하는 방법을 언급하는 사람을 기억하는 것 같습니다. 그러나 내가 올바르게 기억하면 그 질문에 대한 답변이 좋았지 만, 특정 조건에서 ExePackage의 실행을 완전히 막을 수있는 것을 찾을 수 없었습니다.

편집 1 : WiX 버전 3.7을 사용하고 있습니다.

나는 이것을 수행하는 방법에 대한 단서를 제공하는 예제 또는 라이프 라인을 원합니다. 여기에 문제 ExePacakge의 예 : 당신의 도움이 사전에

[0910:0794][2017-09-20T06:30:33]i000: Setting numeric variable 'CHROMEEXISTS' to value 1 
[0910:0794][2017-09-20T06:30:33]i000: Setting version variable 'CHROMEVERSION' to value '51.0.2704.103' 
[0910:0794][2017-09-20T06:30:33]i052: Condition 'CHROMEEXISTS AND CHROMEVERSION="51.0.2704.103"' evaluates to true. 
[0910:0794][2017-09-20T06:30:33]i101: Detected package: Chrome, state: Present, cached: None 
[0910:0794][2017-09-20T06:30:34]i052: Condition '(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' evaluates to false. 
[0910:0794][2017-09-20T06:30:34]w321: Skipping dependency registration on package with no dependency providers: Chrome 
[0910:0794][2017-09-20T06:30:34]i000: Setting string variable 'WixBundleLog_Chrome' to value 'C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome.log' 
[0910:0794][2017-09-20T06:30:34]i000: Setting string variable 'WixBundleRollbackLog_Chrome' to value 'C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome_rollback.log' 
[0910:0794][2017-09-20T06:30:34]i201: Planned package: Chrome, state: Present, default requested: Absent, ba requested: Absent, execute: Uninstall, rollback: Install, cache: Yes, uncache: Yes, dependency: None 
[01B4:0E6C][2017-09-20T06:30:54]i305: Verified acquired payload: Chrome at path: C:\ProgramData\Package Cache\.unverified\Chrome, moving to: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe. 
[01B4:0F1C][2017-09-20T06:31:19]i301: Applying execute package: Chrome, action: Uninstall, path: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe, arguments: '"C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ChromeStandaloneSetup64-v51.0.2704.103.exe"' 
[0910:0794][2017-09-20T06:31:33]i319: Applied execute package: Chrome, result: 0x0, restart: None 
[01B4:0F1C][2017-09-20T06:31:59]i351: Removing cached package: Chrome, from path: C:\ProgramData\Package Cache\9102865AE2381BC34E91C107DA5818CF971356E8\ 
[0910:0794][2017-09-20T06:32:02]i410: Variable: CHROMEEXISTS = 1 
[0910:0794][2017-09-20T06:32:02]i410: Variable: CHROMEVERSION = 51.0.2704.103 
[0910:0794][2017-09-20T06:32:02]i410: Variable: WixBundleLog_Chrome = C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome.log 
[0910:0794][2017-09-20T06:32:02]i410: Variable: WixBundleRollbackLog_Chrome = C:\Users\User\AppData\Local\Temp\MyProgram_20170920063033_2_Chrome_rollback.log 

감사 :

... 
<Bundle Name='MySoftware' Version='1.0.0.0' Manufacturer='MyCompany' 
    UpgradeCode='{GUID}' 
    Condition='(VersionNT >= v6.1 AND ServicePackLevel >= 1)'> 

    ... 
    <util:FileSearch Id='CheckChromeVersion' Path='[ProgramFilesFolder]Google\Chrome\Application\chrome.exe' Variable='CHROMEVERSION' Result='version' /> 
    <util:FileSearch Id='CheckChromeExists' Path='[ProgramFilesFolder]Google\Chrome\Application\chrome.exe' Variable='CHROMEEXISTS' Result='exists' /> 
    ... 

    <Chain> 
     ... 
     <ExePackage Id='Chrome' 
      Compressed='yes' 
      SourceFile='.\installers\ChromeStandaloneSetup64-v51.0.2704.103.exe' 
      PerMachine='yes' 
      DetectCondition='CHROMEEXISTS AND CHROMEVERSION="51.0.2704.103"' 
      InstallCondition='(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' /> 
     ... 
    </Chain> 
</Bundle> 
... 

그리고 여기에 로그 파일에서 '크롬'의 모든 인스턴스입니다.

+0

'InstallCondition'의 경우 : 조건이 false로 평가되고 번들이 설치, 복구 또는 수정되는 경우 패키지가 제거됩니다. 즉, 패키지를 제거하려고 시도해야하지만 제거 명령은 제공되지 않습니다. 상상한다는 것은 설치 프로그램이 무시하는 몇 가지 매개 변수를 사용하여 번들이 설치 프로그램을 실행하고 있음을 의미합니다. 'ChromeStandaloneSetup64-v51.0.2704.103.exe' (제거 할 수있는 경우)를 제거하는 데 필요한 매개 변수와 함께 'UninstallCommand'를 추가하십시오. – philselmer

+1

사실,'DetectCondition'이 false (또는 생략 됨)로 평가되면 번들이 패키지를 설치하기 때문에 실제로 InstallCondition 만 제거 할 수 있다고 생각합니다. "Burn은이 조건을 사용하여 번들 동작 중에이 패키지를 처리하는 방법을 결정합니다 (예 :이 조건이 false이거나 생략되고 번들이 설치되는 경우 Burn은이 패키지를 설치합니다). – philselmer

+0

고맙습니다. InstallCondition을 제거해도 작동했습니다. 그가 쓴 이후 Brian Sutherland의 답은 정확하다고 표시했습니다. 응답 해 주셔서 감사합니다. – Scottlysan

답변

1

이 문제는 패키지를 설치하기 전에 평가하는 당신의 ExePackage

시킨 상태에서 InstallCondition에 의해 발생되고있다. 조건이 true로 평가되는 경우에만 패키지가 설치됩니다. 조건이 false로 평가되고 번들이 설치, 복구 또는 수정되는 경우 패키지가 제거됩니다.

로그에 DetectCondition이 올바르게 "True"로 평가되어있어 번들이 올바른 버전의 Chrome을 감지했음을 알 수 있습니다. InstallCondition false로 평가되고 그러나

[0910:0794][2017-09-20T06:30:34]i052: Condition '(NOT CHROMEEXISTS) OR (NOT CHROMEVERSION="51.0.2704.103")' evaluates to false. 

이는 내가 어디 선택적으로 할 수있는 경우에 사용하도록되어 생각 조건을 설치

[0910:0794][2017-09-20T06:30:34]i201: Planned package: Chrome, state: Present, default requested: Absent, ba requested: Absent, execute: Uninstall, rollback: Install, cache: Yes, uncache: Yes, dependency: None 

을 보여주기 위해이 계획 선 발생 이미 시스템에있는 항목이나 부트 스트 래퍼의 UI 부분에서 설치하도록 선택한 항목을 기반으로 설치하십시오. 예 : 다른 프로그램이 이미 존재하는 경우이 ExePackage를 사용할 수 있습니다. 그렇지 않은 경우 다른 프로그램을 더 이상 설치하지 않으면 제거 할 수 있습니다. 이 경우 설치 조건을 사용하지만 일반적으로 설치 조건을 정의하는 것은 유용하지 않습니다.

아래의 오래된 대답은 질문에 적용되지 않지만 상태에서


버전 비교

을해야 내가 떠날거야, 그래서 여전히 버전 비교 조건을 가진 사람에게 도움이 될 수 있습니다

CHROMEVERSION gt;= v51.0.2704.103

v 버전의 infront는 wix에게 조건을 두 가지 버전 변수로 평가하도록 지시합니다. 모든 RegistrySearch 변수는 문자열 변수이며 조건 변수의 비교는 변수 자체의 형식에 따라 평가됩니다. 레지스트리 검색은 항상 문자열이므로 표현식의 다른 피연산자는 비교 유형이 어떤지 판단합니다.

+0

저는 RegistrySearch 대신 FileSearch를하고 있습니다. 설치 로그를보고 FileSearch의 버전을 큰 따옴표로 묶어야합니다. 적어도 저에게 도움이되는 것은 무엇입니까. – Scottlysan

+0

와우 그래, 나는 그저 "InstallCondition"을 전혀 사용하지 않겠다는 질문을 다시 읽으면서 완전히 비워 두었습니다. 부트 스트 래퍼 번들에서는 사용하지 않습니다. 그것은 당신이 기대하는 바를하지 않습니다. 그리고 파일 검색에서 "버전"변수를 얻는 것처럼 보입니다. 적어도 하나는 버전 비교 일 것입니다. 따라서 버전 비교가 이루어 지므로 모든 것이 좋습니다. –

+0

InstallCondition을 제거합니다. 도움이되는지 확인하십시오. 감사. – Scottlysan