Установщик Windows оценивает ROOTDRIVE на локальный диск с меньшим объемом свободной памяти => почему? - PullRequest
0 голосов
/ 28 сентября 2018

Многие страницы в Интернете и книги об установщике Windows ссылаются на следующую страницу Microsoft ROOTDRIVE для:

Если ROOTDRIVE не задан в командной строке или не создан вВ таблице свойств установщик устанавливает это свойство.Во время административной установки программа установки устанавливает ROOTDRIVE на первый подключенный сетевой диск, на который он может записать данные.Если это не административная установка или установщик не может найти сетевые диски, установщик устанавливает ROOTDRIVE на локальный диск, для которого можно записать максимально свободное пространство .

На компьютере моего клиента C: имеет больше свободного места, чем Y:, но приложение устанавливается в Y:\MyApp вместо C:\Program Files (x86)\MyApp.Конечно, структура WiX и Каталога выполнены в стандартном стиле:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLFOLDER" Name="$(var.CompanyName)">
      <Directory Id="MyAppFolder" Name="MyApp" />
    </Directory>
  </Directory>
</Directory>

Так что ничего особенного.На других машинах он устанавливается в папку Program Files, как и ожидалось.

Исходя из моего повседневного опыта, правило с «самым свободным пространством» не может быть верным, поскольку на многих машинах, с которыми я имею дело, имеется довольно маленький SSD, как C: локальный диск инамного, намного больший диск данных D: с терабайтами свободного места, чем C:.Если бы это правило подходило, то в настоящее время большинство компьютеров (все) имеют свои приложения, установленные в их корневой каталог Data Drive (например, D:\), а не в специально защищенных папках %ProgramFiles% / %ProgramFiles (x86)%.На всех моих машинах с конфигурацией небольшой SSD или жесткий диск с большими данными с большим пространством все эти материалы устанавливаются в мои ожидаемые папки Program Files в C:.Таким образом, правило "самого свободного места" определенно НЕ ИСТИНА !!!И MSI не особо определяют любое свойство TARGETDIR или ROOTDIR для C:\ в командной строке и таблицу MSI в любом случае!

Так что должно быть другое правило оценки.Который из них?Кто может объяснить странное поведение?

РЕДАКТИРОВАТЬ

Благодаря Стейну я внимательно посмотрел журналы и обнаружил, что ROOTDRIVE на самом деле указывает на большие локальные диски, ноиз-за более высокого приоритета Свойства системной папки она всегда устанавливается в нужное место на Системный диск .Файл журнала, который я также изучал, задавая вопрос, был файлом Dell Data Protection, который явно должен был установить ROOTDRIVE на C:\ или системный диск.Таким образом, правило ROOTDRIVE от MSDN кажется верным, но в большинстве случаев оно не оказывает никакого влияния.

Когда я сам посмотрел на проблемный компьютер, то увидел, что Y: был сетевой диск, затем я искал слово ADMIN et voilà: это была административная установка, хотя мой клиент сказал мне, что он просто дважды щелкнул MSIи Y: был местный двигатель => моя провокационная жалоба в этом году на фестиваль будет состоять в том, что никогда не следует верить тому, что говорит и клянется клиент; -)

1 Ответ

0 голосов
/ 28 сентября 2018

Свойства системной папки : я думаю, что ответ можно найти в этой статье Symantec .По существу: Свойства системной папки не зависят от свойства ROOTDRIVE .

Между прочим, мой диск D:\ имеет больше места, чем мой C:\ диск и ROOTDRIVE установлены в D:\ в файле журнала MSI.Установка не записывает файлы в D:\.Я думаю, это связано с тем, что C:\?


UPDATE : также проверьте документацию по TARGETDIR ,с акцентом на этом разделе:

" ... если свойство TARGETDIR определено, целевой каталог разрешается в значение свойства. Если свойство TARGETDIR не определено, свойство ROOTDRIVE имеет значениеиспользуется для определения пути."


Проблемный компьютер : приведенное выше не объясняет, что происходит на проблемном компьютере,Является ли?Вы когда-нибудь устанавливали вручную в это пользовательское место?Использовали ли вы шаблон «Помнить свойство» , чтобы сохранить папку установки?Должно быть, он читает этот старый путь?А может на диске очень мало места?Или вы устанавливаете, используя образ администратора? AdminProperties .Нет Установить свойство Custom действия там?Могут ли быть конструкции в GUI, которые могут повлиять на это?Я знаю, что свойство set используется в некоторых наборах графического интерфейса WiX по умолчанию.И вы можете сделать каталоги изменяемыми как «каталоги функций». Смотрите скриншот внизу страницы здесь .

Подробный журнал : я бы предложил вам создать файл журнала в системе, в которой происходит установкана дополнительный диск и проверьте, что записано в журнал в отношении ROOTDRIVE и разрешения каталогов в целом.В корпоративных средах, где целевые компьютеры единообразны, многие действительно имеют жесткий код от ROOTDRIVE до C:\ - не очень хорошо, но они делают.Они не будут этого делать, если не попытаются избежать какого-либо случайного побочного эффекта в соответствии с тем, что вы описываете.

Жалоба Festivus Мне всегда не нравился этот вопрос ROOTDRIVE, и я никогда полностью не понимал его, если честно.Я слышу тебя другими словами.На самом деле это одна из моих претензий к фестивалю против MSI.Я ответил?На самом деле, нет :-).У вас есть несколько указателей по крайней мере.Может быть, ребята WiX , Крис Пейнтер или PhilDW могут дать полный ответ.


Не используйте приведенную ниже конструкцию:

<!--ROOTDRIVE explicitly set to prevent it from defaulting to drive with most space-->
<Property Id="ROOTDRIVE" Value="$(env.SystemDrive)" />

<!-- NO SOLUTION -->

Выше будет разрешение времени компиляции, а не время выполнения папки.Другими словами, это вообще не решение .Для ROOTDRIVE будет задана буква системного диска компьютера сборки, а не компьютера, на который вы устанавливаете.

Construct вы можете попытаться установить ROOTDRIVE на системный диск:

<CustomAction Id='SetRootDrive' Property='ROOTDRIVE' Value='[%SystemDrive]\' />

<InstallUISequence>
  <Custom Action="SetRootDrive" Before="CostInitialize"></Custom>
</InstallUISequence>

Некоторые ссылки :

...