WiX 3.5.我的安装项目除了:
可以在没有任何"目录"元素的情况下构建WiX项目吗?
这是我的WiX项目中的XML代码:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">
<Product
Id="GUID"
Name="SetupProject1" Language="1033" Version="1.0.0.0"
Manufacturer="SetupProject1" UpgradeCode="GUID">
<Package InstallerVersion="200" Compressed="yes" Languages="1033" SummaryCodepage="1252" />
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<Binary Id="testRootCABinaryStream"
SourceFile="D:\testRootCA.cer" />
<Binary Id="testSigningBinaryStream"
SourceFile="D:\testSigning.cer" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="SetupProject1">
<Component Id="RegistrySetting" Guid="GUID">
<iis:Certificate Id="testRootCA"
BinaryKey="testRootCABinaryStream"
Name="Test Root CA Certificate"
Overwrite="yes"
Request="no"
StoreLocation="localMachine"
StoreName="root"/>
<iis:Certificate Id="testSigning"
BinaryKey="testSigningBinaryStream"
Name="Test Signing Certificate"
Overwrite="yes"
Request="no"
StoreLocation="localMachine"
StoreName="trustedPublisher"/>
<RegistryValue Root="HKLM" Key="Software\Microsoft\Silverlight"
Name="AllowElevatedTrustAppsInBrowser"
Type="integer" Value="00000001" KeyPath="yes" />
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id="Complete" Title="SetupProject1" Level="1">
<ComponentRef Id="RegistrySetting" />
<ComponentGroupRef Id="Product.Generated" />
</Feature>
</Product>
</Wix>
Run Code Online (Sandbox Code Playgroud)
实际上这段代码不会在Program Files文件夹中创建任何目录,但是如果我编译没有Directory元素的项目(在我的情况下,Component元素紧跟在Binary元素之后),它就会失败并出现以下错误:
"找不到Component/@ Directory属性;它是必需的."
UPDATE
感谢Yan的详细解答.现在我在目录部分的代码片段看起来像(现在它更正确):
<Directory Id="TARGETDIR" Name="SourceDir" />
<DirectoryRef Id="TARGETDIR">
<Component Id="CompleteInstallation" Guid="Guid">
<iis:Certificate Id="testRootCA"
BinaryKey="testRootCABinaryStream"
Name="Test Root CA Certificate"
Overwrite="yes"
Request="no"
StoreLocation="localMachine"
StoreName="root"/>
<iis:Certificate Id="testSigning"
BinaryKey="testSigningBinaryStream"
Name="Test Signing Certificate"
Overwrite="yes"
Request="no"
StoreLocation="localMachine"
StoreName="trustedPublisher"/>
<RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
<RegistryKey Root="HKLM" Key="Software\Microsoft\Silverlight">
<RegistryValue Name="AllowElevatedTrustAppsInBrowser"
Type="integer" Value="00000001" KeyPath="yes" />
</RegistryKey>
</Component>
</DirectoryRef>
Run Code Online (Sandbox Code Playgroud)
此行为的根源归结为Windows Installer体系结构.如您所知,WiX是一组用于创建Windows Installer程序包的工具,也就是说,它必须在某种程度上反映这项技术的关键概念,隐藏语法糖背后最奇怪和最荒谬的东西.而且它的工作非常出色,从版本到版本都得到了改进!
每个Windows Installer程序包都必须包含一个Directory表.来自MSDN:
Directory表必须指定单个根目录,其Directory列值等于TARGETDIR属性.
相应的WiX元素是:
<Directory Id="TARGETDIR" Name="SourceDir">
...
</Directory>
Run Code Online (Sandbox Code Playgroud)
所以,它必须在你的WiX创作中.如果您不打算在安装中包含任何目录/文件,则可以将组件放在此根Directory元素下.