Homestead使用问题及解决方式

Wednesday, March 29, 2017

Homestead 是一个很棒的官方集成环境虚拟机,使用它开发可以大大减少折腾环境的时间和精力,并且不用在自己的机器上装一大堆的软件,即便 Homestead 出问题了,也可以快速的销毁当前的虚拟机,并且在几分钟内重新创建一个新的虚拟机出来。

不过使用过程中,也是发现了一些体验不好的地方:

使用过程中如果断电或者关机,会造成虚拟机出现一些很奇怪的问题。

针对这个问题,要养成断电或者关机前先关闭虚拟机(vagrant halt)的习惯,毕竟相对于出问题后重新创建虚拟机并且进行配置以及创建项目初始数据等操作,预先关闭虚拟机要轻松的多。

如果销毁或者重新加载虚拟机配置虚拟机的时候,会造成之前的一些配置和数据文件丢失。

针对这个问题,销毁新建或者重构虚拟机前,虚拟机都会在完成操作后执行 ~/Homestead/after.sh 脚本,所以我们可以在这个脚本中增加我们常用的一些操作命令,比如:配置composer镜像配置npm镜像初始化项目数据 等,相关代码如下:

#!/bin/sh

# If you would like to do some extra provisioning you may
# add any commands you wish to this file and they will
# be run after the Homestead machine is provisioned.

# 配置Composer使用中国镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com

# 配置npm使用淘宝镜像,使用淘宝镜像有两种方式

# 方式一:只修改npm镜像地址为淘宝镜像地址
sudo npm config set registry " https://registry.npm.taobao.org "

# 方式二:安装淘宝的cnpm,使用方式和npm一样,只是安装时将npm命令修改为cnpm
# npm install -g cnpm --registry=https://registry.npm.taobao.org

# 创建数据库及初始化项目数据,这两项操作一般只需要在项目销毁重建时使用,虚拟机重构(vagrant provision)时需要注释掉以下代码
mysql -uhomestead -psecret -e "create database IF NOT EXISTS blog default charset utf8 COLLATE utf8_general_ci;"
cd ~/Code/blog && php artisan migrate:refresh --seed

这里需要注意两点:

  1. 网上教程中说是修改 ~/.homestead/after.sh 脚本,但我测试不成功,只有修改 ~/Homestead/after.sh 脚本才会被执行到。

  2. 配置Composer使用中国镜像时建议不使用 sudo 命令,否则系统会报出警告:

Do not run Composer as root/super user! See https://getcomposer.org/root for details


### `vagrant up` 时总是会自动更新 `composer`

国内网络情况,直接 `Update Composer` ,总是会失败,所以我们可以在 `vagrant up` 屏蔽掉更新操作:

```shell
$ cd ~/Homestead
$ vim scripts/homestead.rb

在这个文件中屏蔽掉 Update Composer 那段代码 270-274行。

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

这样开启虚拟机时就会发现已经不再更新 composer 了。

Laravel Homestead

Let's EncryptLaravel的核心概念