Inno Setup Compiler“找不到指定的路径”错误,路径长

Posted

技术标签:

【中文标题】Inno Setup Compiler“找不到指定的路径”错误,路径长【英文标题】:Inno Setup Compiler "Cannot find the path specified" error with long paths 【发布时间】:2016-12-11 21:24:09 【问题描述】:

我正在使用.iss 脚​​本在Inno Setup Compiler 中构建一个exe 文件。我需要将一些 node_modules 打包到这个应用程序中,所以我在 [Files] 下有一行如下所示:

Source: "#SourcePathEncore.Warehouse.UI\bin\Warehouse_Release\warehouse\*"; \
    DestDir: "app\warehouse"; Flags: ignoreversion recursesubdirs createallsubdirs

当我编译时,我收到这个错误:

这是编译器的输出:

所以,它似乎运行良好,直到它中止。我最初的想法是 browser.js 不存在,但经过仔细检查,情况并非如此。另外,我在源路径中使用了通配符,因此编译器知道文件存在,但压缩它似乎有问题。

可能导致问题的另一件事是文件路径长度。由于嵌套的依赖关系,节点模块通常最终具有可笑的文件路径长度。在这种情况下,路径长度为 260。假设这是导致问题的原因,有没有办法解决它?

【问题讨论】:

subst (ss64.com/nt/subst.html)(“替换驱动器号本地路径。”)当工作文件夹的路径足够长且与源路径融为一体时有效。 【参考方案1】:

这绝对是因为路途遥远。通常,Windows 应用程序无法处理超过 MAX_PATH(260 个字符)的路径。 请参阅 MSDN 上的 Naming Files, Paths, and Namespaces。

一种常见的解决方法是在路径前加上 \\?\ 前缀(再次参见上面的 MSDN 文章)。前缀只能用于绝对路径。但是 Inno Setup 编译器使用 Source 属性对此感到窒息。它会查找:,并且只接受在: 之前只有驱动器号或使用compiler:userdocs: 前缀的路径。

您可以通过使用带有卷 ID(因此没有冒号)的 UNC 路径来破解它。

使用 mountvol 命令查找源驱动器的 UNC 路径。

然后在安装时(而不是在编译时),DestDir 属性的长路径也会遇到同样的问题。在那里,冒号没有问题,因此您可以简单地使用\\?\ 前缀。

Source: "\\?\Volumebb919c3e-bdb1-42b8-9601-6715becd8683\#SourcePathEncore.Warehouse.UI\bin\Warehouse_Release\warehouse\*"; \
    DestDir: "\\?\app\warehouse"; Flags: ignoreversion recursesubdirs createallsubdirs

当然,如果问题是由根路径太长引起的,您只需将源文件移动到路径较短的文件夹即可解决问题。或者您可以使用subst 创建虚拟驱动器,也可以创建符号链接/目录连接。

【讨论】:

【参考方案2】:

遇到同样的问题,下面是有关subst 解决方法的更多详细信息,如 cmets 和接受的答案中所述。

下面是一些precompile.bat 文件的内容,用于将一些本地路径与A: 驱动器号相关联

@echo off
REM NB: Removing any previous association to be sure new one will work
subst A: /D 1> NUL 2>&1
subst A: "%~dp0.."

还有一些postcompile.bat的内容最后去掉关联

@echo off
subst A: /D 1> NUL 2>&1

NB1:小心,一旦关联,很难直接在 .iss 脚​​本中导航上面的路径,因为 A:\.. 仍然是 A:\(我陷入了这个问题,所以值得知道)。然后应直接在precompile.bat 中与所有必需文件的最顶层文件夹建立关联。

NB2:我不知道是否可行提醒之前的任何关联并最终恢复它

这些步骤可以添加到.iss 脚本中,如下所示:

[PreCompile]
Name: "precompile.bat"; Flags: cmdprompt redirectoutput

[PostCompile]
Name: "postcompile.bat"; Flags: cmdprompt redirectoutput

最后请注意,[PreCompile][PostCompile] 部分将仅从 IDE 执行。它们不会从命令行执行(至少在 inno 5.5.9 中),我也属于这种情况......所以从命令行完整编译应该如下所示:

call "precompile.bat"
call "%ProgramFiles(x86)%\Inno Setup 5\ISCC.exe" "myscript.iss"
call "postcompile.bat"

注意:我认为调用 Compil32.exe /cc "myscript.iss"(IDE 编译器)而不是 ISCC.exe(命令行编译器)应该运行 [PreCompile][PostCompile] 部分,但在我的情况下,我必须将额外的 /D 选项传递给编译器因此无法直接调用Compil32.exe

【讨论】:

请注意,[PreCompile]/[PostCompile] 是一些 Inno Setup 扩展的功能。它不适用于 Inno Setup 本身(无论是 GUI 还是命令行)。

以上是关于Inno Setup Compiler“找不到指定的路径”错误,路径长的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Inno Setup Compiler制作安装软件包

Inno Setup Compiler打包需要管理员权限的程序

如何使用Inno Setup Compiler制作安装软件包

如何使用Inno Setup Compiler制作安装软件包

请问在Inno Setup打包中ActiveLanguage()函数怎么使用?

请各位高手帮忙,怎么修改Inno Setup 打包程序安装时的背景外观???