我正在使用.iss
脚本在Inno Setup Compiler内构建 exe 文件。我需要将一些 node_modules 打包到此应用程序中,因此我在[Files]
下面有一行,如下所示:
Source: "{#SourcePath}Encore.Warehouse.UI\bin\Warehouse_Release\warehouse\*"; \
DestDir: "{app}\warehouse"; Flags: ignoreversion recursesubdirs createallsubdirs
编译时,我收到此错误:
这是编译器输出:
因此,它出现运行正常,直到它中止。我最初的想法是browser.js
不存在,但经过双重检查后,情况并非如此。此外,我在源路径中使用通配符,因此编译器知道文件存在,但似乎无法压缩它。
可能导致问题的另一件事是文件路径长度。由于嵌套依赖性,节点模块通常最终具有荒谬的文件路径长度。在这种情况下,路径长度 260 。假设这是造成问题的原因,有什么方法可以绕过它吗?
答案 0 :(得分:7)
这绝对是由于漫长的道路。通常,Windows应用程序无法处理长度超过MAX_PATH
(260个字符)的路径
请参阅MSDN上的Naming Files, Paths, and Namespaces。
常见的解决方法是在路径前添加\\?\
(再次参见上面的MSDN文章)。前缀只能用于绝对路径。但Inno Setup编译器使用Source
属性对其进行了扼流。它会查找:
,并且只接受仅在:
之前或使用compiler:
或userdocs:
前缀的驱动器号的路径。
您可以通过使用具有卷ID的UNC路径(因此没有冒号)来破解它。
使用mountvol
命令查找源驱动器的UNC路径。
然后,在安装时(不是在编译时),使用DestDir
属性的长路径会遇到同样的问题。在那里,冒号没有问题,所以你可以简单地使用\\?\
前缀。
Source: "\\?\Volume{bb919c3e-bdb1-42b8-9601-6715becd8683}\{#SourcePath}Encore.Warehouse.UI\bin\Warehouse_Release\warehouse\*"; \
DestDir: "\\?\{app}\warehouse"; Flags: ignoreversion recursesubdirs createallsubdirs
当然,如果问题是由根路径已经太长引起的,您只需将源文件移动到路径较短的文件夹即可解决问题。或者您可以使用subst
创建虚拟驱动器,也可以创建符号链接/目录连接。
答案 1 :(得分:1)
遇到同样的问题,下面是有关 subst 解决方法的更多详细信息,如评论和已接受的答案中所述。
下面是一些 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
。