MSI APIs 不支持长文件名 - 如何缩短文件名?

MSI APIs does not support long filenames - How to shorten the file name?

我正在使用 Wix 生成 MSI

Wix 正在根据项目引用动态生成 ComponentsGenerated.wxs 文件。

项目中的一个DLL名字最长如下

  <Component Id="D5CF013A7A8C3FB9D1BD48B1996555DA" 
             Guid="{CBDB1BC0-F4EE-4824-B937-D9F66278F89A}">
     <File Id="8EDDC3C71F9C124B466555A59378747" 
            KeyPath="yes" Source="$(var.BasePath)\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.dll" />
   </Component>

此处:var.BasePath = "C:\Work\Projects\WixProjects\InstallerProjects\Client"

因此,我在尝试构建 Wix 项目时收到 找不到文件的错误

我已经把我的项目移到C盘了。 现在:var.BasePath = "C:\Client\"

错误已解决。但问题是,修复它的更好方法是什么?我不想将项目移动到 C 盘。我相信一定有办法缩短 wix 中的文件长度。如果可以,我该怎么做?

NTFS Policy: This I have never tried, but in recent versions of Windows 10 (Version 1607 and up apparently - run "winver.exe") there is a new NT / group policy that you can try. The policy is: Enable NTFS long paths.

Local Drives: Enable the policy (procedure below) and perhaps do a reboot. Then remember to use local NTFS drives - preferring the system drive I'd say. Let us know the results? (just a quick comment?).

仅构建时鉴于您需要这些路径来编译和构建而不是安装,这可能有用吗? 不过你需要小心,否则你的包可能包含太长的路径以安装下游(可能无法编译,我不确定)。您需要非常好的 QA - 显然。老实说,我会回到 Windows 7 - 真正测试一下。

描述: "启用 NTFS 长路径将允许显示 win32 应用程序和 Windows 存储应用程序访问超出每个节点正常 260 个字符限制的路径。"

启动条件:防止在不受支持的系统(无论出于何种原因)上安装的通用机制是 MSI's launch conditions concept

策略:gpedit.msc:设置组策略(NB! Only PRO version of Windows I think!):

  1. Windows键并点击R ,键入 gpedit.msc 并按 Enter.
  2. 转到:Local Computer Policy => Computer Configuration => Administrative Templates => System => Filesystem.
  3. 双击Enable NTFS long paths选项。启用它。

Disclaimer! Side effects unknown.


简化标记:还有一件事。在主观意见中,我发现 WiX 标记在很多方面都略微 over-complicated。 WiX 的作者通过允许 auto-generation 的“样板属性”(如果这是一个术语)将工具包带向了一个有趣的方向。请参阅此答案以获取更多信息:Syntax for guids in WIX?

这里是 simplified WiX markup 的示例:

<!-- Sample guid below, do not copy paste -->
<Component Id="File.dll" Guid="{12345678-1234-1234-1234-123456789ABC}">
  <File Id="File.dll" Name="File.dll" KeyPath="yes" Source="..\File.dll" />
</Component>

对比

<Component>
  <File Source="..\File.dll" />
</Component>

链接: