12

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

Source: "{#SourcePath}Encore.Warehouse.UI\bin\Warehouse_Release\warehouse\*"; \
    DestDir: "{app}\warehouse"; Flags: ignoreversion recursesubdirs createallsubdirs

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

该系统找不到指定的路径。

这是编译器输出:

编译器输出

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

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

4

2 回答 2

10

这绝对是因为路途遥远。通常 Windows 应用程序不能处理长度超过MAX_PATH(260 个字符)的路径。
请参阅Microsoft 文档中的命名文件、路径和命名空间。

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

您可以通过使用带有卷 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创建虚拟驱动器,也可以创建符号链接/目录连接。

于 2016-08-05T13:30:08.840 回答
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]and[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直接调用。

于 2021-04-09T08:44:28.113 回答