我正在尝试使用 Packer (v.0.8.6) 自动创建 Windows 7 开发环境, Vagrant (v.1.8.1) , VirtualBox (v.5.0.10) , 和 Chocolatey (v.0.9.9.11)在 Windows 8.1 主机上。
我已经成功地使用 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?我想使用 chocolately 来升级 PowerShell,因为以自动化方式执行此操作会容易得多。
如何在不先将 PowerShell 升级到更新版本的情况下指示 Vagrant 在我的虚拟机上安装 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 provisioner 或 cmd 行或 PowerShell 窗口发出 choco 语句。然而,一旦重新启动,这些就可用了,这会导致配置失败。据我了解,我不需要重新启动机器即可使用 Chocolatey。我应该只需要重新启动外壳。检查 PATH 变量,我发现 Chocolatey 尚未添加到 PATH 中,这可以解释问题。
最佳答案
因此,当一个流(如 stdout)的日志后跟另一个流(如 stderr)的日志时,你会看到 PowerShell 错误消息,通常涉及将输出写入文件路径。
发生错误,但不幸的是 PowerShell 正在吞下它并重现其他问题 - 您可以在调用安装 Chocolatey 之前添加 $env:ChocolateyDebug 并查看它是否有助于指出错误位置正在发生。
如果我不得不猜测这可能与 Chocolatey 尝试安装 .NET Framework 4.0 并遇到错误有关。在我的 vagrant repo 中,我倾向于将 .Net 4 安装的步骤与 Chocolatey 分开。该 repo 协议(protocol)位于 vagrant-windows-puppet .
关于windows - 为什么在使用 Vagrant 配置 Windows 7 VM 时 Chocolatey 无法安装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34666677/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?