2012-12-03 2 views
6

나는 우리 회사에서 유지 보수해온 InstallShield 2012 Basic MSI 프로젝트를 가지고 있습니다. 저는 훈련 된 InstallShield 개발자가 아닙니다 (토템 기둥에서 가장 낮은 시점에). 그러나 모든 것을 버전간에 원활하게 실행하려면 몇 달 동안 충분히 습득했습니다.설치 프로그램이 클라이언트 용으로 분기 된 이전 DLL을 덮어 쓰지 않습니다.

최근 한 고객은 우리가 이전 버전의 제품에서 이미 최신 버전에서 수정 한 버그를 고쳐야한다고 주장했습니다. 전체 설치 프로그램이 업데이터로도 사용되기 때문에 일반적으로 패치를 작성하지는 않지만,이 경우 패치를 작성한 후 버전에 분기를 작성하여 업데이트 패치를 보냈습니다. 하나의 파일 만 해당 패치에 포함되었으며 대체 된 파일과 동일한 버전을 가지고있었습니다. 모든게 괜찮 았어.

오늘 고객이 최신 버전으로 업그레이드하려고합니다. 사실 우리는 그들의 브랜치를 메인 라인으로 다시 합치고 있으며, 브랜치에는 추가 컴포넌트 나 클라이언트 전용 코드가 없기 때문에 우리는 우리가 일반 설치 프로그램을 제공하고 모든 것을 덮어 쓸 수 있다고 생각했습니다. 그렇지 않다 ...

분기 된 설치를 복제하고 파일을 업데이트하려고 시도하면 설치 프로그램이 성공적으로 실행되고 모든 것을 대체하지만 분기 된 dll을 대체합니다. 'omus', 'amus', 강제 덮어 쓰기 등으로 변경하면 아무런 변화가 없습니다. 미리 파일을 삭제하면 아무 일도하지 않습니다. 제대로 업데이트

DLL : 아무리 노력할 분기 DLL이 남아 있지 및 로그가 다음과 같이 보입니다 (이름은 그대로 유지 유죄, 버전 및 GUID를 보호하기 위해 변경)

Executing op: RegisterSharedComponentProvider(,,File=dll_that_works.r1,Component={B4F132E0-6C2A-4138-990B-16B991F8C54D},ComponentVersion=1.1.1.195,ProductCode={B2F1D6AC-95A4-44A9-9A52-631A3AD14389},ProductVersion=1.1.1,PatchSize=0,PatchAttributes=0,PatchSequence=0,SharedComponent=0,IsFullFile=0) 
Executing op: FileCopy(SourceName=SY2F9C~1.DLL|dll_that_works.dll,SourceCabKey=dll_that_works.r1,DestName=dll_that_works.dll,Attributes=16384,FileSize=51584,PerTick=65536,,VerifyMedia=1,,,,,CheckCRC=0,Version=1.1.1.195,Language=0,InstallMode=130023424,,,,,,,) 
File: C:\inetpub\wwwroot\Service\bin\dll_that_works.dll; Overwrite; Won't patch; REINSTALLMODE specifies all files to be overwritten 
Source for file 'dll_that_works.r1' is compressed 

분지 DLL을 그 업데이트되지 않음 :

