如何在 Wix 合并模块中安装字体

Posted

技术标签:

【中文标题】如何在 Wix 合并模块中安装字体【英文标题】:How to install fonts in Wix merge module 【发布时间】:2016-01-08 20:13:36 【问题描述】:

我正在尝试安装一些对我们的几个应用程序通用的字体,因此将它们放在一个共享的合并模块中似乎是可行的方法。但我无法获得准确的 Wix 语法。这是我的合并模块配置文件中的内容:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Module Id="TS3DFontsMerge" Language="1033" Version="1.0.0.0">
    <Package Id="F6029400-FD05-4213-A0B2-1755387595BF" Manufacturer="Tech Soft 3D" InstallerVersion="200" />
    <DirectoryRef Id="FontsFolder">
          <Component Id="TechSoft3DFonts" Guid="0B9C43FC-3835-42DE-80F6-1DB2A912BEE5">
              <File Id="ts3d.ttf" Source="..\..\..\samples\fonts\ts3d.ttf" TrueType="yes" />
              <File Id="MyriadCAD.otf" Source="..\..\..\samples\fonts\MyriadCAD.otf" TrueType="yes" />
      </Component>
    </DirectoryRef>
  </Module>
</Wix>

我遵循here 描述的模型。在这种情况下,我收到此错误:

ts3d_fonts_merge.wxs(5,0):错误 CNDL0205:ID 为“FontsFolder”的目录不是有效的根目录。每个产品或模块可能只有一个根目录,其 Id 属性值必须为“TARGETDIR”,其 Name 属性值必须为“SourceDir”。 ts3d_fonts_merge.wxs(5,0): 错误 CNDL0025: Directory 元素需要 Name 属性,因为没有父 Directory 元素。

所以我的切入点问题是:如何让 Wix 识别合并模块中的 FontsFolder 预定义 ID?我使用的是 WixToolset v3.10。

这是我尝试过的其他几件事...

当我直接在主产品安装程序中使用它时,我必须使用 标签而不是 ,这很有效。但是当我在合并模块中使用它时,我收到以下错误消息:

ts3d_fonts_merge.wxs(5,0):错误 LGHT0094:未解决对“模块:TS3DFontsMerge”部分中符号“目录:FontsFolder”的引用。

如果我将 FontsFolder 包装在 TARGETDIR 标记中(正如第一个错误所暗示的那样?),我会收到警告说字体安装到了错误的位置。这是错误消息:

light.exe(0,0): 警告 LGHT1076: ICE07: 'ts3d.ttf.F6029400_FD05_4213_A0B2_1755387595BF' 是字体,必须安装到 FontsFolder。当前安装目录:'FontsFolder.F6029400_FD05_4213_A0B2_1755387595BF' light.exe(0,0): 警告 LGHT1076: ICE07: 'MyriadCAD.otf.F6029400_FD05_4213_A0B2_1755387595BF' 是字体,必须安装到 FontsFolder。当前安装目录:'FontsFolder.F6029400_FD05_4213_A0B2_1755387595BF'

有什么想法吗?

【问题讨论】:

【参考方案1】:

几个快速的建议:

FontsFolder 是一个将为您自动填充的属性,因此请确保使用 &lt;Directory&gt; 而不是 &lt;DirectoryRef&gt; - https://msdn.microsoft.com/en-us/library/aa368605(v=vs.85).aspx 正如您所了解的,任何模块都需要有一个整体目录 我认为您提供的链接有您正在寻找的答案,但不是已检查的那个...试试这个建议:https://***.com/a/33290209 为了避免您以后在文件管理方面遇到麻烦,您可能希望将每个文件都放在它自己的组件中。

所以最后,你应该接近:

?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Module Id="TS3DFontsMerge" Language="1033" Version="1.0.0.0">
    <Package Id="F6029400-FD05-4213-A0B2-1755387595BF" Manufacturer="Tech Soft 3D" InstallerVersion="200" />
    <Directory Id="TARGETDIR">
      <Directory Id="FontsFolder">
            <Component Id="TechSoft3DFonts" Guid="0B9C43FC-3835-42DE-80F6-1DB2A912BEE5">
                <File Id="ts3d.ttf" Source="..\..\..\samples\fonts\ts3d.ttf" TrueType="yes" />
                </Component>
                <Component Id="TechSoft3DFonts2" Guid="0B9C43FC-3735-42DE-80F6-1DB2A912BEE5">
                <File Id="MyriadCAD.otf" Source="..\..\..\samples\fonts\MyriadCAD.otf" TrueType="yes" />
        </Component>
      </Directory>
    </Directory>
  </Module>
</Wix>

【讨论】:

【参考方案2】:

我有同样的问题,但我没有从上一个答案中得到完整的解决方案。

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

  <Product (...)>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="FontsFolder" />
    </Directory>

    <DirectoryRef Id="FontsFolder">
      <Component Id="MyFont" Guid="0B9C43FC-3735-42DE-80F6-1DB2A912BEE5">
        <File Id="MyFont.otf" Source="Fonts\MyFont.otf" TrueType="yes" />
      </Component>
      <Component Id="MySecondFont" Guid="0B9C43FC-3835-42DE-80F6-1DB2A912BEE5">
          <File Id="MySecondFont.otf" Source="Fonts\MySecondFont.otf" TrueType="yes" />
        </Component>
    </DirectoryRef>

    <Feature Id="FontsInstallation" Title="Install and Register Company Fonts" Level="1">
      <ComponentRef Id="MyFont"/>
      <ComponentRef Id="MySecondFont"/>
    </Feature>
  </Product> 
</Wix>

字体在 Paint 或 Word 中不可见,但我可以使用 XAML/WPF 代码的原始名称引用它(因为它们将安装在 Windows 中):

<TextBlock FontFamily="My First Font" FontSize="30">Sample text</TextBlock>
<TextBlock FontFamily="My Second Font" FontSize="30">Sample text</TextBlock>

字体文件设置为 Build Action Content复制到输出目录 DoNotCopy

【讨论】:

上一个答案和问题是关于作为安装程序一部分的模块。使用模块允许任何人将相同的部件添加到不同的安装程序并获得相同的 GUID 和结果。您上面的代码确实可以将字体放入字体文件夹中,但它是一个创建单个安装程序的产品,无法与其他安装共享。尽管您的解决方案确实显示了如何为安装程序正确使用 DirectoryRef 并为单个安装正确解决问题。做得很好!

以上是关于如何在 Wix 合并模块中安装字体的主要内容,如果未能解决你的问题,请参考以下文章

如何在photoshop中安装新的字体

WiX:在 ProgramFilesFolder 中安装应用程序会引发 AccessDenied 异常。为啥?

如何在CentOS系统中安装字体

如何在 Rails 6 和 Webpacker(以及引导程序和 SASS/SCSS)中安装自定义字体

如何在 .xib 中安装 Ubuntu 字体,或者我们可以更改 Xcode 4.5.1 的系统默认字体(不是通过代码,应该通过 .xib)

(Un)在 WIX Burn 安装程序中安装 NSIS 包