我试图在Windows 8.1主机上使用Packer (v.0.8.6),Vagrant (v.1.8.1),VirtualBox (v.5.0.10)和Chocolatey (v.0.9.9.11)自动创建Windows 7开发环境。
我已经成功使用Packer创建了基本的Windows 7 SP1框,并且尝试使用vagrant up
使用Vagrant创建虚拟机。我要做的第一件事是安装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:
但是,如果我从虚拟机上的Cmd或PowerShell窗口手动运行选项1、2或3,则Chocolatey安装会很好。
我在网上搜索了此错误,它似乎是PowerShell 2 and 3 bug。的确,如果我在虚拟机上手动安装PowerShell 4并运行
vagrant provision
重新配置,则这些选项将起作用。但是,如果是这种情况,为什么我可以手动安装Chocolatey而不通过Vagrant安装?我想用巧克力的方式来升级PowerShell,因为这样可以更轻松地实现自动化。
我如何指示Vagrant在不先将PowerShell升级到较新版本的情况下在我的虚拟机上安装Chocolatey?
解决方法尝试1:
我尝试将VirtualBox从5.0.10降级到4.3.28,以查看是否存在问题(根据建议)。但是,我无法在主机上运行4.3.28,因为尝试创建新的虚拟机时收到错误,即使是开箱即用,也没有打包程序或 Vagrant 。重新安装5.0.10解决了该特定问题。
解决方法尝试2:
我将Powershell 2解决方法脚本defined here应用于了install-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'))
这允许Chocolatey安装。但是,在重新启动计算机之前,我无法从Vagrant供应商,cmd行或PowerShell窗口发出
choco
语句。重新启动后,这些将变为可用,但是,这会导致预配失败。据我了解,我不需要重新启动计算机即可使用Chocolatey。我只需要重新启动 shell 程序即可。检查PATH变量,我发现Chocolatey尚未添加到PATH中,这可以解释该问题。 最佳答案
因此,当有一个日志记录到一个流(例如stdout),然后是一个日志记录到另一个流(例如stderr)时,您会看到PowerShell错误消息,通常涉及将输出写入文件路径。
发生了错误,但是不幸的是,PowerShell吞下了它并重现了其他问题-您可以在调用安装Chocolatey之前添加$env:ChocolateyDebug
,看看它是否有助于指出发生错误的位置。
如果我不得不猜测,这可能与Chocolatey尝试安装.NET Framework 4.0并遇到错误有关。在我无所事事的仓库中,我倾向于将.Net 4的安装步骤与Chocolatey分开。该仓库位于vagrant-windows-puppet。
关于windows - 为什么使用Vagrant设置Windows 7 VM时Chocolatey无法安装?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34666677/