在OS X享受Homestead的便利

初學者因為Laravel環境難安裝而卡很久嗎?Laravel官方已經幫我們將整個環境用VM打包好,讓初學者可以不用擔心如何在OS X安裝PHP、Composer、Nginx、MySQL,就可快速地享受Laravel所帶來的便利。

Version


Laravel 5.2.23
Homestead 0.4.2
VirtualBox for OS X 5.0.16
Vagrant for OS X 1.8.1
OS X 10.11.3

簡介


Homestead是Laravel官方以Vagrant為基礎建立的VM,已經幫我們安裝好以下軟體 :

  • Ubuntu 14.04 : 2014年所推出的Ubuntu LTS版本。
  • PHP 7.0.3 : PHP最新版,已經更新到PHP 7,符合Laravel 5.2對PHP版本要求,且所需extension已經裝好。
  • Composer:PHP套件管理工具,會在每次Homestead啟動時自動更新。
  • HHVM : Facebook對PHP的JIT compiler支援。
  • Nginx : 效能較Apache優異的Web server。
  • MySQL : 關聯式資料庫 (預設)。
  • Postgres : 關聯式資料庫。
  • Node.js
    • Bower : CSS、JavaScript套件管理工具。
    • Npm : Node.js套件管理工具。
    • Grunt : JavaScript壓縮、測試、部署工具。
    • Gulp : JavaScript環境管理工具。
  • Redis : 非關聯式的Key-Value資料庫。
  • Memcached : 非關聯式的Key-Value資料庫。
  • Beanstalkd : Job Queue Server。
  • Laravel Envoy : Laravel官方提供的任務執行工具。
  • Fabric + HipChat extension : log管理工具。
  • Blackfire Profiler : 效能評估工具。

這些工具當然可以自己慢慢裝,但需要時間,還可能遇到軟體相衝的問題,就算安裝完沒錯誤訊息,也不保證能正確執行Laravel。

Laravel官方已經將這些軟體都幫你安裝好、測試好並打包好,這就是Homestead。

Why Homestead?


  • 不再因為你的PHP缺少某個extension,而導致Laravel安裝失敗。
  • 不再因為軟體相衝或port相衝,而使得Laravel執行錯誤。
  • 不再因為要安裝與設定軟體,而浪費一整天的時間。
  • 不再因為你換了一個作業系統,而必須重新打造整個Laravel環境。
  • 不再因為團隊中每個人的環境不統一,而造成debug困難。

Homestead是Laravel爸爸Taylor Otwell親手打造,也是Laravel開發測試時所使用的環境,若遇到bug時不用再懷疑是否環境有問題,因為你的環境與Taylor Otwell所使用的一樣。

也因為Homestead是官方所打包的環境,若有問題也方便與社群討論。

Vagrant


既然Homestead使用的是VM技術,用的是VirtualBox,為什麼還要使用Vagrant呢?這是很多Homestead初學者的問題,包括我自己在內。

Vagrant是個用Ruby所寫的軟體,簡單的說,他的核心部分仍使用VirtualBox,Vagrant只能算是個VirtualBox管理工具。也就是說,你雖然需安裝VirtualBox,但安裝完後就再也碰不到它了,因為Vagrant已經全面接管VirtualBox,你所有的操作都在Vagrant上。

Vagrant包含2個部分 :

  1. Vagrant Box : 將應用程式環境與作業系統打包在一起。
  2. Scripts :
    • Vagrantfile : 使用Ruby開發,是Homestead執行時,第一個被執行的程式,負責設定Homestead環境變數,並調用其他scripts執行。我們不用去修改,Homestead已經幫我們建好了。
    • homestead.rb : 使用Ruby開發,Vagrantfile會調用homestead.rb,由homestead.rb去讀取Homestead.yaml,依其設定將VM provision起來。我們不用去修改,Homestead已經幫我們建好了。
    • Homestead.yaml : 使用Ruby開發,用來設定我們自己的Homestead,如CPU用幾個? 記憶體開多大? shared folder路徑怎麼設定? 資料庫建立…等,這個檔案我們必須自己設定。
    • after.sh : 使用Bash開發,當Homestead啟動之後,會執行after.sh內的內容,若我們希望Homestead啟動之後馬上啟動某些程式,可以寫在這裡。
    • aliases : 使用Bash開發,可以在此設定Homestead內的Bash alias。