Executing op: SetSourceFolder(Folder=C:\Windows\Installer\$PatchCache$\Managed\CA6D1F2B4A599A44A92536A1A31D3498\1.1.1) 
Executing op: RegisterSharedComponentProvider(PatchGUID={EC6657A6-01A1-4AFC-86F9-1F4BF5F15481},MediaCabinet=#PCW_CAB_Family1,File=branched_dll.r,Component={74531F91-82A9-421D-A227-15DDDEDFC2FA},ComponentVersion=1.1.1.195,ProductCode={B2F1D6AC-95A4-44A9-9A52-631A3AD14389},ProductVersion=1.1.1,PatchSize=35952,PatchAttributes=0,PatchSequence=10000,SharedComponent=0,IsFullFile=0) 
Executing op: FileCopy(SourceName=branched_dll.r,SourceCabKey=branched_dll.r,DestName=branched_dll.dll,Attributes=0,FileSize=225664,PerTick=65536,,VerifyMedia=0,,TotalPatches=1,,,CheckCRC=0,Version=1.1.1.195,Language=0,InstallMode=130023424,,,,,,,) 
File: C:\inetpub\wwwroot\Service\bin\branched_dll.dll; Overwrite; Smart patch; REINSTALLMODE specifies all files to be overwritten 
Redirecting file copy of 'C:\inetpub\wwwroot\Service\bin\branched_dll.dll' to 'C:\Config.Msi\PTB2C9.tmp'. A subsequent patch will update the intermediate file, and then copy over the original. 
Source for file 'branched_dll.r' is uncompressed, at 'C:\Windows\Installer\$PatchCache$\Managed\CA6D1F2B4A599A44A92536A1A31D3498\1.1.1\'. 

이것은 약간 깊이 있습니다. 근처에 나는 분기 된 DLL을 패치하려고한다고 말할 수 있으므로, 그렇게 할 수 없으며 (필자가 정확하게 '스마트 패치'가 의미하는 것을 자세히 알 수없는) 몇 가지 이유로 임시 디렉토리에 파일을 던졌습니다. 나는 잘못된 버전에 적용된 패치로 일어난 것을 보았지만 이것은 패치가 아닙니다! REINSTALLMODE = v (oa) 및 REINSTALL = ALL을 사용하여 실행되는 일반 설치 프로그램입니다. 그것은 단지 이전 버전을보고, 새로운 버전이 임베드되어 있는지 확인하고, 이전 버전을 날려 버려야합니다.

내 즉각적인 목표는 다시이 클라이언트를 얻을 수 있습니다

(필자는 DLL을 업데이트하는 대신 수동으로 업데이터를 사용하여 시도 충동에 우리는 클라이언트. 모든 것이 제대로 업데이트, 그래서 파일 자체에 질식 아니에요 준) 동기화, 어떤 uninstalling없이 그리고 그들을 위해서만 특별한 업데이터를 만드는 대신 하나의 통일 된 설치 프로그램없이 선호. 파일이 이미 가능하다면 파일이 이미 있기 때문에 특별한 경우에는 위장 할 수 있습니다. 내 미래의 목표는 파일을 이전 버전으로 교체하고 파일을 대체하며 다른 것은 중요하지 않다고 가정 한 것처럼 자연스럽게 작동하도록하는 것입니다.

나는 모든 것을 제공했다고 생각하지만 그렇지 않다면 더 많은 정보를 제공 할 수 있습니다. 나는 이것을 보면서 오늘날의 더 나은 부분을 보냈으며 나는이 시나리오와 비슷한 어떤 것도 발견 할 수 없다.

답변

2

시나리오에 대한 설명에서 고객을 위해 패치 한 구성 요소에 대한 키 파일의 '수정 된 날짜'와 같은 소리가 업그레이드 패키지의 날짜보다 늦을 수 있지만 버전은 동일합니다. Windows Installer가 파일을 대체하지 않을 수 있습니다. Replacing Existing Files 및 FileF 행의 예

이 고객은 최신 업그레이드를 적용하기 전에 패치 된 구성 요소를 제거하는 사용자 지정 패키지를 사용해야 할 수도 있습니다.

+0

이것은 작동하지 않았지만 좋은 생각이었습니다. 분기 된 파일의 수정 날짜가 내가 교체하려고 시도한 구성 요소보다 새로운 것입니다. 두 파일 모두 버전이 지정되었으므로 중요하지 않아야 할 대체 논리에 따르면, 어쨌든 테스트할만한 가치가있었습니다. 업그레이드를 설치하기 전에 패치를 제거하는 것이 좋습니다. 이벤트의 순서에 따라 까다로울 수도 있지만 장기적인 솔루션으로 고려할 것입니다. – CC1

+0

처음에는 레지스트리에서 제품 코드를 검색하고 분기 된 패치를 참조하는 설치 프로그램을 식별 한 다음 MsiExec.exe/I {guid}로 제거하여 패치를 롤백 할 수있는 것처럼 보입니다. 관리가 잘되지 않는 동안; 그것이 효과가 있다면 나는 질문을 끝내고 끝낼 것입니다. – CC1