如何在 Windows10 系统下愉快的安装 Homestead

仅以此文祭奠我两天之内踩下的 N 个坑

前言

众所周知,Laravel 对开发环境十分苛刻(难伺候),这是高效率开发所需要付出的代价。为了使线上的生产环境和线下的开发环境达到统一,同时也让不同开发者在不同的平台上能在同一环境下开发,Laravel 官方推出了 Homestead 来解决这个问题。然而,身处大陆,我们是很难像歪果仁一样体验 Homestead 带来的快感,更多的是遭受安装时带来的痛苦与折磨。在写这篇文章的前两天里,我踩过了无数个坑,把各大虚拟桌面平台都试了个遍,最终才摸清了这一摊儿浑水。

安装之前

Homestead 说白了就是一个封装好了的 Vagrant Box。那么,Vagrant 是啥?Laravel 文档是这么解释的:

Vagrant 提供了一种简单、优雅的方式来管理和配置虚拟主机。

是的,Vagrant 就是一个虚拟机管理工具。注意,它仅仅是管理而已,并不能够独立的创建虚拟机。因此,它还需要与虚拟机软件配套使用。在这里,我们用 Oracle VirtualBox

你可能会问了,为什么不用 Win10 自带的 Hyper-v ?Homestead 不是也支持吗?

是的,Homestead 是支持 Hyper-v。但 Hyper-v 在我的电脑上有一个非常糟糕的表现:

端口无法正常的映射到虚拟机上,即我不能使用 127.0.0.1 这个地址与虚拟机进行通信。一旦我要连接虚拟机上的数据库,我必须要找到虚拟机的内网IP(172开头),才能连接上。然而,每重建一次 Box 这个 IP 就会刷新一次,我实在是没有耐心总去找它的 IP,所以当我发现了这个情况并且找不到解决办法后,就直接把它删了 …

至于 VMware Desktop,需要 Vagrant 的付费插件才能使用(79刀),在这里也暂时不讨论。

所以,在安装 Homestead 之前,你需要先安装 VirtualBox 和 Vagrant。

另外,所有需要下载的软件,我都将在文末附上百度网盘。

开始安装

安装 Homestead Vagrant Box

如果你不在大陆,你可以直接使用以下命令飞速安装 Homestead Vagrant Box:

1
vagrant box add laravel/homestead

可是你身处大陆,就注定不会这么顺利。

Vagrant 的文件都放在 Amazon S3 云存储上,由于 GFW 的原因,S3 的下载速度奇慢,在我的电脑上,它很少超过 80k/s,甚至时不时的降到 0。所以,我们需要从其他不受 GFW 干扰的地方下载,比如文末附上的百度网盘。

如果你有梯子,可以访问以下链接从官方下载:

1
https://app.vagrantup.com/laravel/boxes/homestead/versions/8.0.1/providers/virtualbox.box

其中 8.0.1 是版本号,你可以将它替换为这个页面的最新版本。

下载后,在该文件的同一目录下建立 metadata.json,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name": "laravel/homestead",
"versions":
[
{
"version": "8.0.1",
"providers": [
{
"name": "virtualbox",
"url": "virtualbox.box"
}
]
}
]
}

同样的,你可以将8.0.1替换为最新版本号。

安装 Homestead

先克隆官方仓库:

1
git clone https://github.com/laravel/homestead.git ~/Homestead

但是,该仓库的主分支是不稳定的,我们需要切换到打过标签的稳定版本。

1
2
git tag #查看所有的稳定版本的标签
git checkout v8.0.1 #切换到稳定版本

接下来,你只要初始化 Homestead ,就可以使用它了:

1
./init.bat

生成密匙

打开 Homestead.yml 你会发现有一行这样的:

1
authorize: ~/.ssh/id_rsa.pub

这说明登录 Homestead 的虚拟机需要用宿主机的密匙,密匙默认存放在用户目录下的 .ssh 文件夹,如果你当前的用户没有密匙,请使用以下命令来生成:

1
ssh-keygen.exe

一路回车

配置 Homestead.yml

以下即是一份标准的 Homestead 配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
---
ip: "192.168.10.10"
memory: 1024 #虚拟机最大使用内存
cpus: 1 #虚拟机最大占用核心
provider: virtualbox #使用的虚拟机软件

authorize: ~/.ssh/id_rsa.pub

keys:
- ~/.ssh/id_rsa

# 挂载文件夹
folders:
- map: "G:/code" #你的电脑上的代码文件夹
to: /home/vagrant/code #在虚拟机内的路径