事實上還有很多scripts沒有提到,這裏只提到最重要的幾個scripts。

若還是對Vagrant很模糊沒關係,最後我們還會對Homestead啟動做更深入地解釋。

簡單的說,Homestead就是 :

Homestead = VirtualBox + Vargrnt + Homestead Vagrant Box + Homestead Scripts。

安裝流程


接下來我們將一步一步地將Homestead安裝起來。

安裝VirtualBox

VirtualBox Download下載VirtualBox for OS X hosts,不必下載Extension Pack,因為不會在VirtualBox下使用GUI模式。

執行VirtualBox-5.0.16-105871-OSX.dmg

滑鼠點兩下VirtualBox.pkg圖示開始安裝。

確認安裝

因為是pkg格式,必須手動確認是否執行,按continue繼續。

歡迎畫面

continue繼續。

選取目標與安裝類型

Install繼續。

安裝成功

Close結束安裝程式。

執行VirtualBox

Application下選擇VirtualBox,滑鼠點兩下執行。

安裝完成

若安裝成功,將顯示Oracle VM VirtualBox Manager

安裝Vagrant

Vagrant Download下載Vagrant for OSX。

執行vagrant_1.8.1.dmg

滑鼠點兩下Vagrant.pkg圖示開始安裝。

歡迎畫面

continue繼續。

選取目標與安裝類型

Install繼續。

安裝成功

安裝完成

1
oomusou@mac:~$ vagrant version

若成功會顯示目前Vagrant版本資訊。

下載Homestead

下載Homestead vagrant box。

使用vagrant box add下載Homestead vagrant box

1
oomusou@mac:~$ vagrant box add laravel/homestead

選擇1:virtualbox格式

大約需要10分鐘下載。

為什麼我們要花10分鐘下載Homestead呢?
1
oomusou@mac:~$ cd ~/.vagrant.d/boxes
oomusou@mac:~/.vagrant.d/boxes$ ll

~/.vagrant.d/boxes目錄下了多了laravel-VAGRANTSLASH-homestead目錄。

1
oomusou@mac:~/.vagrant.d/boxes$ cd laravel-VAGRANTSLASH-homestead/0.4.2/virtualbox
oomusou@mac:~/.vagrant.d/boxes/laravel-VAGRANTSLASH-homestead/0.4.2/virtualbox$ ll

其中0.4.2是Homestead的版本,若本機有下載多個Homestead版本,這邊就會有多個版本目錄。

我們看到了box-disk1.vmdk,這超過1GB的box-disk1.vmdk是VirtualBox的檔案格式,這也是為什麼我們要花10分鐘下載的原因。

下載設定檔

下載Vagrantfile + Scripts。

下載Homestead設定檔

1
oomusou@mac:~$ git clone https://github.com/laravel/homestead.git Homestead

Homestead設定檔包括哪些東西呢?
1
oomusou@mac:~$ cd Homestead
oomusou@mac:~/Homestead$ ll

~/Homestead目錄下,我們看到了一些檔案:

  • Vagrantfile : 事實上將來每次下vagrant up指令時,就是在找這個檔案,這是Vagrant Box啟動時第一個執行的檔案,Homestead已經幫我們客製化了。
  • init.sh : 建立自己的Homestead.yamlafter.shaliases,稍後會用到。
  • scripts目錄 : Homestead自己會用到的scripts,如homestead.rb就在此目錄下。

設定SSH金鑰

將來會使用SSH方式連進Homestead,所以要設定SSH金鑰。

使用ssh-keygen建立SSH金鑰

1
oomusou@mac:~$ ssh-keygen -t rsa -C "oomusou@homestead"

oomusou為你的user名稱。

id_rsa接受預設目錄即可。

passphrase是設定密碼。

設定Homestead.yaml

之前提到Vagrantfile會調用homestead.rb,由homestead.rb去讀取Homestead.yaml,依其設定將Homestead provision起來。

使用init.sh建立Homestead.yaml

1
oomusou@mac:~$ cd Homestead
oomusou@mac:~/Homestead$ sh ./init.sh

init.sh會幫我們在~/.homestead/目錄建立Homestead.yaml

