各版本 homestead 踩坑记录,顺带表达一下对天朝局域网的痛心疾首
文章创建于: 2017-05-21,最后修改于:2018-09-19

php
2

homestead 是我目前用过的最舒适的PHP开发环境,但因为一些众所周知的原因,每次重新安装或者更新换代的时候总会出现一些这样那样的问题。在此记录一下每次更新时踩过的坑并顺手造福一下大众。

安装步骤


  • 安装 vagrant
  • 安装 virtual box
  • 下载 homestead 源码

以上步骤都完成后,随意找一个目录执行

vagrant box add laravel/homestead

如果你对自己的网速很有自信,那么你可以选择等待它下载完成,但是在我大天朝这几乎是不存在的。于是只能选择其他的办法,在选择好对应的 provider(parallels、virtualbox、vmware_desktop) 之后,会输出 box 的最终下载路径如下(图是盗的,意思一下)

image
然后就可以 ctrl + c 停止下载,把上图中的 box 路径复制出来用其他多线程下载工具下载,比如迅雷什么的,下载完成后你将得到一个 .box 后缀的文件。

然后就可以使用 vagrant 以本地的方式加载box,但是会有一个问题,vagrant 加载本地的 box 是没有版本信息的。你如果这个时候执行 vagrant box list 会得到这样的信息

laravel/homestead (virtualbox, 0)

这个时候当我们 vagrant up 启动虚拟环境的时候就会每次都检查最新版本然后更新。

解决这个问题有两种方式,源自 stackoverflow

  1. 直接在 Homestead.yaml 文件中配置一行 version: 0, 或在 homestead 源码文件夹中找到 scripts/homestead.rb 文件,将 config.vm.box_version 这项配置改成 0

  2. 在 box 文件的根目录创建一个 metadata.json 文件,内容如下:

     {
         "name": "laravel/homestead",
         "versions": 
         [
             {
                 "version": "2.1.0",
                 "providers": [
                     {
                     "name": "virtualbox",
                     "url": "virtualbox.box"
                     }
                 ]
             }
         ]
     }
    

    version 里填写你的 box 的实际版本,url 填写你的 box 文件的相对路径,然后执行

    vagrant box add metadata.json

    这样就能保证box的版本信息正确。

踩坑记录


标题为 homestead 源码版本

v4.0.5

  • vagrant: v1.9.3
  • virtual box:v5.1.0
  • homestead box: v2.1.0
  • homestead source code: v4.0.5

The requested address is not valid in its context. - connect(2) for “0.0.0.0” port 8000 (Errno::EADDRNOTAVAIL)

完整报错信息:

E:/software/vagrant/embedded/gems/gems/vagrant-1.9.3/lib/vagrant/util/is_port_op
en.rb:21:in `initialize': The requested address is not valid in its context. - c
onnect(2) for "0.0.0.0" port 8000 (Errno::EADDRNOTAVAIL)

解决方案来自 stackoverflow

将 homestead 源码下 scripts/homestead.rb 文件中关于 port forwarding 的配置增加一个 host_ip 如下:

 # Use Default Port Forwarding Unless Overridden
unless settings.has_key?("default_ports") && settings["default_ports"] == false
default_ports.each do |guest, host|
unless settings["ports"].any? { |mapping| mapping["guest"] == guest }
config.vm.network "forwarded_port", guest: guest, host: host, host_ip: "127.0.0.1", auto_correct: true
end
end
end

# Add Custom Ports From Configuration
if settings.has_key?("ports")
settings["ports"].each do |port|
config.vm.network "forwarded_port", guest: port["guest"], host: port["host"], protocol: port["protocol"], host_ip: "127.0.0.1", auto_correct: true
end
end

启动虚拟环境时 composer 报错,[Composer\Downloader\TransportException]

具体报错信息:

==> homestead-7:   The "https://getcomposer.org/download/1.4.2/composer.phar" fi
le could not be downloaded: SSL: Connection reset by peer
==> homestead-7: failed to open stream: HTTP request failed!

如果你看到了这个报错那么恭喜你,天朝局域网又一次阻碍了人类的进步,解决方式有很多,翻墙或者将 homestead.rb 文件中关于 composer 更新的代码删掉或注释就可以,就是下面这段中的 sudo /usr/local/bin/composer self-update 这一句,当然后面的最好留着,不保证删掉之后会不会之后出现什么未知错误。

# Update Composer On Every Provision
config.vm.provision "shell" do |s|
s.name = "Update Composer"
s.inline = "sudo /usr/local/bin/composer self-update && sudo chown -R vagrant:vagrant /home/vagrant/.composer/"
s.privileged = false
end
-->