【问题标题】:WiX 3.11.1 -- error LGHT0103 : The system cannot find the fileWiX 3.11.1 -- 错误 LGHT0103:系统找不到文件
【发布时间】:2018-01-19 11:46:04
【问题描述】:

Windows 10 专业版 1703 64 位上的 WiX 3.11.1。不使用 Visual Studio。使用简单的文本文件如下。

这是我发现的情况的测试用例。

myapp.wxs 是这样的:

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

    <Product Id="*"
             Name="MyApp"
             Language="1033"
             Version="1.0.0.0"
             Manufacturer="Me"
             UpgradeCode="PUT-GUID-HERE">

        <Package InstallerVersion="301"
                 Compressed="yes"
                 InstallScope="perMachine"
                 Manufacturer="Me"
                 Description="My App"
                 Keywords=".NET,Installer,MSI" />

        <MediaTemplate EmbedCab="yes" />
        <UIRef Id="WixUI_Minimal" />
        <UIRef Id="WixUI_ErrorProgressText" />

        <!-- ****************************************** -->
        <WixVariable Id="WixUIDialogBmp"
                     Value="[CMP_Refresh_file]" />
        <!-- ****************************************** -->

        <Feature Id="MyFeature"
                 Title="MyApp Feature"
                 Description="Installs MyApp"
                 Level="1">
        </Feature>
    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="TestFolder" Name="TESTfolder" />
        </Directory>
        <Component Id="CMP_Refresh_file" Guid="*" Directory="TESTfolder">
            <File Id="FILE_RefreshPNG" Source= "Refresh.png" KeyPath="yes" />
        </Component>
    </Fragment>
</Wix>

myapp.bat 是:

"C:\Program Files (x86)\WiX Toolset v3.11\bin\candle.exe" myapp.wxs
"C:\Program Files (x86)\WiX Toolset v3.11\bin\light.exe"  myapp.wixobj -ext WixUIExtension -ext WixUtilExtension
@pause

当我运行 .bat 文件时,它找不到 CMP_Refresh_file(错误 LGHT0103:系统找不到文件)。文件夹 TESTfolder 是 .wxs 文件所在文件夹的直接子文件夹。

替换完整的文件路径可以解决问题。但这不是我想要的,因为我将拥有大量文件和文件夹。 (另外,如果我把文件和.wxs文件放在同一个文件夹里,它当然会找到它。)

我怀疑这纯粹是我的无知造成的句法问题。在任何情况下,我都没有高兴地为 WixUIDialogBmp 的 Value 尝试了无穷无尽的语法变化(全名除外)。

帮助解决非常非常感谢。谢谢!

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    查看您的 WiX 代码,我可以看到您对 MSI 目标和源文件夹路径感到困惑。 Directory 标签是在您运行 MSI 的机器上创建一个文件夹(您要在其中部署应用程序) - 它与您打包文件的源文件夹无关。

    将您的文件路径替换为:

    <File Id="FILE_RefreshPNG" Source= "\TESTfolder\Refresh.png" KeyPath="yes"/>
    

    如您所见,文件->源属性路径应该参考您的WXS文件路径编写。

    如果您打算在客户端计算机上的 testfolder 下部署 refresh.png,那么您必须在 &lt;File&gt; 标签之后关闭 &lt;/Directory&gt; 标签

    【讨论】:

    • 是的!你是对的,以赛亚书4110。这也是我想到的一种可能。谢谢你。事实上,我在 AppDataFolder 下有一个完全独立的源文件夹树结构。我想定义一个可以通过符号引用的目录结构,并错误地假设我创建的结构也会引用它。鉴于源结构和目标结构相同,我(错误地)假设可以使用相同的结构,并且上下文可以理解它是源结构还是目标结构。您能提供推荐的方法吗?
    • 创建包含所有文件的文件夹结构 - 然后使用 wix heat 收集它。 wixtoolset.org/documentation/manual/v3/overview/heat.html我通常使用一个名为 wixedit 的工具 - 并做同样的事情。它将为您生成 wix 脚本。然后你可以手动修改它以手动更改源路径。
    • 如果对您有帮助,请将其标记为答案。谢谢!
    • 再次非常感谢,Isaiah4110。我确实将答案标记为正确......但我的声誉等级很低,所以它没有增加。道歉。
    • 我现在还发现了另一个有趣的情况。我现在可以找到源文件(谢谢!)。但我现在收到以下类型的错误/警告:错误 LGHT0204:ICE38:组件 CMP_Textfile 安装到用户配置文件。它必须使用 HKCU 下的注册表项作为其 KeyPath,而不是文件。错误 LGHT0204:ICE64:目录 DIR_TextFolder 位于用户配置文件中,但未列在 RemoveFile 表中。警告 LGHT1076 : ICE91: 文件 'FILE_Textfile' 将安装到每个用户目录 'DIR_TextFolder' ...
    【解决方案2】:

    尝试引用安装路径的&lt;WixVariable Id="WixUIDialogBmp" Value="[#CMP_Refresh_file]" /&gt;。请参阅Formatted Strings 了解更多信息。

    【讨论】:

      【解决方案3】:

      在尝试找出源文件解析的不同问题时遇到了这个问题。 Isaiah4110's answer 具有误导性。 &lt;Directory&gt; 结构可以指定目标机器上的目的地只要目录结构相同即可找到源文件的位置。您只需将&lt;Component&gt; 元素嵌套在相应的目录元素中,并指定Name 属性而不是Source

      在这种情况下,以下应该起作用:

      <Directory Id="TARGETDIR" Name="SourceDir">
          <Directory Id="TestFolder" Name="TESTfolder">
              <Component Id="CMP_Refresh_file" Guid="*">
                  <File Id="FILE_RefreshPNG" Name="Refresh.png" KeyPath="yes" />
              </Component>
          </Directory>
      </Directory>
      

      这是因为&lt;File&gt;Source 默认为&lt;Component&gt; 的父&lt;Directory&gt; 元素(如果有)加上Name 的源路径。请参阅:File element referenceHow to specify source files。不幸的是,当问题中的示例将&lt;Component&gt; 置于&lt;Directory&gt; 结构之外时,此逻辑似乎不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 2014-06-15
        • 1970-01-01
        • 2017-12-07
        • 2016-09-19
        • 2012-03-02
        • 2011-09-17
        相关资源
        最近更新 更多