Mac 搭建 Homestead 集成开发环境
介绍
Laravel 致力于使整个 PHP 开发体验变得愉快,包括你的本地开发环境。Vagrant
提供了一个简单、优雅的方式来管理和配置虚拟机。
Laravel Homestead 是一个官方预载的 Vagrant
盒子,旨在提供你一个美好的开发环境,而不需要在你的本地机器 中去安装 PHP,Web 服务器和其它任何服务软件。再也不用担心会搞乱你的操作系统!Vagrant 盒子完全是一次性的。如果出现问题,你可以在几分钟内销毁并重新创建它!
Homestead 运行在任何 Windows,Mac,或者 Linux 系统上,并包含 Nginx Web 服务器,PHP 7.2,PHP 7.1,PHP 5.6,MySQL,Redis,Memcached,Node,以及开发令人惊叹的 Laravel 应用程序所需的所有其他好东西。
{% note danger %}
如果你使用 Windows,你需要开启硬件虚拟化(VT-x
)。它通常是通过你的 BIOS 去开启。如果你在一个 UEFI 系统上使用 Hyper-V,为了访问 VT-x,你可能还需要去禁用 Hyper-V。
{% endnote %}
内置软件
- Ubuntu 18.04
- Git
- PHP 7.2
- PHP 7.1
- PHP 7.0
- PHP 5.6
- Nginx
- Apache(可选)
- MySQL
- MariaDB(可选)
- Sqlite3
- PostgreSQL
- Composer
- Node(Yarn,Bower,Grunt 和 Gulp)
- Redis
- Memcached
- Beanstalkd
- Mailhog
- Neo4j(可选)
- MongoDB(可选)
- Elasticsearch(可选)
- ngrok
- wp-cli
- Zend Z-Ray
- Go
- Minio
总之一句话,巨牛逼。如果这些东西让你自己折腾,怎么着也得大半天吧。想想我朝这个网络,你能顺利的搞定那简直就是牛逼中的战斗机。
安装与配置
起步
在启动 Homestead 环境之前,你必须安装 VirtualBox 5.2
,VMWare
,Parallels
或者 Hyper-V
以及 Vagrant
。所有这些软件包都为所有流行的操作系统提供了易于使用的可视化安装程序。
为了使用 VMware 提供者,你将需要去购买 VMware Fusion / Workstation 和 VMware Vagrant plug-in
。尽管它不是免费的,VMware 比其它盒子能提供更快的共享文件夹性能。
为了使用 Parallels 提供者,你将需要安装 Parallels Vagrant plug-in
,它是免费的。
因为 Vagrant limitations
,Hyper-V 提供者将忽略所有的网络设置。
安装 Homestead Vagrant 盒子
一旦 VirtualBox / VMware 和 Vagrant 被安装,你应当在你的终端中使用如下的命令将 laravel/homestead
添加到你的 Vagrant 安装中。下载盒子耗费的时间取决于你的网速:
|
|
如果此命令失败,确保你安装的 Vagrant 是最新的。
安装 Homestead
你可以安装 Homestead 通过克隆仓库。考虑克隆仓库到你的『home』目录下的一个 Homestead
文件夹下,这样 Homestead 盒子服务将作为你的所有 Laravel 项目的主机:
|
|
你应当检查 Homestead 的标记版本,因为 master
分支不总是稳定的。你能在 GitHub Release Page
找到最新的稳定版:
|
|
一旦你克隆克隆了 Homestead 仓库,从 Homestead 目录运行 bash init.sh
命令去创建 Homestead.yaml
配置文件。此 Homestead.yaml
文件将位于 Homestead 目录中:
|
|
配置 Homestead
设置你的提供者
在你的 Homestead.yaml
文件中的 provider
键名表示哪个 Vagrant 提供者应当被使用:virtualbox
,vmware_fusion
,vmware_workstation
,parallels
或者 hyperv
。你可以设置你偏好的提供者:
|
|
配置共享文件夹
Homestead.yaml
文件中的 folders
属性列出了你希望与你的 Homestead 环境共享的所有文件夹。在这些文件夹下的文件发生改变时,他们将在你的本地机器和 Homestead 环境之间保持同步。你可以根据需要去配置任意数量的共享文件夹。
|
|
如果你仅仅创建一些站点,这个能用的映射将正常工作。然而,随着站点数量的不断增加,你可能会遇到性能问题。在包含大量文件的低端机器或者项目中,这个问题可能非常明显。如果你遇到这个问题,尝试将每个项目映射到其自己的 Vagrant 文件夹下:
|
|
要开启 NFS
,你仅仅需要增加一个简单的标志到你的同步文件配置中:
|
|
{% note danger %}
当使用 NFS 时,你应当考虑安装 vagrant-bindfs
插件。这个插件将为 Homestead 盒子中的文件和目录维护正确的 user / group 权限。
{% endnote %}
你也可以传递通过 options
键下列出它们的 Vagrant 的 Synced Folders
所支持的任何选项:
|
|
配置 Nginx 站点
不熟悉 Nginx?没问题。sites
属性允许你轻松映射一个『domain』到你的 Homestead 环境的一个文件夹。在 Homestead.yaml
文件中包含一个示例站点配置,你可以根据需要添加许多站点到你的 Homestead 环境。Homestead 能作为一个方便的,虚拟化的环境为你工作的每一个 Laravel 项目服务:
|
|
如果你改变 sites
属性在配置 Homestead 盒子后,你应当重新运行 vagrant reload --provision
去更新虚拟机中的 Nginx 配置。
主机文件
你必须在你机器的 hosts
文件中为 Nginx 站点添加『domains』。hosts
文件将把你的 Homestead 站点请求重定向到你的 Homestead 机器。在 Mac 和 Linux 中,这个文件位于 /etc/hosts
。在 Windows 中,位于 C:\Windows\System32\drivers\etc\hosts
。你添加到此文件中的行看起来像如下这样:
|
|
确保列出的 IP 地址是 Homestead.yaml
文件中设置的 IP 地址。一旦你添加域名到你的 hosts
文件,启动 Vagrant 盒子后你能在你的 Web 浏览器中访问它:
|
|
启动 Vagrant 盒子
一旦你根据你的喜好编辑 Homestead.yaml
后,从你的 Homestead 目录运行 vagrant up
命令。Vagrant 将启动虚拟机并自动配置你的共享文件夹和 Nginx 站点。
在销毁虚拟机,你可以使用 vagrant destroy --force
命令。
按项目安装
你可以为你所管理的每个项目配置配置一个 Homestead 实例,而不是在全局范围内安装 Homestead 并在所有的项目中共享相同的 Homestead 盒子。如果你希望随项目一起发送一个 Vagrantfile
,那么为每个项目安装 Homestead 可能是大有裨益的,允许其它人在项目中 vagrant up
进行工作。
要直接将 Homestead 安装到你的项目,需要使用 Composer:
|
|
一旦 Homestead 被安装,使用 make
命令去生成 Vagrantfile
和 Homestead.yaml
文件在你的项目根目录。make
命令将自动配置 site
和 folders
指令在 Homestead.yaml
文件中。
|
|
接下来,在终端中运行 vagrant up
命令并在浏览器中输入 http://homestead.test
去访问你的项目。记住,你将需要添加一个 homestead.test
到 /etc/hosts
文件中或者你自定义的域名。
安装 MariaDB
如果你偏好使用 MariaDB 而不是 MySQL,你可以在 Homestead.yaml
文件中添加 mariadb
选项。这个选项将移除 MySQL 并安装 MariaDB。MariaDB 服务作为 MySQL 的一个替代品,因此你仍然在你的应用程序数据库配置中使用 mysql
数据库驱动:
|
|
安装 MongoDB
要安装 MongoDB 社区版,更新你的 Homestead.yaml
文件用如下的配置选项:
|
|
默认的 MongoDB 安装将设置数据库用户名为 homestead
,相应地密码为 secret
。
安装 Elasticsearch
要安装 Elasticsearch,添加 elasticsearch
选项到你的 Homestead.yaml
文件并指定一个支持的版本,该版本可能是一个主版本或者一个精确的版本号(主版本号.次版本号.修复版本号)。默认安装将创建一个名为 homestead
的集群。你应当从不给 Elasticsearch 超过操作系统一半的内存,所以要确保你的 Homestead 机器至少有两倍的 Elasticsearch 分配的内存:
|
|
{% note info %}
查阅 Elasticsearch documentation 去学习如何自定义你的配置。
{% endnote %}
安装 Neo4j
Neo4j
是一个图形数据库管理系统。要安装 Neo4j 社区版,更新你的 Homestead.yaml
文件用如下的配置选项:
|
|
默认的 Neo4j 安装将设置数据库的用户名为 homestead
,相应的密码为 secret
。要访问 Neo4j,用浏览器访问 http://homestead.test:7474
地址。你的端口 7687
(Bolt),7474
(HTTP),7473
(HTTPS)是准备好服务来自 Neo4j 客户端的请求的。
别名
你可以通过在你的 Homestead 目录下修改 aliases
文件添加 Bash 别名到你的 Homestead 机器:
|
|
随后你需要更新 aliases
文件,你应当使用 vagrant reload --provision
命令重新配置 Homestead 机器。这将确保在机器中你的新别名可用。
踩过的坑
装载 Homestead 镜像
官方的命令是这样的,如果你觉得执行下面命令没问题,那你真是 too young too simple
,我可是踩过坑的。
|
|
执行上面命令后,你在 vagrant up
是时会遇到 Box 'laravel/homestead' could not be found
这个不是问题的问题,怎么办,不能凉拌吧。也好办,不就搜索吗? 别搜了,跟我上:
|
|
查看你的 box
列表
|
|
在 ~/Homestead/scripts/homestead.rb
文件中有这么一行,要求版本必须是大于 4.0.0
,怎么样,我没骗你吧,版本居然不一致。小意思,改下版本号嘛,可别,咱能不碰代码就不碰:
|
|
打开克隆的项目,根目录创建 Homestead.json
文件,文件填入以下内容
|
|
好了,走一个试试
|
|
必须卧槽呀,版本号回来了,好了,我们出发
生成 key
|
|
配置
这个基本上是在修改 ~/Homestead/Vagrantfile
文件
|
|
启动并进入虚拟机
|
|
日常操作
全局访问 Homestead
有时你想文件系统的任何地方 vagrant up
你的 Homestead 机器。你能这样做,在 Mac / Linux 系统上通过添加一个 Bash 函数到你的 Bash 简介中。在 Windows 中,你可以通过添加一个『batch』文件到 PATH
来完成这个操作。这些脚本将允许你在你的系统的任何地方运行任何 Vagrant 命令,并自动将该命令指向你的 Homestead 安装目录:
Mac / Linux
|
|
确保函数中的 ~/Homestead
路径调整到实际 的 Homestead 安装的位置。一旦该函数被安装,你可以从你的系统的任何位置运行像 homestead up
或者 homestead ssh
命令。
Windows
在你的机器的任何位置创建一个如下内容的 homestead.bat
批处理文件:
|
|
确保在脚本中的实例 C:\Homestead
路径调整为 Homestead 实际安装的位置。创建文件之后,针文件添加到 PATH
中。然后,你可以在你的系统的任何地方运行像 homestead up
或者 homestead ssh
之类的命令。
通过 SSH 连接
你能从你的 Homestead 目录中通过在终端中发送 vagrant ssh
命令来 SSH 到你的虚拟机中。
但是,由于你可能需要经常 SSH 到你的 Homestead 机器,考虑将上面的『function』 添加到主机以快速 SSH 到 Homestead 盒子中。
数据库连接
一个 homestead
数据库配置了开箱即用的 MySQL 和 PostgreSQL。为了更加方便,Laravel 的 .env
文件配置到框架以开箱即用此数据库。
要从你的主机的数据库客户端连接到你的 MySQL 或者 PostgreSQL 数据库,你应当连接 127.0.0.1
和端口为 33060
(MySQL)或者 54320
(PostgreSQL)。两个数据库的用户名和密码是 homestead
/ secret
。
{% note danger %}
当从你的主机连接到数据库时,你应当仅使用这些非标准端口。由于 Laravel 在虚拟机中运行。你将在你的 Laravel 数据库配置文件中使用默认的 3306 和 5532 端口。
{% endnote %}
数据库备份
当你的 Vagrant 盒子销毁时,Homestead 能自动备份你的数据库。为了使用这个功能,你必须使用 Vagrant 2.1.0 或者更高的版本。或者,如果你使用一个旧版本的 Vagrant,你必须安装 vagrant-triggers
插件。为了开启自动数据库备份,添加如下的行到你的 Homestead.yaml
文件:
|
|
一旦配置了,当 vagrant destroy
命令被执行时,Homestead 将导出你的数据库到 mysql_backup
和 postgres_backup
目录。如果你使用 per project installation
方法,则可以在克隆的 Homestead 或者在你的项目根目录中找到这些目录。
添加额外的站点
一旦你的 Homestead 环境已配置并运行,你可以为你的 Laravel 应用添加额外的 Nginx 站点。你能在你希望的单个 Homestead 环境运行多个 Laravel 安装。要添加额外的站点,在你的 Homestead.yaml
文件中添加站点:
|
|
如果 Vagrant 不能自动管理你的『hosts』文件,你可能还需要添加新的站点到该文件中:
|
|
一旦这个站点被添加,从你的 Homestead 目录运行 vagrant reload --provision
命令。
站点类型
Homestead 支持多种类型的站点,允许你轻松运行不是基于 Laravel 的项目。例如,我们可以使用 symfony2
站点类型轻松地添加一个 Symfony 应用到 Homestead:
|
|
可用的站点类型是:apache
,apigility
,expressive
,laravel
(默认),proxy
,silverstripe
,statamic
,symfony2
,symfony4
,和 zf
。
站点参数
你可以通过 params
站点指令添加额外的 Nginx fastcgi_param
值到你的站点。例如,我们添加一个值为 BAR
的 Foo
参数:
|
|
环境变量
你能通过添加如下的值到 Homestead.yaml
文件来设置全局环境变量:
|
|
更新 Homestead.yaml
文件之后,确保通过运行 vagrant reload --provision
命令重新配置机器。这个将更新所有安装 的 PHP 版本的 PHP-FPM 配置并为 vagrant
用户更新环境。
配置定时计划
Laravel 提供了一种通过单个计划将每分钟运行 schedule:run
Artisan 命令 schedule Cron jobs
的便捷方式。schedule:run
命令将检查在你的 App\Console\Kernel
类中定义的计划来决定哪个工作应当被运行。
如果你想为一个 Homestead 站点的 schedule:run
命令去运行,当定义站点时,你可以设置 schedule
选项为 true
:
|
|
站点的 Cron 工作将被定义在虚机的 /etc/cron.d
文件夹下。
配置 Mailhog
Mailhog 允许你轻松地捕获外发的电子邮件并进行检查它,而实际上没有将发送邮件给收件人。开始使用时,更新你的 .env
文件以使用以下的邮件设置:
|
|
配置 Minio
Minio 是一个开源的对象存储服务器,具有与 Amazon S3 兼容的 API。要安装 Minio,用以下的配置选项更新你的 Homestead.yaml
文件:
|
|
默认情况下,Minio 为端口 9600 上可用。你可以访问 Minio 控制面板通过访问 http://homestead:9600
。默认访问的键名是 homestead
,同时默认的密钥是 secretkey
。当访问 Minio,你应当总是使用 us-east-1
。
为了使用 Minio,你将需要在你的 config/filesystems.php
配置文件中调整 S3 磁盘配置。你将需要添加 use_path_style_endpoint
选项到磁盘配置,并将 url
键更改为 endpoint
:
|
|
最后,确保你的 .env
文件有如下的选项:
|
|
端口
默认情况下,如下的端口将转发到你的 Homestead 环境:
- SSH:2222 -> 22
- ngrok UI:4040 -> 4040
- HTTP:8000 -> 80
- HTTPS:44300 -> 443
- MySQL:33060 -> 3306
- PostgreSQL:54320 -> 5432
- MongoDB:27017 -> 27017
- Mailhog:8025 -> 8025
- Minio:9600 -> 9600
转发额外的端口
如果你愿意,你可以转发额外的端口到 Vagrant 盒子,同时也指定他们的协议:
|
|
共享你的环境
有时你希望共享你当前工作的内容跟同事或客户。Vagrant 有内置的方法通过 vagrant share
去支持这个;然而,如果你有多个站点在你的 Homestead.yaml
文件中配置过,这个将不会工作。
为了解决这个问题,Homestead 包含它自己的 share
命令。开始,通过 SSH 即 vagrant ssh
命令进入到你的 Homestead 机器并运行 share homestead.test
。这个将从你的 Homestead.yaml
配置文件中分享 homestead.test
站点。当然,你可以将任何其它配置的站点替换为 homestead.test
:
|
|
运行此命令之后,你将看到一个 Ngrok 屏幕出现,其中包含了活动日志和共享站点的可访问的 URL。如果你想指定一个自定义的区域,子域,或者其它 Ngrok 运行时选项,你可以添加他们到你的 share
命令:
|
|
{% note danger %}
记住,Vagrant 本质上是不安全的,并且在运行 share
时将虚拟机显露给互联网。
{% endnote %}
多版本 PHP
{% note danger %}
这个功能仅兼容 Nginx。
{% endnote %}
Homestead 6 在同一个虚拟机上引入了对多个 PHP 版本的支持。你可以在你的 Homestead.yaml
文件中指定要用于给定站点的 PHP 版本。可用的 PHP 版本是:『5.6』,『7.0』,『7.1』和『7.2』(默认):
|
|
另外,你可以通过 CLI 使用任何 PHP 支持的版本:
|
|
设置 Cli 下默认的 PHP 版本:
|
|
Web 服务器
默认情况下,Homestead 使用 Nginx Web 服务器。然而,如果 apache
是指定的一个站点类型,它能安装 Apache。同时两个 Web 服务器在同时被安装,他们不能同时运行。flip
脚本命令可用来易于处理 Web 服务器之间的切换。flip
命令自动确定正在运行的 Web 服务器,将其关闭。然后启动别一台服务器。要使用这个命令,SSH 进入到你的 Homestead 机器并在终端运行命令:
|
|
邮件
Homestead 包括 Postfix 邮件传输代理,默认监听 1025
端口。因此,你可以指示你的应用程序在 localhost
端口 1025
上使用 smtp
邮件驱动。所有发送的邮件将由 Postfix 处理并由 Mailhog 捕获。要查看已发送的邮件,在 Web 浏览器中打开 http://localhost:8025
。
网络接口
Homestead.yaml
中的 networks
属性为你的 Homestead 环境配置网络接口。你可以根据需要配置多个接口:
|
|
要开启一个 bridged
接口,配置 bridge
设置并改变 public_network
网络类型:
|
|
要开启 DHCP
,仅从你的配置中移除 ip
选项:
|
|
更新 Homestead
你能通过两个简单的步骤更新 Homestead。首先,你应当更新 Vagrant 盒子使用 vagrant box update
命令:
|
|
接下来,你需要去更新 Homestead 源代码。如果你克隆过仓库,你能在最初克隆仓库的位置 git pull origin master
。
如果你通过你的项目的 composer.json
安装 Homestead,你应当确保你的 composer.json
包含 "laravel/homestead": "^7"
并更新你的依赖:
|
|
提供指定的设置
VirtualBox
默认情况下,Homestead 将 natdnshostresolver
配置设置为 on
。这允许 Homestead 去使用你的主机操作系统的 DNS 设置。如果你不想覆盖这个行为,添加如下的行到你的 Homestead.yaml
文件:
|
|
符号链接在 Windows
如果符号链接在你的 Windows 机器上无法正常工作,你可能需要添加以下的块到 Vagrantfile
文件:
|
|