2011-02-17 33 views
1

我有,我創建使用威克斯但是當我嘗試運行它針對MSI使用InstallShield創建我收到以下錯誤,工作正常崽文件問題:維克斯創建崽文件

Fatal schema conflict between CUB file and database. Unable to perform evaluation.

我有查看了installshield msi和cub中的模式,並且它似乎與少數幾列是長整型(4)和msi中的短整型(2)有關。

有沒有辦法改變wix如何在標準表上設置模式,如媒體,文件,CustomActions等?

或者,有沒有一種自動化的方式可以通過腳本調整MSI的模式?

+0

對不起,我沒有真正回答這個問題。速度閱讀:-( – 2011-02-18 03:02:53

回答

1

我寫了一個C#/ DTF ICE框架和我的博客上講述它在:

MSI Tip: Authoring an ICE using C#/DTF

實際的源代碼可從以下地址下載:

Authoring an ICE using C#/DTF

維克斯沒有一個「CUB」元素說,但我能夠「足夠接近」。我記得與Rob的電子郵件交換,要求在WiX的官方支持,但答覆是最好的。

下面是可用的源代碼片段:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="c3252df2-a757-4874-8dc6-0e235f130818" Name="Cub" Version="1.0.0.0" Language="1033" Manufacturer="Cub"> 
    <Package InstallerVersion="200" Compressed="yes"/> 

    <Binary Id="ICE" SourceFile="$(var.Tests.TargetDir)$(var.Tests.TargetName).CA.dll"></Binary> 

    <CustomAction Id="ICE_DE_10" BinaryKey="ICE" DllEntry="ICE_DE_10"/> 
    <CustomAction Id="ICE_DE_20" BinaryKey="ICE" DllEntry="ICE_DE_20"/> 

    <CustomTable Id="_ICESequence"> 
     <Column Id="Action" PrimaryKey="yes" Type="string" Width="72" Category="Identifier" Description="Name of ICE action to invoke" Modularize="Column" /> 
     <Column Id="Condition" Type="string" Width="255" Nullable="yes" Category="Condition" Description="Optional expression which skips the ICE action if evaluates to expFalse."/> 
     <Column Id="Sequence" Type="int" Width="2" Nullable="yes" MinValue="0" MaxValue="32767" Description="Number that determines the sort order in which the ICE actions are to be executed." /> 
     <Row> 
     <Data Column="Action">ICE_DE_10</Data> 
     <Data Column="Condition"></Data> 
     <Data Column="Sequence">10</Data> 
     </Row> 
     <Row> 
     <Data Column="Action">ICE_DE_20</Data> 
     <Data Column="Condition"></Data> 
     <Data Column="Sequence">20</Data> 
     </Row> 
    </CustomTable> 

    <AdminUISequence> 
     <CostInitialize Suppress="yes"/> 
     <FileCost Suppress="yes"/> 
     <CostFinalize Suppress="yes"/> 
     <ExecuteAction Suppress="yes"/> 
    </AdminUISequence> 

    <AdminExecuteSequence > 
     <CostInitialize Suppress="yes"/> 
     <FileCost Suppress="yes"/> 
     <CostFinalize Suppress="yes"/> 
     <InstallValidate Suppress="yes"/> 
     <InstallInitialize Suppress="yes"/> 
     <InstallAdminPackage Suppress="yes"/> 
     <InstallFiles Suppress="yes"/> 
     <InstallFinalize Suppress="yes"/> 
    </AdminExecuteSequence> 

    <AdvertiseExecuteSequence> 
     <CostInitialize Suppress="yes"/> 
     <CostFinalize Suppress="yes"/> 
     <InstallValidate Suppress="yes"/> 
     <InstallInitialize Suppress="yes"/> 
     <PublishFeatures Suppress="yes"/> 
     <PublishProduct Suppress="yes"/> 
     <InstallFinalize Suppress="yes"/> 
    </AdvertiseExecuteSequence> 

    <InstallUISequence> 
     <CostInitialize Suppress="yes"/> 
     <FileCost Suppress="yes"/> 
     <CostFinalize Suppress="yes"/> 
     <ValidateProductID Suppress="yes"/> 
     <ExecuteAction Suppress="yes"/> 
    </InstallUISequence> 

    <InstallExecuteSequence> 
     <CostInitialize Suppress="yes"/> 
     <FileCost Suppress="yes"/> 
     <CostFinalize Suppress="yes"/> 
     <ValidateProductID Suppress="yes"/> 
     <InstallValidate Suppress="yes"/> 
     <InstallInitialize Suppress="yes"/> 
     <InstallFinalize Suppress="yes"/> 
     <PublishFeatures Suppress="yes"/> 
     <PublishProduct Suppress="yes"/> 
     <ProcessComponents Suppress="yes"/> 
     <UnpublishFeatures Suppress="yes"/> 
     <RegisterUser Suppress="yes"/> 
     <RegisterProduct Suppress="yes"/> 
    </InstallExecuteSequence> 

    </Product> 
</Wix> 

此外,我的作爲後生成事件以下(微星複製到CUB)

<PostBuildEvent>copy "$(TargetPath)" "$(TargetDir)$(TargetName).cub" 
del "$(TargetPath)"</PostBuildEvent> 
+0

感謝您回覆我。您的博客文章是我開始創建CUB的地方:)。除了當我嘗試運行由InstallShield創建的msi的CUB文件時,它的工作原理非常完美,因爲msi的架構看起來略有不同。你不會碰巧知道如何改變模式本身嗎?我曾嘗試使用自定義表來定義引起問題的內置表,但它只是恢復爲默認值。 – Wil 2011-02-17 23:18:06

+0

因爲你的博客文章給了我最初的解決方案,所以給你答案的答案:)。在wix中構建ICE驗證腳本。 :) – Wil 2011-02-18 00:59:36

0

下面的腳本修復問題。它出現Wix創建一個媒體和文件表,Windows安裝程序不喜歡如果架構不同。所以簡單的解決方案是在wix創建後期文件作爲後期構建操作後刪除兩個表。

Const msiOpenDatabaseModeTransact = 1 

Dim installer 
Dim db 
Dim view 
Set installer = CreateObject("WindowsInstaller.Installer") 
Set db = installer.OpenDatabase("Wix\Release\UnitTest.cub", msiOpenDatabaseModeTransact) 
Set view = db.OpenView("DROP TABLE `File`") 
view.Execute 
view.close 

Set view = db.OpenView("DROP TABLE `Media`") 
view.Execute 
view.close 

Set view = nothing 
db.commit 
Set db = nothing