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制作安装软件包