Путь установки по умолчанию к ProgramFilesFolder без указания ProgramFilesFolder в wxs - PullRequest
0 голосов
/ 30 января 2020

В настоящее время у меня есть устаревший проект Visual Studio Install Projects, который создает MSI. При этом я могу указать "TARGETDIR =" somepath "" в командной строке и установить его в "somepath". Теперь в WIX, если я не указываю ProgramFilesFolder в моих wxs, «TARGETDIR» все еще работает, однако в моем пользовательском интерфейсе установщика путь по умолчанию - «C: \ Manufacturer \ Product», тогда как я все еще хочу, чтобы он по умолчанию был ProgramFilesFolder. Наличие поддержки «TARGETDIR» необходимо также для поддержки обновления до устаревшего MSI из самого приложения.

Я нашел несколько способов изменить каталог по умолчанию для пользовательского интерфейса на ProgramFilesFolder, однако TARGETDIR не меняется на этот каталог (или каталог, указанный пользователем), поэтому он все равно устанавливается в C: \ Manufacturer \ Product.

У кого-нибудь есть какие-нибудь идеи здесь? Я предполагаю, что какое-то специальное действие сделает это, но я чувствую, что попробовал большинство предложений, таких как:

  • { ссылка }, но это переопределит любой выбранный каталог в или в командной строке
  • Я также попытался создать свойство WiX "TARGETDIR", чтобы отобразить его в командной строке, но, поскольку это уже внутренний файл, это не имело значения.
  • Как установить значение по умолчанию для пути установки WiX Msi в пользовательском интерфейсе для Program Files? как уже упоминалось, это помешало бы мне использовать "TARGETDIR" в командной строке
  • https://wixtoolset.org//documentation/manual/v3/wixui/dialog_reference/wixui_advanced.html, а затем с помощью настраиваемого действия установить «TARGETDIR» в «APPLICATIONFOLDER». При этом я могу установить местоположение по умолчанию в ProgramFilesFolder, но тогда я не нашел способа установить «TARGETDIR» в нужное время, чтобы использовать значение командной строки или выбранное пользователем. Мне почти нужен способ сделать «если« APPLICATIONFOLDER »не является значением по умолчанию; использовать его значение ИЛИ, если« TARGETDIR »не является значением по умолчанию; использовать его значение ИЛИ использовать значение по умолчанию». Кажется, что это также не позволяет расширять переменные, поэтому я не могу использовать «[ProgramFilesFolder]», я должен явно выписать «C: \ Program Files ...», что не идеально.
<Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLDIR" Name="blah">

Как уже упоминалось, я должен иметь возможность использовать "TARGETDIR", а не "INSTALLDIR" (хотя это работает).

Если у меня действительно есть для использования "INSTALLDIR" затем я могу заставить его работать, но это усложняет поддержку устаревших MSI и WiX из-за характера их использования.

Edit

Решение: <Custom Action="SetINSTALLDIR" Before="AppSearch">Not Installed</Custom> в InstallExecuteSequence и InstallUISequence.

Это указывает на: <CustomAction Id="SetINSTALLDIR" BinaryKey="CustomActionsBinary" DllEntry="SetInstallDir" />

SetInstallDir:

[CustomAction]
public static ActionResult SetInstallDir(Session session)
{
    TraceLogger.yRTraceInfo(nameof(SetInstallDir));
    string installDir = session["APPLICATIONFOLDER"];
    string targetDir = string.Empty;

    try
    {
        targetDir = session["TARGETDIR"];
    }
    catch (Exception e)
    {
        Console.log(e.Message);
    }

    if (string.IsNullOrEmpty(installDir) && !string.IsNullOrEmpty(targetDir))
    {
        session["APPLICATIONFOLDER"] = targetDir;
        console.log($"Setting APPLICATIONFOLDER to {targetDir}");
    }
    return ActionResult.Success;
}    

1 Ответ

1 голос
/ 31 января 2020

Полагаю, у вас может быть настраиваемое действие SetProperty для присвоения INSTALLDIR значения, если оно пустое, а TARGETDIR имеет значение и Not Installed. Запланируйте это на ранних этапах как в пользовательском интерфейсе установки, так и в последовательности установки выполнения перед AppSearch.

FYI в WiX INSTALLLOCATION используется чаще. INSTALLDIR - это скорее вещь InstallShield, а TARGETDIR - вещь Visual Studio.

<SetProperty Id="INSTALLDIR" Value="[TARGETDIR]" Before="AppSearch">Not INSTALLDIR and TARGETDIRDIR and Not Installed</SetProperty> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...