我尝试使用Packer(v.0.8.6) , Vagrant(v.1.8.1) , VirtualBox(v.5.0.10)和Chocolatey(v.0.9.9.11)自动创buildWindows 7开发环境。在Windows 8.1主机上。
我已经设法使用Packer创build基本的Windows 7 SP1盒子,并且我试图用vagrant up
来创build带有Vagrant的虚拟机。 我想要做的第一件事就是安装Chocolatey,以便我可以轻松configuration其他软件。
然而。 我这样做没有成功。 我在我的stream浪文件中尝试了各种咒语。 这里是内容。
# -*- 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,巧克力安装正常。
我在网上search这个错误,它似乎是一个PowerShell 2和3的错误 。 事实上,如果我在虚拟机上手动安装PowerShell 4,并运行vagrant provision
重新configuration它,这些选项的工作。
但是,如果是这样的话,为什么我可以手动安装巧克力而不是通过stream浪汉? 我想用巧克力来升级PowerShell,因为以自动的方式这样做会容易得多。
我如何指示Vagrant在我的虚拟机上安装Chocolatey,而无需先将PowerShell升级到新版本?
解决方法尝试1:
我试图从5.0.10降级VirtualBox到4.3.28,看是否有问题(根据build议)。 但是,我无法在主机上运行4.3.28,因为在尝试创build新的虚拟机时,即使是开箱即用,无包装者或stream浪者,我也收到错误信息。 重新安装5.0.10解决了这个问题。
解决方法尝试2:
我将这里定义的Powershell 2解决方法脚本应用于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'))
这允许巧克力安装。 但是,我无法发布从Vagrant提供者或cmd行或PowerShell窗口choco
语句,直到我重新启动机器。 一旦重新启动,这些变得可用,但是,这导致供应失败。 这是我的理解,我不应该需要重新启动机器使用巧克力。 我应该只需要重新启动shell。 检查PATHvariables,我看到巧克力没有被添加到PATH,这将解释这个问题。
所以,当有一个日志记录到一个流(如stdout)后面跟着一个日志到另一个流(如stderr)时(通常涉及将输出写入文件路径),您会看到PowerShell错误消息。
发生了一个错误,但不幸的是PowerShell正在吞咽它并重现其他问题 – 您可以在调用之前添加$env:ChocolateyDebug
来安装Chocolatey,并查看它是否有助于指向发生错误的位置。
如果我不得不猜测它可能与巧克力尝试安装.NET Framework 4.0并出现错误相关。 在我的流浪回购中,我倾向于将.Net 4的安装步骤与Chocolatey分开。 这个回购是在流浪的窗户傀儡 。