Компилятор установки Inno "Не удается найти указанный путь" с длинными путями

Я использую скрипт .iss для создания exe- файла в Inno Setup Compiler. Мне нужно упаковать некоторые node_modules в это приложение, поэтому у меня есть строка в [Files] которая выглядит следующим образом:

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

Когда я компилирую, я получаю эту ошибку:

The system cannot find the path specified.

Вот вывод компилятора:

Compiler Output

Таким образом, он работает нормально, пока не прервался. Сначала я думал, что browser.js не существует, но после двойной проверки это не так. Кроме того, я использую подстановочный знак в исходном пути, чтобы компилятор знал, что файл существует, но, похоже, возникают проблемы при его сжатии.

Еще одна вещь, которая может быть причиной проблемы - это длина пути к файлу. Модули узлов обычно имеют смешную длину пути к файлу из-за вложенных зависимостей. В этом случае длина пути составляет 260. Предполагая, что это является причиной проблемы, есть ли способ обойти это?

Ответ 1

Это определенно из-за долгого пути. Обычно приложения Windows не могут обрабатывать пути длиннее MAX_PATH (260 символов).
См. Имена файлов, путей и пространств имен на MSDN.

Обычный обходной путь - префикс пути с \\?\ (Снова см. Статью MSDN выше). Префикс может использоваться только для абсолютных путей. Но компилятор Inno Setup подавляет это с помощью атрибута Source. Он ищет : и принимает только путь, который имеет букву диска только перед : или использует префиксы compiler: или userdocs:.

Вы можете взломать это, используя 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 для создания виртуального диска, или вы можете создать символическую ссылку/каталог.