事實上,init.sh還幫我們建立了after.shaliases。 若我們想修改after.shaliases,就是在這裡修改。

修改Homestead.yaml

1
oomusou@mac:~$ cd .homestead
oomusou@mac:~/.homestead$ vim Homestead.yaml

這是Homestead唯一需要我們手動修改設定的地方,homestead.rb會依照Homestead.yaml的設定為我們的Homestead做provision。

  • ip : 設定Homestead的IP,若IP沒有相衝,可以不用修改。

  • memory : 單位為MB,預設開2GB,若你嫌這樣太耗記憶體,根據經驗,512MB就可以讓Homestead啟動,不過有些service會失敗,1GB以上service都會正常,不過因為記憶體較少,有時會因為swap memory到HDD/SSD導致效能較差。

  • cpu : 維持預設1顆CPU即可。

  • provider : 使用VirtualBox,不用修改。

  • authorize : 設定SSH public key位置,若之前ssh-keygen使用預設位置建立,則不用修改。

  • keys : 設定SSH private key位置,若之前ssh-keygen使用預設位置建立,則不用修改。

  • folders : Homestead.yaml重要的設定,設定Mac本機與Homestead的對應路徑。1 1事實上這就是VirtualBox的shared folder機制,我們知道VM最佳使用方式是環境灌在VM內,但專案放在本機,透過shared folder機制讓VM使用本機的專案,這樣的優點是儘管VM損毀開不了機,專案仍然不會受影響,因為專案是放在本機,只要再重新建立一個VM即可。

    • map : 設定Mac本機Laravel專案路徑,可自行修改。預設值是~/Code,目前接受預設值即可。
    • to : 設定Homestead內Laravel專案路徑,可自行修改。目前接受預設值即可。
  • sites : Homestead.yaml重要的設定,讓你可以對Nginx設定網域主機名稱。

    • map : 網域主機名稱。預設為homestead.app,目前接受預設值即可。

    • to : 此站台所對應的目錄名稱。預設為/home/vagrant/Projects/Laravel/public。因為Laravel的index.php放在public目錄下。目前接受預設值即可。

  • databases : Homestead.yaml重要的設定,可以在此設定資料庫名稱,由Homestead幫你自動建立。目前維持預設homestead即可。

  • variables : 設定Lavavel全域變數,目前使用預設值即可

補建~/Code目錄

1
oomusou@mac:~/.homestead$ cd ..
oomusou@mac:~$ mkdir Code

因為剛才設定Mac本機Laravel專案路徑為~/Code,但這麼目錄並不存在,所以要補建目錄。

修改hosts檔

因為Homestead的IP為192.168.10.10,其網域主機名稱為homestead.app,要設定hosts將彼此對應起來。

修改/etc/hosts

1
oomusou@mac:~$ sudo vim /etc/hosts

使用vim修改hosts

加入IP與網域主機名稱對應

1
192.168.10.10 homestead.app

啟動Homestead

使用vagrant up啟動Homestead

1
oomusou@mac:~$ cd Homestead
oomusou@mac:~/Homestead$ vagrant up

先cd進Homestead目錄,使用vagrant up指令啟動Homestead。

先進入Homestead目錄是必須的,凡Vagrant指令在執行時都會找Vagrantfile,而Vangrantfile就是放在~/Homestead目錄下。

Homestead啟動時還會上網檢查是不是最新版,並提醒你是否該更新。

若此時打開VirtualBox,會發現有一個VM正在執行中,這也證明了Vagrant背後執行的是VirtualBox。

使用SSH登入

使用vagrant ssh登入Homestead

1
oomusou@mac:~$ cd Homestead
oomusou@mac:~/Homestead$ vagrant ssh

如同vagrant up一樣,下任何vagrant指令都要在~/Homestead目錄下。2 2為什麼不需要login呢?因為我們之前已經設定了SSH金鑰,homestead ssh會自動去讀取金鑰登入,所以不用login。

我們已經可以順利登入Ubuntu 14.04 LTS了。

顯示shared folder

1
vagrant@homestead:~$ ll

我們可以在home directory可以看到Mac本機的~/Code目錄。

下載Laravel

在Homestead使用Composer下載Laravel。

