2010-11-30 8 views
2

주요 업그레이드에서만 실행할 수있는 사용자 지정 작업이 있습니다. 문제는 CA가 시스템 파일에 대한 액세스가 필요하기 때문입니다 (INI 파일에서 이전 버전의 프로그램을 제거함). CA는 지연되므로 CustomActionData 속성에만 액세스 할 수 있습니다.Wix : 조건부 지연된 사용자 지정 작업

따라서 첫 번째 시도는 UPGRADINGPRODUCTCODE가 true이면 CustomActionData를 설정 한 다음 CustomActionData에서 실제로 업그레이드를 수행 한 CA를 조정하는 것이 었습니다. 그게 실패했습니다 - CustomActionData가 설정되지 않았습니다. 내에서 사용자 정의 작업 인 내에서만 볼 수 있으며 사용자 정의 작업의 조건으로 사용할 수 없기 때문에 가정합니다.

다음

이있는 CA의 내가 정의 :

<CustomAction Id="MyCA.SetProperty" Return="check" Property="MyCA" 
    Value="[UPGRADINGPRODUCTCODE]" /> 

    <CustomAction 
     Id="MyCA" 
     BinaryKey="MyIniProcessingProgram" 
     ExeCommand="MyArgs" 
     Execute="deferred" 
     Impersonate="no" 
    Return="ignore"/> 

을 그리고 여기 내 InstallExecuteSequence에서이다 : 나는 또한 시도

<RemoveExistingProducts After="InstallValidate" /> 
<Custom Action="MyCA.SetProperty" Before="InstallFinalize"/> 
<Custom Action="MyCA" After="MyCA.SetProperty"> 
    CustomActionData 
</Custom> 

:

  • UPGRADINGPRODUCTCODE에 MyCA.SetProperty 조건부 만들기, MyCA.SetProperty가 실행되지 않아도 "After"작업이 수행되기 때문에 MyCA를 예약하면 작동하지 않습니다.

JavaScript/VBScript 작업을 피할 수 있거나 INI 업데이트 프로그램 자체에서 CustomActionData 값을 확인하는 것이 가장 좋습니다. CA 자신을 조건부로 만드는 것이므로 조건 (주요 업그레이드)이 참이 아닌 한 우리는 실행하지 않습니다.

답변

1

왜이 사용자 지정 작업을 사용하지?

<Custom Action="MyCA" After="InstallValidate"> 
     UPGRADINGPRODUCTCODE 
</Custom> 

그 UPGRADINGPRODUCTCODE가 업그레이드되는 패키지에 설정되어 있습니다, 그래서 그것은 단지 이전 버전의 제거 프로세스에 사용할 수하십시오. 당신이 당신의 새 버전에서 업그레이드를 검색하도록하려면

, 당신은 업그레이드 테이블의 ActionProperty 열을 사용할 수 있습니다 http://wix.sourceforge.net/manual-wix2/wix_xsd_upgradeversion.htm

: http://msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx

는 기본적으로, 당신은 나이가 최신 버전의 업그레이드 규칙을 정의해야

이렇게하면 사용자 지정 속성을 통해 이전 버전을 검색 할 수 있습니다. 그런 다음이 속성을 사용하여 사용자 지정 동작을 조정할 수 있습니다.

+0

아, 내 새 버전에는 UPGRADINGPRODUCTCODE가 설정되지 않은 것이 당연합니다. 액션이 연기 되었기 때문에 그것이라고 생각했지만, 그 속성은 업그레이드 된 _ 버전에서만 설정되기 때문입니다. ActionProperty를 향해 나를 가르쳐 주셔서 고맙습니다. 문제가되는 부분을 쉽게 해결할 수있었습니다. –

0

모든 동작을 게이트하는 데 사용되는 조건 (지연 포함)은 즉각적인 시퀀스의 조건입니다. 즉, 연기 된 행동조차도 조건의 일부로 UPGRADINGPRODUCTCODE을 직접 사용할 수 있습니다.

즉시 단계에서 설치 프로그램이이 순서에 도달하면 조건을 평가하고 조건이 참이면 지연된 실행을 예약합니다. 그런 다음 연기 된 시퀀스를 실행하면 즉시 단계에서 예약 된 모든 작업이 실행됩니다.

<CustomAction 
     Id="MyCA" 
     BinaryKey="MyIniProcessingProgram" 
     ExeCommand="MyArgs" 
     Execute="deferred" 
     Impersonate="no" 
Return="ignore"/> 

이 InstallExecuteSequence에서와 :

+0

사실, 스케줄링은 문제가 아니며, 나는 단지 잘못된 속성을 참조하고있었습니다. - 감사합니다! –