2017-09-10 6 views
0

OS 비트를 기준으로 두 개의 폴더 중 하나를 설치해야하는 설치 프로그램 스크립트 작업 중입니다. 선택은 지금까지는 문제가되지 않지만 몇 가지 이유 때문에 결과 설치 프로그램에서 하나의 폴더 만 볼 수 있습니다. NSIS : 32/64 비트를 기반으로 폴더를 설치하십시오.

관련 섹션

은 다음과 같습니다 : 경고 없기 때문에

;Windows 32 or 64 bit version 
!include "x64.nsh" 
Section "JRE 64 Bit" Section5 
     SectionIn RO 

     ;Use the right java version 
     DetailPrint "JRE extraction..." 
     SetOutPath "$INSTDIR\${APPDIR}\jre" 
     File /a /r "${SrcDir}\..\..\jre\jre_64\jre\*.*" 
     DetailPrint "JRE extraction complete!" 
SectionEnd 

Section "JRE 32 Bit" Section6 
     SectionIn RO 

     ;Use the right java version 
     DetailPrint "JRE extraction..." 
     SetOutPath "$INSTDIR\${APPDIR}\jre" 
     File /a /r "${SrcDir}\..\..\jre\jre_32\jre\*.*" 
     DetailPrint "JRE extraction complete!" 
SectionEnd 

Function .onInit 
    #Determine the bitness of the OS and enable the correct section 
    IntOp $0 ${SF_SELECTED} | ${SF_RO} 
    ${If} ${RunningX64} 
    SectionSetFlags ${Section5} $0 
    SectionSetFlags ${Section6} ${SECTION_OFF} 
    ${Else} 
    SectionSetFlags ${Section5} ${SECTION_OFF} 
    SectionSetFlags ${Section6} $0 
    ${EndIf} 
FunctionEnd 

두 폴더가 존재한다. 하지만 두 개의 폴더 (jre_64 및 jre_32)를 보는 대신 설치 프로그램에서 하나의 jre 폴더 만 보게됩니다. 이 예상되는 동작은

Installer Contents

인가? 나는 NSIS 2.51을 사용하고있다. 생성 된 스털링 기는 here입니다.

전체 스크립트 here을 볼 수 있습니다.

+0

어떻게 든 폴더를 덮어 쓰는 것을 깨달았습니다. – javydreamercsw

+0

섹션 플래그를 조작하려면 sections.nsh에서 도우미 매크로를 사용해야합니다. – Anders

답변

1

두 개의 jre 디렉토리가 상당히 비슷한 내용을 가지고 있어야하므로 델타 압축 때문일 것입니다. 7-Zip을 사용하여 볼 때 구조가 반드시 설치 프로그램의 내부 구조를 나타내는 것은 아니며 매우 불투명합니다.

Inno Setup의 경우 innounp과 같은 설치 프로그램을 "제대로"풀기위한 도구를 찾으려고했지만 성공하지 못했습니다. 이것은 NSIS 설치 프로그램 구조가 정말로 불투명해야 함을 확인합니다.

설치 프로그램이 두 경우 모두 예상대로 작동하는지 확인하기 위해 수동 테스트를 수행 했습니까?

+0

32 비트 머신이 없기 때문에 완전히 확인할 수는 없지만 64 비트에서는 정상적으로 작동합니다. – javydreamercsw

+0

일부 폐기 가능 설치 프로그램을 컴파일하고'$ {RunningX64}'조건을 더미 조건으로 바꾸고 두 가지가 모두 작동하는지 테스트하면됩니다. –

+0

좋은 지적, 나는 그것을 시도 할 것이다. – javydreamercsw

1

File 지침에 사용 된 경로는 설치 프로그램에 저장되지 않습니다 (폴더 인 경우 마지막 경로 구성 요소 제외). 개발 시스템에서 파일을 찾는 데 사용됩니다. 아는 바와 같이 SetOutPath은 대상 디렉토리를 설정하고 디 컴파일러는 해당 경로의 일부만 표시 할 수 있으며 (사용자 정의 변수를 해석 할 수 없음) 32 비트 및 64 비트 폴더 모두에 "jre"만 사용했습니다.

7-zip은 전체 디 컴파일러가 아니며 대상 경로 이름을 찾는 데 필요한 작업 만 수행하며 실제로 if 문에서 선택한 두 개의 다른 jre 폴더가 있다는 것을 이해하지 못합니다.

NSIS는 동일한 파일을 한 번만 저장하므로 스크립트 상단에 SetDatablockOptimize off을 추가하면 설치 프로그램의 크기가 두 배로 늘어납니다.

+0

실제로 설치 프로그램은 원본 경로를 저장하지 않으므로 대부분의 경우 파일을 추출 할 수있는 7-Zip의 기능은 보너스 기능으로 간주되어야하지만 매우 유용합니다. –