为什么Wix MSI不包含源文件并在其他地方查找源文件?

时间:2014-11-09 02:26:24

标签: wix

我已经使用了Wix近一年了。经过一段时间的休息后,现在我又回到了wix,需要再次建立一个wix Msi,但我发现了一个我以前没见过的非常奇怪的事情。在我创建msi文件并将msi复制到某个地方进行安装之后。在安装过程中,它显示一个错误,它无法从文件夹中找到源文件:当前msi位置\ EasyLobby \ Cogito。我想知道为什么它试图从该位置找到源文件。然后我发现在编译期间从项目中,它总是在bin \ Debug文件夹下创建\ EasyLobby \ Cogito。因此,如果我从... bin \ Debug运行msi,它运行正常,因为\ EasyLobby \ Cogito文件夹就在那里。 \

看起来很奇怪。 msi文件应包含所有源文件,不应在其他位置查找源文件。这是product.wxs文件:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

<Product Id="*" Name="SetupCogito" Language="1033" Version="2.0.0.0" Manufacturer="Microsoft" UpgradeCode="96cb03c9-6a03-4344-b816-20a0bb9e5df0">
<Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" />

<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Media Id="1" Cabinet="Server.cab" EmbedCab="yes" />
<!--<MediaTemplate />-->

<Feature Id="ProductFeature" Title="SetupCogito" Level="1">
  <ComponentGroupRef Id="ComponentGroup"/>
  <ComponentRef Id="EasyLobbyCogitoShortcut" />
</Feature>
<WixVariable Id="WixUILicenseRtf" Value="Files\LicenseAgmt.rtf"/>

<UIRef Id="CogitoUI_Installdir" />

<Property Id="WIXUI_INSTALLDIR" Value="COGITOFOLDER" />
<Binary Id="banner_bmp" SourceFile="Files\Banner.bmp"/>
<Property Id ="PIDTemplate" >
  <![CDATA[&&&-&&&&&&-&&&&-&&&&]]>
</Property>

<Icon Id="ELCogitoConfig.exe" SourceFile="..\CogitoIntegration\ELCogitoConfig.exe" />
  </Product>

<Fragment>
<Binary Id="CustomActions"
       SourceFile="..\CustomActions\bin\Debug\CustomActions.CA.dll" />

   <CustomAction Id="IsValidKeyCode"
              BinaryKey="CustomActions"
              DllEntry="IsValidKeyCode"
              Execute="immediate"
              Return="check" />    
   <InstallExecuteSequence>
   <Custom Action="IsValidKeyCode"
        Before='InstallFinalize'>NOT Installed</Custom>
   </InstallExecuteSequence>

   </Fragment>


  <Fragment>
  <Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLFOLDER" Name="EasyLobby" >
      <Directory Id="COGITOFOLDER" Name="Cogito"/>
    </Directory>
  </Directory>

 <Directory Id="ProgramMenuFolder">
    <Directory Id="ApplicationProgramsFolder" Name="EasyLobby Cogito" />
  </Directory>

</Directory>
</Fragment>

<Fragment>
 <DirectoryRef Id="COGITOFOLDER">
  <Component Id="EasyLobbyCogitoShortcut" Guid="{BFE6EB30-0F71-4F92-8D93-84B4EBF41F0E}" >
    <File Id="Easy" Source="$(var.SourceDir)\ELCogitoConfig.exe" />
    <Shortcut Id="ApplicationStartMenuShortcut"  Name="Cogito Configuration"    Directory="ApplicationProgramsFolder"
      WorkingDirectory='INSTALLDIR' Icon="ELCogitoConfig.exe" IconIndex="0" Advertise="yes"/>
  </Component>
 </DirectoryRef>

  

这是项目文件中的加热配置:

<Target Name="BeforeBuild">
<PropertyGroup>
  <DefineConstants>SourceDir= C:\Development\SetupCogito\CogitoIntegration;</DefineConstants>
  <LinkerBaseInputPaths>..\CogitoIntegration\</LinkerBaseInputPaths>
</PropertyGroup>
<HeatDirectory OutputFile="CogitoSetup.wxs" Directory="..\CogitoIntegration" PreprocessorVariable="var.SourceDir" DirectoryRefId="COGITOFOLDER" ComponentGroupName="ComponentGroup" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" AutoGenerateGuids="false" GenerateGuidsNow="true" ToolPath="$(WixToolPath)" />

1 个答案:

答案 0 :(得分:2)

这一行是你的问题:

<Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" />

Compressed=no更改为Compressed=yes,它将包含已完成的MSI中的所有源文件。如果不压缩它,则完成的文件不包含在MSI中,如果在运行时无法找到它们,则会出现错误。

请参阅Package reference