Выполните скрипт один раз перед установкой дерева каталогов

Я пытаюсь написать установщик Inno Setup для установки, а затем запустить другие установщики. Проблема у меня при попытке установить Cygwin. Я загрузил Cygwin и все необходимые мне пакеты, чтобы я мог выполнить локальную установку. Затем я хочу добавить дополнительные файлы и каталоги к установке Cygwin.

Моя первая попытка была такой:

[Files]
Source: "{#Cygwin}\Cygwin\*"; DestDir: {tmp}\cygwin; Flags: recursesubdirs;
Source: "{#Cygwin}\additional\*"; DestDir: {tmp}\cygwin\additional; Flags: recursesubdirs

[Run]
Filename: "{tmp}\cygwin\setup-x86_64.exe"; Parameters: "-q -L"; WorkingDir: "{tmp}";

Но это означает, что у меня должен быть скрипт для добавления дополнительных файлов, потому что их некуда поместить, пока Cygwin не будет установлен командой [Run] раздел.

Я пытался с помощью BeforeInstall сценарий в [Files] раздел для запуска установщика Cygwin перед добавлением дополнительных файлов, но потому что я должен использовать подстановочный знак с Source: "{#Cygwin}\additional\*"; скрипт вызывается один раз для каждого файла в дереве каталогов.

[Files] раздел Inno Setup, кажется, принимает только исходные файлы, а не исходный каталог, если в каталоге нет подстановочного знака.

Есть ли способ, которым я могу заставить его установить все из дерева каталогов без использования подстановочного знака, или есть ли способ, которым я могу сделать BeforeInstall Скрипт запускается только один раз, независимо от того, сколько файлов скопировано?

1 ответ

Решение

Установите Cygwin при первом вызове BeforeInstall только функция

var
  CygwinInstalled: Boolean;

procedure MyBeforeInstall;
begin
  if CygwinInstalled then
  begin
    Log('Cygwin installed already');
  end
    else
  begin
    Log('Installing Cygwin');

    { install Cygwin here }

    CygwinInstalled := true;
  end;
end;
Другие вопросы по тегам