使用Composer建立Laravel專案

1
vagrant@homestead:~$ cd Code
vagrant@homestead:~/Code$ composer create-project laravel/laravel Laravel --prefer-dist

統一將專案放在Code目錄下,其中Laravel為你的專案目錄名稱。

Composer將會建立一個Laravel目錄,並將Laravel所需要的檔案透過網路下載。

–prefer-dist : 此參數意思是下載用於distribution的穩定版本,而不是正在開發中的版本,對於應用來說,穩定版本較適當。

由於Composer是透過網路去下載Laravel,所以請先確定網路是通的。

使用瀏覽器驗證

在瀏覽器輸入homestead.app

若能在瀏覽器看到Laravel 5,恭喜你,Homestead與Laravel環境已經大功告成了。

新增站台


實務上我們可能會有很多專案在Homestead跑,因此需要新增其他站台。

修改Homestead.yaml

1
2
3
4
5
6
7
8
9
10
sites:
- map: homestead.app
to: /home/vagrant/Code/Laravel/public

- map: blog.local
to: /home/vagrant/Code/blog/public

databases:
- homestead
- blog

新增站台則新增mapto,如blog.local與其對應的路徑/home/vagrant/Code/blog/public

新增資料庫則新增databases,如blog為新增的資料庫。

修改hosts檔

1
192.168.10.10 blog.local

重新Provision

1
oomusou@mac:~/Homestead$ vagrant provision

將自動根據Homestead.yaml的設定,重新啟動Homestead,並啟動新站台與建立blog資料庫。

結束Homestead


Homestead跑的就是Ubuntu,若我們想讓Ubuntu關機,也須依照正常程序關機。

1
vagrant@homestead:~$ eixt
oomusou@mac:~/Homestead$ vagrant halt

exit離開vagrant ssh

vagrant halt讓Homestead正常關機。

刪除Homestead


若Homestead僅供測試用,想徹底刪除,請下以下指令 :

1
oomusou@mac:~/Homestead$ vagrant destroy --force

重建Homestead


Homestead被刪除後,想重新建立,請下以下指令:

1
oomusou@mac:~/Homestead$ vagrant up

移除Homestead


移除刪除是不一樣的,之前刪除Homestead,是將VirtualBox的Homestead VM刪除,也就是將vagrant up所建立的VM刪除,之後可以隨時再用vagrant up建立。

而移除Homestead是將之前使用 :

  1. vagrant box add laravel/homestead
  2. git clone https://github.com/laravel/homestead.git Homestead
  3. sh ./init.sh

所下載與建立的檔案全部移除。

當完全不再使用Homestead,或Homestead Vagrant Box與Homestead scripts與設定檔壞掉,須重新下載與安裝設定Homestead時才需要這樣做。3 3Virtual Box與Vagrant一般來說不會壞掉,所以不需重新安裝,若連Virtual Box與Vagrant都想移除,請參考其官網說明。

刪除以下3個目錄 :

  1. ~/.vagrant.d
  2. ~/Homestead
  3. ~.homestead

Homestead啟動原理


之前已經稍微講過Homestead的組成元素,事實上Homestead啟動時,是依以上步驟啟動。

給OS X使用者的特別建議

OS X使用者較習慣使用休眠,而不像Windows使用者每天關機,建議在OS X需要重新開機時,要手動vagrant halt將Homestead關機,因為直接關機,Homestead並沒有任何警告訊息,但下次OS X重開機後,若去執行VirtualBox,會發現Homestead已被不正常關機,雖然下vagrant up後還是可以使用,但這樣很容易造成VM損毀。

Conclusion


  • Homestead讓我們可以快速建置Laravel開發環境,且若VM因測試而損毀,也可以快速刪除再重建,非常方便。4 4本文為Homestead的基礎,一個OS X裝一個共用的VM,若你想每個專案有自己的VM,詳細請參考如何一個專案使用一個Homestead?
  • Homestead雖然好用,但有一個致命傷 : 非常耗電,尤其當你外出使用筆記型電腦時,會發現只要使用Homestead時,電池使用時間會減少一半,畢竟一顆電池要撐兩個作業系統同時運作。所以建議外出使用筆記型電腦時,若沒開發Laravel,一定要記得關閉Homestead。