如何在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個部分 :
- Vagrant Box : 將應用程式環境與作業系統打包在一起。
- 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
到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 box1
oomusou@mac:~$ vagrant box add laravel/homestead
選擇1
:virtualbox格式
大約需要10分鐘下載。
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
1 | oomusou@mac:~$ cd Homestead oomusou@mac:~/Homestead$ ll |
在~/Homestead
目錄下,我們看到了一些檔案:
- Vagrantfile : 事實上將來每次下
vagrant up
指令時,就是在找這個檔案,這是Vagrant Box啟動時第一個執行的檔案,Homestead已經幫我們客製化了。 - init.sh : 建立自己的
Homestead.yaml
、after.sh
與aliases
,稍後會用到。 - 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.sh
與aliases
。 若我們想修改after.sh
與aliases
,就是在這裡修改。
修改Homestead.yaml1
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專案路徑,可自行修改。目前接受預設值即可。
- map : 設定Mac本機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/hosts1
oomusou@mac:~$ sudo vim /etc/hosts
使用vim修改hosts
。
加入IP與網域主機名稱對應1
192.168.10.10 homestead.app
啟動Homestead
使用vagrant up啟動Homestead1
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登入Homestead1
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 folder1
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 | sites: |
新增站台則新增map
與to
,如blog.local
與其對應的路徑/home/vagrant/Code/blog/public
。
新增資料庫則新增databases
,如blog
為新增的資料庫。
修改hosts檔1
192.168.10.10 blog.local
重新Provision1
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是將之前使用 :
vagrant box add laravel/homestead
git clone https://github.com/laravel/homestead.git Homestead
sh ./init.sh
所下載與建立的檔案全部移除。
當完全不再使用Homestead,或Homestead Vagrant Box與Homestead scripts與設定檔壞掉,須重新下載與安裝設定Homestead時才需要這樣做。3 3Virtual Box與Vagrant一般來說不會壞掉,所以不需重新安裝,若連Virtual Box與Vagrant都想移除,請參考其官網說明。
刪除以下3個目錄 :
~/.vagrant.d
~/Homestead
~.homestead
Homestead啟動原理
之前已經稍微講過Homestead的組成元素,事實上Homestead啟動時,是依以上步驟啟動。
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。