# 站点配置
sites:
- map: homestead.test #域名 需要提前修改Hosts文件,使其指向本机(127.0.0.1)
to: /home/vagrant/code/public #Web 根目录

# 初始数据库
databases:
- homestead
- smartboard

# 其他功能
features:
- mariadb: false
- ohmyzsh: true
- webdriver: false

# 端口映射
# ports:
# - send: 80
# to: 80
# - send: 7777
# to: 777
# protocol: udp

Homestead 很强大,它所提供的功能远不止这些,你可以查询文档了解更多。

启动 Homestead

在 Homestead 目录下执行:

1
vagrant up

进入虚拟机

你可以在 Homestead 目录下执行:

1
vagrant ssh

或者,你也可以直接通过 SSH 连接虚拟机,这里我以 Fluent Terminal 为例:

Fluent Terminal 的 SSH 连接选项

接下来,你就可以开始正常的开发工作了!

其他

由于 Homestead 并没有为全球化做很多工作,你可能还需要将软件源更换为大陆的,进入 Homestead 执行:

1
2
3
4
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
npm config set registry https://registry.npm.taobao.org
yarn config set registry https://registry.npm.taobao.org

我踩过的万丈深坑

执行 vagrant up 后虚拟机无法启动

显示以下错误信息:

1
Call to WHvSetupPartition failed: ERROR_SUCCESS (Last=0xc000000d/87) (VERR_NEM_VM_CREATE_FAILED).

这是因为 Hyper-v 与 VirtualBox 不兼容导致 VirtualBox 无法正常启动虚拟机。

网上大部分教程都会教你打开 启用或关闭 Windows 功能 并在里面关闭 Hyper-v 功能,或者叫你在命令行里执行以下代码:

1
bcdedit /set hypervisorlaunchtype off

事实上这是错误的(在我的电脑上它一点也不起作用)

VirtualBox 从 6.0 版本开始,在 Windows 上会尝试使用 Hyper-v 作为虚拟引擎,因此你不需要关闭 Hyper-v

在启用 Hyper-v 后,我的虚拟主机正常运转

宿主机的文件夹无法挂载到虚拟主机上去

不管 Homestead 里的 folders 怎么样配置都无效

这可能是你的路径内含有中文字符造成的。

当初我正是因为这个原因才从 VirtualBox 跳到 Hyper-v,发现还是挂载不上去

npm install 报错

1
error An unexpected error occurred: "EPROTO: protocol error, symlink '../../../parser/bin/babel-parser.js' -> '/home/vagrant/smartboard/node_modules/@babel/core/node_modules/.bin/parser'".

你可以用管理员命令行执行 vagrant up 来解决这个问题

或者你也可以在命令后面加上 --no-bin-links参数:

1
npm install --no-bin-links

修改完 Homestead.yml 文件后不生效

Homestead 不会自动监控配置文件,需要重载容器才能使其生效。

在 Homestead 文件夹下执行:

1
vagrant reload --provision

写在后面

我并不建议 Laravel 的初学者一上来就开始用 Homestead,因为其繁琐的安装很可能会消磨掉你开发的兴趣,就像我自己在开发之前澎湃的心,在经历过两天的折磨后也早已化成了一滩静水。

初学者,大胆的用 WAMP 或者 Laragon 这种集成环境吧,这不是一种错误的做法,根据自己的情况灵活地处理开发环境是一种聪明的做法!等到真正需要用上宝剑的时候,再把宝剑磨好未必就已经迟了。你热情向上渴望学习的心比什么都重要!

另外,我个人并不十分推荐使用 Homestead。为了使用它,需要安装两个巨大的依赖软件,还需要踩这么多的坑,未免太过于繁琐。有时候太过灵活了就是臃肿,太过于臃肿了就是愚昧。

说起我为什么要用 Homestead,不过是一种人云亦云的从众心理,在国内的 Laravel 开发圈内,Laravel 开发一定要用 Homestead 的思想大行其道。只要能好好开发,能达到一样的效果,为什么就非用 Homestead 不可?我们身处大陆,Homestead 对我们并不友好,为什么还要非用它不可?

值得高兴的是,基于 Docker 的轻量化开发环境 LaraEdit 正在孕育之中,而同样基于 Docker 的 Laradock 已诞生良久。相信在将来的开发环境上,我们会有更多灵活的选择。

附件

百度网盘

提取码:fine

参考

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×