Я пытаюсь автоматизировать создание среды разработки Windows 7 с использованием Packer (v.0.8.6), Vagrant (v.1.8.1), VirtualBox (v.5.0.10) и Chocolatey (v.0.9.9.11) на хосте Windows 8.1.Почему Chocolatey не удается установить при настройке виртуальной машины Windows 7 с использованием Vagrant?
Мне удалось создать базовую коробку Windows 7 SP1 с использованием Packer, и я пытаюсь создать виртуальную машину с помощью Vagrant, используя vagrant up
. Первое, что я хочу сделать, это установить Chocolatey, чтобы я мог легко предоставить другое программное обеспечение.
Однако. Я был безуспешным в этом. Я пробовал различные заклинания в моем Vagrantfile. Вот содержание.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "windows_7"
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
vb.gui = true
end
# option 1
# config.vm.provision "shell", "inline": "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))"
# option 2
# config.vm.provision "shell", "path": "./scripts/install-chocolatey.cmd"
# option 3
# config.vm.provision "shell", path: "./scripts/install-chocolatey.ps1"
end
# ./scripts/install-chocolatey.cmd
@powershell -NoProfile -ExecutionPolicy Bypass -File "%systemdrive%\vagrant\scripts\install-chocolatey.ps1"
# ./scripts/install-chocolatey.ps1
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
Ошибка, которую я получил для любого из этих вариантов:
==> default: Everything is Ok
==> default:
==> default: Files: 76
==> default: Size: 4893948
==> default: Compressed: 1806765
==> default: out-lineoutput : The OS handle's position is not what FileStream expected. Do n
==> default: ot use a handle simultaneously in one FileStream and in Win32 code or another F
==> default: ileStream. This may cause data loss.
==> default: + CategoryInfo : NotSpecified: (:) [out-lineoutput], IOException
==> default: + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Comma
==> default: nds.OutLineOutputCommand
==> default:
Однако, если я вручную запускаю либо вариант 1, 2, либо 3 из окна Cmd или PowerShell на виртуальной машине, то шоколадно устанавливается нормально.
Я искал эту ошибку онлайн и, похоже, PowerShell 2 and 3 bug. Действительно, если я вручную установлю PowerShell 4 на виртуальной машине и запустил vagrant provision
, чтобы повторно установить его, эти параметры работают.
Но если это так, то почему я могу установить шоколад вручную, но не через Vagrant? Я хотел бы использовать chocolately для обновления PowerShell, так как было бы намного проще сделать это автоматическим способом.
Как я могу обучить Vagrant установке Chocolatey на моей виртуальной машине без предварительной модернизации PowerShell до более новой версии?
Обход Попытка 1:
Я попытался понижая VirtualBox от 5.0.10 до 4.3.28, чтобы узнать, есть ли проблема (по рекомендации). Однако мне не удалось запустить 4.3.28 на моем хост-компьютере, так как я получил ошибку при попытке создать новую виртуальную машину, даже из коробки, без упаковщика или бродяг. Переустановка 5.0.10 решила эту проблему.
Обход Покушение 2:
Я применил Powershell 2 обходной скрипт defined here моей установки-chocolatey.ps1 сценария. Полное содержание затем стали:
$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetField"
$objectRef = $host.GetType().GetField("externalHostRef", $bindingFlags).GetValue($host)
$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetProperty"
$consoleHost = $objectRef.GetType().GetProperty("Value", $bindingFlags).GetValue($objectRef, @())
[void] $consoleHost.GetType().GetProperty("IsStandardOutputRedirected", $bindingFlags).GetValue($consoleHost, @())
$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetField"
$field = $consoleHost.GetType().GetField("standardOutputWriter", $bindingFlags)
$field.SetValue($consoleHost, [Console]::Out)
$field2 = $consoleHost.GetType().GetField("standardErrorWriter", $bindingFlags)
$field2.SetValue($consoleHost, [Console]::Out)
iex -Debug ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
Это позволило шоколадным установить. Тем не менее, я не могу выдать choco
заявления от поставщиков Vagrant или из строки cmd или окна PowerShell, пока я не перезагружу компьютер. Однако после перезагрузки они становятся доступными, однако это приводит к сбою инициализации.Я понимаю, что мне не нужно перезагружать машину, чтобы использовать Chocolatey. Мне нужно только перезагрузить оболочку. Проверяя переменную PATH, я вижу, что Chocolatey не добавлен в PATH, что объясняет проблему.
Возможно, что обходное решение Ли Холмса должно быть продвинуто в резервное хранилище запасных частей. Я могу установить Chocolatey прямо с гостевой консоли PowerShell, без проблем. –