SlideShare a Scribd company logo
1 of 51
Download to read offline
Composer 套件管理
范聖佑 Shengyou Fan
新北市樹林國⼩小 (2015/07/06)
適
⽤用
5.1
版
單元主題
• ⽐比對傳統與現代網路應⽤用程式開發⽅方式的異同
• 了解現代網路應⽤用程式在套件管理上的需求
• Composer 簡介、安裝與基礎指令
• Composer 錦囊妙計
• Composer Global 套件
現代	
  PHP	
  元件	
  
與	
  Composer	
  套件管理
常⾒見的 PHP 開發架構
瀏覽網⾴頁
使⽤用者端 HTTP
伺服器
網站根⺫⽬目錄
index.php
posts.php
inc/
libs/
共⽤用設定檔
應⽤用程式類別
函式庫 A
函式庫 B
classes/
bootstrap.php
依 URL 對應
⾄至各 php 檔案
libs 資料夾
• 通常放從 某來源 拿到的 某函式庫 (某外掛、某類包
…),也就是可以快速使⽤用的⼯工具包
• 將不同的函式庫依照資料夾分⾨門別類放置。習慣好
的話,會把該函式庫的版本號寫在資料夾上
• 把需要載⼊入的函式庫路徑寫在上⼀一層的
bootstrap.php 內統⼀一管理
• 若需要更新函式庫版本時,就將舊版移除,把新版
的資料夾移⼊入,並⼿手動更新 bootstrap.php 內的載⼊入
路徑
可能⾯面臨的問題
• 雖然所有使⽤用到的第三⽅方函式庫看似整理在 libs 資
料庫內,但卻沒有⼀一套統⼀一的管理機制:
- 需要⼿手動更新函式庫內容及載⼊入設定,愈多需要⼈人
⼯工的部份就愈容易有錯誤發⽣生的⾵風險
- 沒有相依性管理機制,在新增、更新、移除第三⽅方
函式庫時,沒有辦法確保不會發⽣生相依缺漏或衝突,
增加開發與上線過程中的⾵風險
- 沒有統⼀一的元件載⼊入策略,因此每當需要新增⼀一個
元件時,就得⼿手動修改 bootstrap 檔案,不但沒有
效率且容易出錯
傳統的套件管理
• 為了解決這樣的問題,PHP 社群曾提出 PEAR/Pyrus
專案來做 PHP 的套件管理,但經過數年的運作後宣
告失敗,因為:
- PEAR/Pyrus 所提出的套件管理⽅方案是針對整個系統
⽽而⾮非專案
- 套件設定檔編寫機制複雜,且官⽅方的審核機制過嚴
- 相較於其他程式語⾔言的套件管理⽅方式已太過陳舊,
需要有更符合現代開發流程與⼯工作習慣的套件管理
⽅方式
• PEAR/Pyrus 的失敗造成⼤大多數的 PHP 開發者常常重
覆製造輪⼦子且難以共享開發成果
現代 PHP 元件
• 把這些 libs 裡的函式庫視為 元件 (Component),也
就是⼀一連串組合過的程式碼來幫助我們解決某個特
定問題
• 從技術的⾓角度來說,可以視為相關的 Classes、
Interfaces、Traits 的組合
• 儘量以元件的概念來實作各種功能,將其他的開發
者可以依需求更容易的散佈與取⽤用
• 使⽤用 PHP 元件做開發,可以減少框架獨佔性所造成
的問題,也可以讓元件的適⽤用性有更多的可能性
PHP-FIG
• 為了解決 PHP 元件管理及散佈的問題,在 2009 年
php|tek ⼤大會上成⽴立 PHP-FIG 組織,⺫⽬目的在於制定
PHP 社群在開發元件時的規範
• 由 PHP-FIG 所推動的通⽤用元件規範,統⼀一了所有
PHP 元件的 namespace、autoload 的作法,讓所有的
元件開發者皆能依此遵循;也讓所有的元件使⽤用者
僅需學習⼀一種⽅方式就可以使⽤用任何第三⽅方元件
• ⺫⽬目前常聽到的 PSR-* 就是由 PHP-FIG 定義的規範
Composer 的興起
• 2012 年由 Nils Adermann 及 Jordi Boggiano 聯⼿手開發
了 Composer,特⾊色包括:
- 針對專案做套件相依性管理
- 採⽤用 JSON 做為設定檔編寫⽅方式
- ⽀支援 SVN、Git 等現代常⾒見的VCS 系統做為套件原
始碼管理及下載⽅方式
• ⺫⽬目標在於取代傳統⼿手動剪貼或 PEAR/Pyrus 過時的管
理⽅方式,讓所有的開發者都能透過指令很簡單的取
得/載⼊入第三⽅方元件
什麼是 Packagist?
• PHP 的元件管理中⼼心,開發者在⾃自⼰己的 Github 上儲
放源始碼,並到 Packagist 上登記,就可以讓其他開
發者取得該元件
• 在 Packagist 上⾯面可以查詢到所有開放源始碼的第三
⽅方元件的版本資訊、元件相依性及安裝/下載數等統
計資訊
• Packagist 讓 PHP 元件的散佈與更新變得容易且⽅方便
• 簡⽽而⾔言之,Packagist 是尋找元件的地⽅方;Composer
是安裝元件的⼯工具
Composer	
  安裝
使⽤用 Composer 的最低需求
composer.phar
執⾏行檔
+ +
git
版本控制
php 5.3.2
(openssl extension)
*nix 環境安裝
curl	
  -­‐sS	
  https://getcomposer.org/installer	
  |	
  php
php	
  -­‐r	
  "readfile('https://getcomposer.org/installer');"	
  |	
  php
installer	
  會檢查系統環境是否符合	
  Composer	
  的最低需
求。若不符合的話會提⽰示修正;若符合的話,就會⾃自動下載	
  
composer.phar	
  到當前⼯工作⺫⽬目錄下
若系統沒有	
  CURL	
  的話,可以⽤用以下指令取代
mv	
  composer.phar	
  /usr/local/bin/composer
將	
  composer	
  變成系統全域指令
Windows 環境安裝
• Composer 提供了 Windows 版安裝程式,直接下載
https://getcomposer.org/Composer-­‐
Setup.exe 後,依照安裝程式步驟提⽰示安裝即可
• 由於 Composer 相依於 PHP,因此在安裝過程中會
尋問 php.exe 所在位置,請將本地端 PHP 安裝位置
提供給安裝程式設定即可
• 請務必注意指定給 Composer 的 PHP 版本、php.ini
設定且正確掛載 Composer 所需的 extension
隨⾝身版 (本地端安裝)
• 其實 Composer 是⼀一個 PHP binary 檔,也就是所謂
的 PHAR (PHP archive)。所以只要有 PHP Runtime,
其實 Composer 本⾝身可以做到隨⾝身版 (免安裝) 的效
果
• 可以直接將 composer.phar 放置在專案根⺫⽬目錄底下,
只是在輸⼊入指令時要改成:
php	
  composer.phar	
  {command}
composer	
  [list]
• 顯⽰示 composer 所有的指令
• 若在下指令的時候,突然忘了指令的全名時,可以
先⽤用這個指令查詢⼀一下,再重新輸⼊入指令即可
• 範例:
$	
  composer	
  
$	
  composer	
  list
composer	
  {cmd}	
  -­‐-­‐help	
  
• 部份 composer 指令可接受額外參數,若⼀一時忘記參
數的使⽤用⽅方式時,可先加 --help 於該指令後⽅方,即
顯⽰示該指令的說明⽂文件,待確認⽤用法後再重新輸⼊入
指令
• 範例:
$	
  composer	
  list	
  -­‐-­‐help	
  
$	
  composer	
  install	
  -­‐-­‐help
$	
  composer	
  help	
  list	
  
$	
  composer	
  help	
  install
composer	
  self-­‐update
• Composer 本⾝身更新⾮非常頻繁,除了增加新功能、修
正錯誤外,也在逐步改善效能不彰的問題
• 請務必養成定期更新 Composer 的習慣,若超過 30
天沒有更新,在使⽤用 Composer 指令時,也會有更
新提⽰示
• 範例:
$	
  composer	
  self-­‐update	
  
$	
  composer	
  selfupdate
$	
  [sudo]	
  composer	
  self-­‐update
現在就更新!
Composer	
  基礎操作
啟始⼀一個 Composer 專案
• 在 Composer 的世界裡,所有的專案都是⼀一個「套
件」,所以即便我們只是要「使⽤用」第三⽅方套件,
也必需先啟始⼀一個套件專案
• 所有的 Composer 專案都依賴 composer.json 這個
config 檔來定義專案設定值。因此要啟始⼀一個專案就
得先寫 composer.json 檔
• Composer 本⾝身有提供指令可以⽤用互動問答的⽅方式來
幫助我們產⽣生 composer.json。⽤用這種⽅方式可以⽐比較
輕鬆的撰寫專案設定檔
composer	
  init
• 由 Composer 以互動問答的⽅方式,幫助我們定義專
案內各項必填設定值,快速地產⽣生 composer.json 檔
• ⼀一個 composer.json ⾄至少需要填寫:套件名稱、套件
描述、作者資訊、最低穩定度、套件類型、授權、
相依性
• 範例:
$	
  composer	
  init
如何尋找元件?
所有 PHP 元件都統⼀一登記在 Packagist 上
如何決定版本號?
• Composer 建議並希望所有的套件版本號都可以依循
SemVer 的規範。因此如何決定 composer.json 內的版
本號要怎麼寫,就得先了解什麼是 SemVer?
• SemVer 的全名是 SemanticVersioning,其內容是提供
開發者⼀一個訂定軟體釋出時版本號的⼀一種規範,讓
版本號不再只是隨開發者⾼高興來定義,⽽而是讓版本
號本⾝身即具備意義
• 更多 SemVer 的全⽂文可參考:http://semver.org/
X Y Z
Major
Breaks
Minor
Features
Patch
Fixes
. .
版本號演進
0.1.0 0.2.0 1.0.1 1.1.0
0.1.1 1.0.0 1.0.2 2.0.0
開發版	
  
第⼀一次釋出
第⼀一次釋出	
  
的修正版
開發版	
  
重⼤大更新
穩定版	
  
第⼀一版釋出
第⼀一次	
  
穩定版修正
第⼆二次	
  
穩定版修正
穩定版	
  
新功能推出
穩定版	
  
重⼤大更新
Version Constraints
Exact Match 1.2.3 1.2.3
Wildcard Range 1.0.* >=1.0 且 <1.1
Hyphen Range 1.0 - 2.0 >=1.0.0 且 <2.1
Tilde Operator ~1.2 >=1.2 且<2.0
Caret Operator
^1.2.3
^0.3
>=1.2.3 且 <2.0
>=0.3.0 且 <0.4.0
Stability Flags
@stable
@dev
dev > alpha > beta > RC > stable
預設抓 stable,但可⽤用 @ 指定
填寫版本號的忠告
• 務必遵循 SemVer 規範
• 絕對不要⽤用 dev-master 或是其他不穩定的版本
• 養成習慣上 Packagist 上查版本號,確認版本需求後
再填 (若是該 Package 遵循 SemVer 的話,可使⽤用
Caret Operator)
• 若對填寫版本號不是這麼有保握的話,可以先⽤用
Packagist Semver Checker 驗證⼀一下您的寫法
• 每次更動 composer.json 內容後,⽤用 composer
validate 檢查
composer	
  validate
• 為了確保 composer.json 內的格式是正確的,
Composer 提供了 validate 這個指令協助我們檢測
• 每次更動 composer.json 後,養成好習慣先⽤用這個指
令確保沒有錯誤後再執⾏行其他指令
• 範例:
$	
  composer	
  validate
composer	
  install
• 套件安裝指令,install 指令會先檢查 composer.lock
是否存在?
- 若不存在的話,就跑 composer	
  update 來產⽣生⼀一個
- 若存在的話,依照 lock 裡的 package 版本來安裝
• 所有的套件會下載⾄至 /vendor 資料夾底下,並產⽣生
Composer 的 classmap 做為套件載⼊入的對照表
• 範例:
$	
  composer	
  install
使⽤用 Composer ⾃自動載⼊入
• 只要是透過 Composer 安裝的套件,就可以透過
Composer ⾃自動載⼊入,不再需要⾃自⾏行 include 或
require 了!
• 要讓 Composer 幫我們做⾃自動載⼊入,只需要在我們
的程式最頂端加上⼀一⾏行,引⼊入 Composer 的
autoload.php 即可:
require	
  __DIR__.'/vendor/autoload.php';
Composer	
  進階技巧
composer.json
{	
  
	
   "name":	
  "{vendor}/{package-­‐name}",	
  
	
   "description":	
  "{package	
  description}",	
  
	
   "keywords":	
  ["{keyword1}",	
  "{keyword2}"],	
  
	
   "license":	
  "{license}",	
  
	
   "type":	
  "project",	
  
	
   "require":	
  {	
  
	
   	
   "{vendor/package}":	
  "{version}"	
  
	
   },	
  
	
   "require-­‐dev":	
  {	
  
	
   	
   "{vendor/package}":	
  "{version}"	
  
	
   },	
  
	
   "autoload":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  /*	
  套件載⼊入設定	
  */	
  
	
   },	
  
	
  	
  	
  	
  "autoload-­‐dev":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  /*	
  套件載⼊入設定	
  */	
  
	
  	
  	
  	
  },	
  
}
composer.lock
• 每⼀一次 Composer 在解決完套件相依性後,會將最
終決定安裝的版本號寫⼊入 composer.lock 檔內,若
把 lock 檔打開來看,會發現裡⾯面是⼀一個很⼤大的套件
對照表
• 務必把 lock 檔與 json 檔⼀一同放進版本控制系統,隨
著原始碼發佈給專案的其他開發者,⽽而其他開發者
拿到 lock 檔後,只要⽤用 composer	
  install 就可以
安裝與⾃自⼰己⼀一模⼀一樣的套件版本,⽽而不會有套件衝
突或不⼀一致的情況
composer	
  show
• 可以查詢套件的版本及相關資訊
• -­‐-­‐installed	
  (-­‐i) 可以列出⺫⽬目前專案裡安裝的所
有相依套件資訊
• 範例:
$	
  composer	
  show	
  monolog/monolog	
  
$	
  composer	
  show	
  -­‐-­‐installed	
  
$	
  composer	
  show	
  -­‐i
scripts 區段
• Composer 在執⾏行過程中有數個階段,為了讓開發者
在各階段可以有執⾏行其他指令的機會,Composer 設
計了⼀一系列的 event hook 供開發者使⽤用
• 套件開發者可以設定在不同的事件發⽣生時,可以呼
叫 Composer 執⾏行指定的動作。這些動作都被紀錄
在 composer.json 裡的 scripts 區段
• 若因為任何原因⽽而需要強制執⾏行 scripts 區段裡的某
個事件指令時,可以透過 composer	
  run-­‐script
來呼叫 scripts 裡的動作
composer	
  run-­‐script
• 執⾏行 composer.json 內 scripts 區段的各個指令,執⾏行
指令前需指定要執⾏行的指令為何?
• 範例:
$	
  composer	
  run-­‐script	
  post-­‐root-­‐package-­‐install	
  
$	
  composer	
  run-­‐script	
  post-­‐create-­‐project-­‐cmd	
  
$	
  composer	
  run-­‐script	
  post-­‐install-­‐cmd
⾃自動載⼊入的魔法
• 由於 composer.json 裡說明了該套件的載⼊入⽅方式,因
此 Composer 就知道該怎麼載⼊入對應的類別
• 為了加速 Composer 載⼊入各類別的檔案,Composer
會預先將所有的類別與檔案的對照表,寫⼊入 vendor/
composer/autoload_*.php 的檔案內
• 所以當我們直接 require	
  __DIR__.'/vendor/
autoload.php'; 時,就已經載⼊入 Composer 的⾃自
動載⼊入類別,後續的類別載⼊入,就可以統⼀一交給
Composer 處理
PSR-4
• 雖然 PHP 的⾃自動載⼊入設計可以讓開發者⾃自⾏行決定類
別該怎麼被載⼊入,但若每⼀一個套件的載⼊入⽅方式都不
同的話,對套件的使⽤用者來說是⾮非常痛苦的
• 由 PHP-FIG 定義的 PSR 系列規範中,PSR-4 就定義
了套件該怎麼命名 namespace,及各類別與資料夾的
放置⽅方式,透過統⼀一的規範下,Composer 僅需實作
相容於 PSR-4 的⾃自動載⼊入機制,就可以幫我們載⼊入
所有的類別
• PSR-4 的 autoloading 策略是同步 PHP namespace 及
Class 放置於資料夾的對應做載⼊入,概念簡單且易
懂!
更新/安裝新套件
• 專案所使⽤用到的相依套件會不定期更新,若要取得
最新版的套件,則需要執⾏行更新套件指令
• 若專案需要使⽤用到額外的套件時,也需要透過更新
套件指令,除了升級現有套件外,也⼀一併安裝新的
套件
• Composer 提供 update 這個更新指令,這個指令會
重新分析 composer.json 裡的套件相依性,除了安裝
新的套件外,也會更新現有的套件。所有動作完成
後,也會更新 composer.lock 檔並更新 autoload 裡的
classmap
composer	
  update
• 套件更新指令,Composer 會先檢查 composer.json
檔的內容,從中取得版本設定,並依照相依性判定
要安裝的最終版本:
- 判定後就會安裝所決定的所有套件
- 安裝完後會更新 composer.lock
• 範例:
$	
  composer	
  update
該⽤用 install 還是 update
• 只要專案內已經有 composer.lock 檔、⽽而⼜又不需要更
新/安裝套件時,就是使⽤用 composer	
  install
• 只有在安裝新套件、需要更新套件版本時,才需要
使⽤用 composer	
  update 指令。這通常都是專案核⼼心
開發/管理者才需要做的動作
• 由於 composer install 會直接使⽤用 lock 檔內紀錄
的套件直接安裝,跳過解析套件相依性的過程,且
安裝時也會儘量⽤用快取過的檔案來安裝。因此在記
憶體使⽤用、運作效能及安裝速度上都會有很⼤大的提
升!
Global	
  套件
composer	
  global
• ⼤大多數的 Composer 元件是獨⽴立安裝於各別專案
內,但 Composer 元件也可以做為散佈指令列⼯工具
的⼀一種⽅方式。
• 透過將元件以 global 的⽅方式安裝,Composer 會將該
元件安裝在 COMPOSER_HOME ⺫⽬目錄底下,將
COMPOSER_HOME/vendor/bin 加⼊入 PATH 後,即可
全域使⽤用該指令
• 範例:
$	
  composer	
  global	
  reguire	
  vender/package:version
$	
  composer	
  global	
  require	
  laravel/installer:"^1.2"
(安裝	
  laravel-­‐installer)
★ 套件會安裝⾄至 COMPSER_HOME:
  Windows 位置:C:UsersUSERNAMEAppDataRoamingComposervendorbin
  *nix 位置:~/.composer/vendor/bin
設定環境變數 (PATH)
• 需要在作業系統裡將 Composer Global Package 的路
徑設定⾄至環境變數內,這樣當我們執⾏行指令時,作
業系統才能知道該去哪裡尋找我們要執⾏行的程式
• 環境變數裡可以設定多個路徑位置,作業系統會依
照填寫路徑的順序逐⼀一去尋找指令程式。若都找不
到才會回傳錯誤
• 各家作業系統設定⽅方式略有不同,請參考各作業系
統環境變數設定的教學。若使⽤用 wagon 的話,在
cmder 啟動時會⾃自動載⼊入搭配預載 Composer 的
Global Package 位置進環境變數內
export	
  PATH=$PATH:~/.composer/vendor/bin
(*nix	
  作業系統在	
  .bashrc	
  裡加⼊入	
  PATH)
★ $PATH 的前後順序是有影響的,請依需求⾃自⾏行調整
@set	
  COMPOSER_HOME=%WAGON_ROOT%composer	
  
@set	
  PATH=%COMPOSER_HOME%vendorbin
(wagon	
  則是在	
  wagoncmdervendorinit.bat	
  裡設定)
$	
  composer	
  global	
  update
(⽇日後要更新	
  Global	
  套件時)
單元總結
• 在這個單元裡我們學到了些什麼?
- PHP 元件與套件管理的需求
- Composer 的安裝⽅方式
- Composer 基礎操作與指令
- Composer 進階技巧
- Composer Global 套件
Q & A
歡迎提問討論

More Related Content

What's hot

[Community Open Camp] 給 PHP 開發者的 VS Code 指南
[Community Open Camp] 給 PHP 開發者的 VS Code 指南[Community Open Camp] 給 PHP 開發者的 VS Code 指南
[Community Open Camp] 給 PHP 開發者的 VS Code 指南Shengyou Fan
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesChris Simmonds
 
Composer 從入門到實戰
Composer 從入門到實戰Composer 從入門到實戰
Composer 從入門到實戰Shengyou Fan
 
Prerequisite knowledge for shared memory concurrency
Prerequisite knowledge for shared memory concurrencyPrerequisite knowledge for shared memory concurrency
Prerequisite knowledge for shared memory concurrencyViller Hsiao
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管Will Huang
 
Git Started With Git
Git Started With GitGit Started With Git
Git Started With GitNick Quaranto
 
NGINX: Basics & Best Practices - EMEA Broadcast
NGINX: Basics & Best Practices - EMEA BroadcastNGINX: Basics & Best Practices - EMEA Broadcast
NGINX: Basics & Best Practices - EMEA BroadcastNGINX, Inc.
 
Git Tutorial I
Git Tutorial IGit Tutorial I
Git Tutorial IJim Yeh
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介Yuma Ohgami
 
COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺hydai
 
Go 語言基礎簡介
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介Bo-Yi Wu
 
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具Will Huang
 
Introducing OpenHPC Cross Platform Provisioning Assembly for Warewulf
Introducing OpenHPC Cross Platform Provisioning Assembly for WarewulfIntroducing OpenHPC Cross Platform Provisioning Assembly for Warewulf
Introducing OpenHPC Cross Platform Provisioning Assembly for WarewulfNaohiro Tamura
 
資訊安全入門
資訊安全入門資訊安全入門
資訊安全入門Tyler Chen
 
Getting Git Right
Getting Git RightGetting Git Right
Getting Git RightSven Peters
 

What's hot (20)

KAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfKAFKA 3.1.0.pdf
KAFKA 3.1.0.pdf
 
[Community Open Camp] 給 PHP 開發者的 VS Code 指南
[Community Open Camp] 給 PHP 開發者的 VS Code 指南[Community Open Camp] 給 PHP 開發者的 VS Code 指南
[Community Open Camp] 給 PHP 開發者的 VS Code 指南
 
Booting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot imagesBooting Android: bootloaders, fastboot and boot images
Booting Android: bootloaders, fastboot and boot images
 
Ceph issue 해결 사례
Ceph issue 해결 사례Ceph issue 해결 사례
Ceph issue 해결 사례
 
Composer 從入門到實戰
Composer 從入門到實戰Composer 從入門到實戰
Composer 從入門到實戰
 
Prerequisite knowledge for shared memory concurrency
Prerequisite knowledge for shared memory concurrencyPrerequisite knowledge for shared memory concurrency
Prerequisite knowledge for shared memory concurrency
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管
 
Git Started With Git
Git Started With GitGit Started With Git
Git Started With Git
 
NGINX: Basics & Best Practices - EMEA Broadcast
NGINX: Basics & Best Practices - EMEA BroadcastNGINX: Basics & Best Practices - EMEA Broadcast
NGINX: Basics & Best Practices - EMEA Broadcast
 
Git Tutorial I
Git Tutorial IGit Tutorial I
Git Tutorial I
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
 
COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺
 
Go 語言基礎簡介
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介
 
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
 
Introducing OpenHPC Cross Platform Provisioning Assembly for Warewulf
Introducing OpenHPC Cross Platform Provisioning Assembly for WarewulfIntroducing OpenHPC Cross Platform Provisioning Assembly for Warewulf
Introducing OpenHPC Cross Platform Provisioning Assembly for Warewulf
 
Build Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratchBuild Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratch
 
資訊安全入門
資訊安全入門資訊安全入門
資訊安全入門
 
Introduction to Makefile
Introduction to MakefileIntroduction to Makefile
Introduction to Makefile
 
Getting Git Right
Getting Git RightGetting Git Right
Getting Git Right
 
Git
GitGit
Git
 

Viewers also liked

開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作Shengyou Fan
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
REST to RESTful Web Service
REST to RESTful Web ServiceREST to RESTful Web Service
REST to RESTful Web Service家弘 周
 
wagon - 免安裝可攜的 Laravel 開發環境
wagon - 免安裝可攜的 Laravel 開發環境wagon - 免安裝可攜的 Laravel 開發環境
wagon - 免安裝可攜的 Laravel 開發環境Shengyou Fan
 
成為全能 php 攻城獅
成為全能 php 攻城獅成為全能 php 攻城獅
成為全能 php 攻城獅Shengyou Fan
 
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者Shengyou Fan
 
[Modern Web Conf 2015] 給 PHP 開發者的 Composer 錦囊
[Modern Web Conf 2015] 給 PHP 開發者的 Composer 錦囊[Modern Web Conf 2015] 給 PHP 開發者的 Composer 錦囊
[Modern Web Conf 2015] 給 PHP 開發者的 Composer 錦囊Shengyou Fan
 
選一個框架當好朋友,讓您成為開心攻城獅
選一個框架當好朋友,讓您成為開心攻城獅選一個框架當好朋友,讓您成為開心攻城獅
選一個框架當好朋友,讓您成為開心攻城獅Shengyou Fan
 
DevOps叢林裡的小隊游擊戰術 (@ iThome DevOps 2015)
DevOps叢林裡的小隊游擊戰術 (@ iThome DevOps 2015)DevOps叢林裡的小隊游擊戰術 (@ iThome DevOps 2015)
DevOps叢林裡的小隊游擊戰術 (@ iThome DevOps 2015)Chen Cheng-Wei
 
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)Chen Cheng-Wei
 
應用程式佈署
應用程式佈署應用程式佈署
應用程式佈署Shengyou Fan
 

Viewers also liked (20)

開發環境建置
開發環境建置開發環境建置
開發環境建置
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
工作坊簡介
工作坊簡介工作坊簡介
工作坊簡介
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
整合 Open ID
整合 Open ID整合 Open ID
整合 Open ID
 
使用者認證
使用者認證使用者認證
使用者認證
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
工作坊總結
工作坊總結工作坊總結
工作坊總結
 
REST to RESTful Web Service
REST to RESTful Web ServiceREST to RESTful Web Service
REST to RESTful Web Service
 
wagon - 免安裝可攜的 Laravel 開發環境
wagon - 免安裝可攜的 Laravel 開發環境wagon - 免安裝可攜的 Laravel 開發環境
wagon - 免安裝可攜的 Laravel 開發環境
 
成為全能 php 攻城獅
成為全能 php 攻城獅成為全能 php 攻城獅
成為全能 php 攻城獅
 
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
[PHPConf Taiwan 2015] 跟著 Laravel 5.1 一起成為更好的 PHP 開發者
 
[Modern Web Conf 2015] 給 PHP 開發者的 Composer 錦囊
[Modern Web Conf 2015] 給 PHP 開發者的 Composer 錦囊[Modern Web Conf 2015] 給 PHP 開發者的 Composer 錦囊
[Modern Web Conf 2015] 給 PHP 開發者的 Composer 錦囊
 
選一個框架當好朋友,讓您成為開心攻城獅
選一個框架當好朋友,讓您成為開心攻城獅選一個框架當好朋友,讓您成為開心攻城獅
選一個框架當好朋友,讓您成為開心攻城獅
 
DevOps叢林裡的小隊游擊戰術 (@ iThome DevOps 2015)
DevOps叢林裡的小隊游擊戰術 (@ iThome DevOps 2015)DevOps叢林裡的小隊游擊戰術 (@ iThome DevOps 2015)
DevOps叢林裡的小隊游擊戰術 (@ iThome DevOps 2015)
 
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
 
應用程式佈署
應用程式佈署應用程式佈署
應用程式佈署
 

Similar to Composer 套件管理

Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
Package安裝與使用
Package安裝與使用Package安裝與使用
Package安裝與使用Shengyou Fan
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorialazole Lai
 
GNU Autoconf / Automake #1
GNU Autoconf / Automake #1GNU Autoconf / Automake #1
GNU Autoconf / Automake #1imacat .
 
Firefox OS Overview
Firefox OS OverviewFirefox OS Overview
Firefox OS OverviewYan-ren Tsai
 
GNU Autoconf / Automake #4
GNU Autoconf / Automake #4GNU Autoconf / Automake #4
GNU Autoconf / Automake #4imacat .
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索Will Huang
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩Wen-Tien Chang
 
基于Symfony框架下的快速企业级应用开发
基于Symfony框架下的快速企业级应用开发基于Symfony框架下的快速企业级应用开发
基于Symfony框架下的快速企业级应用开发mysqlops
 
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)My own sweet home!
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repoWeizhong Yang
 
使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率Zhen Li
 
使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率Zhen Li
 
自动生成 Makefile 的全过程详解!
自动生成 Makefile 的全过程详解!自动生成 Makefile 的全过程详解!
自动生成 Makefile 的全过程详解!hik_lhz
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略Will Huang
 
Workflow Overview
Workflow OverviewWorkflow Overview
Workflow OverviewKevin Cao
 
程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8Shu-Yu Fu
 
Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Will Huang
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛Edward Kuo
 
Flex 3 Cookbook 中文版V1
Flex 3 Cookbook 中文版V1Flex 3 Cookbook 中文版V1
Flex 3 Cookbook 中文版V1yiditushe
 

Similar to Composer 套件管理 (20)

Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
Package安裝與使用
Package安裝與使用Package安裝與使用
Package安裝與使用
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorial
 
GNU Autoconf / Automake #1
GNU Autoconf / Automake #1GNU Autoconf / Automake #1
GNU Autoconf / Automake #1
 
Firefox OS Overview
Firefox OS OverviewFirefox OS Overview
Firefox OS Overview
 
GNU Autoconf / Automake #4
GNU Autoconf / Automake #4GNU Autoconf / Automake #4
GNU Autoconf / Automake #4
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
 
基于Symfony框架下的快速企业级应用开发
基于Symfony框架下的快速企业级应用开发基于Symfony框架下的快速企业级应用开发
基于Symfony框架下的快速企业级应用开发
 
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)開放原始碼 Ch2.1   app - oss - oss ide (ver1.2)
開放原始碼 Ch2.1 app - oss - oss ide (ver1.2)
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repo
 
使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率
 
使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率使用Samba提升linux平台开发效率
使用Samba提升linux平台开发效率
 
自动生成 Makefile 的全过程详解!
自动生成 Makefile 的全过程详解!自动生成 Makefile 的全过程详解!
自动生成 Makefile 的全过程详解!
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略
 
Workflow Overview
Workflow OverviewWorkflow Overview
Workflow Overview
 
程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8程式設計師的自我修養 Chapter 8
程式設計師的自我修養 Chapter 8
 
Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
 
Flex 3 Cookbook 中文版V1
Flex 3 Cookbook 中文版V1Flex 3 Cookbook 中文版V1
Flex 3 Cookbook 中文版V1
 

More from Shengyou Fan

[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式Shengyou Fan
 
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...Shengyou Fan
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀Shengyou Fan
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能Shengyou Fan
 
How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023Shengyou Fan
 
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀Shengyou Fan
 
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台Shengyou Fan
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇Shengyou Fan
 
Using the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your DatabaseUsing the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your DatabaseShengyou Fan
 
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具Shengyou Fan
 
[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園Shengyou Fan
 
初探 Kotlin Multiplatform
初探 Kotlin Multiplatform初探 Kotlin Multiplatform
初探 Kotlin MultiplatformShengyou Fan
 
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率Shengyou Fan
 
[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南Shengyou Fan
 
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用Shengyou Fan
 
Composer 經典食譜
Composer 經典食譜Composer 經典食譜
Composer 經典食譜Shengyou Fan
 
老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具Shengyou Fan
 
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS AggregatorShengyou Fan
 
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON APIShengyou Fan
 
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin ServerlessShengyou Fan
 

More from Shengyou Fan (20)

[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
 
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
 
How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023
 
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
 
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
 
Using the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your DatabaseUsing the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your Database
 
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
 
[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園
 
初探 Kotlin Multiplatform
初探 Kotlin Multiplatform初探 Kotlin Multiplatform
初探 Kotlin Multiplatform
 
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
 
[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南
 
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
 
Composer 經典食譜
Composer 經典食譜Composer 經典食譜
Composer 經典食譜
 
老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具
 
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
 
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
 
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
 

Composer 套件管理

  • 1. Composer 套件管理 范聖佑 Shengyou Fan 新北市樹林國⼩小 (2015/07/06) 適 ⽤用 5.1 版
  • 3. 現代  PHP  元件   與  Composer  套件管理
  • 4. 常⾒見的 PHP 開發架構 瀏覽網⾴頁 使⽤用者端 HTTP 伺服器 網站根⺫⽬目錄 index.php posts.php inc/ libs/ 共⽤用設定檔 應⽤用程式類別 函式庫 A 函式庫 B classes/ bootstrap.php 依 URL 對應 ⾄至各 php 檔案
  • 5. libs 資料夾 • 通常放從 某來源 拿到的 某函式庫 (某外掛、某類包 …),也就是可以快速使⽤用的⼯工具包 • 將不同的函式庫依照資料夾分⾨門別類放置。習慣好 的話,會把該函式庫的版本號寫在資料夾上 • 把需要載⼊入的函式庫路徑寫在上⼀一層的 bootstrap.php 內統⼀一管理 • 若需要更新函式庫版本時,就將舊版移除,把新版 的資料夾移⼊入,並⼿手動更新 bootstrap.php 內的載⼊入 路徑
  • 6. 可能⾯面臨的問題 • 雖然所有使⽤用到的第三⽅方函式庫看似整理在 libs 資 料庫內,但卻沒有⼀一套統⼀一的管理機制: - 需要⼿手動更新函式庫內容及載⼊入設定,愈多需要⼈人 ⼯工的部份就愈容易有錯誤發⽣生的⾵風險 - 沒有相依性管理機制,在新增、更新、移除第三⽅方 函式庫時,沒有辦法確保不會發⽣生相依缺漏或衝突, 增加開發與上線過程中的⾵風險 - 沒有統⼀一的元件載⼊入策略,因此每當需要新增⼀一個 元件時,就得⼿手動修改 bootstrap 檔案,不但沒有 效率且容易出錯
  • 7. 傳統的套件管理 • 為了解決這樣的問題,PHP 社群曾提出 PEAR/Pyrus 專案來做 PHP 的套件管理,但經過數年的運作後宣 告失敗,因為: - PEAR/Pyrus 所提出的套件管理⽅方案是針對整個系統 ⽽而⾮非專案 - 套件設定檔編寫機制複雜,且官⽅方的審核機制過嚴 - 相較於其他程式語⾔言的套件管理⽅方式已太過陳舊, 需要有更符合現代開發流程與⼯工作習慣的套件管理 ⽅方式 • PEAR/Pyrus 的失敗造成⼤大多數的 PHP 開發者常常重 覆製造輪⼦子且難以共享開發成果
  • 8. 現代 PHP 元件 • 把這些 libs 裡的函式庫視為 元件 (Component),也 就是⼀一連串組合過的程式碼來幫助我們解決某個特 定問題 • 從技術的⾓角度來說,可以視為相關的 Classes、 Interfaces、Traits 的組合 • 儘量以元件的概念來實作各種功能,將其他的開發 者可以依需求更容易的散佈與取⽤用 • 使⽤用 PHP 元件做開發,可以減少框架獨佔性所造成 的問題,也可以讓元件的適⽤用性有更多的可能性
  • 9. PHP-FIG • 為了解決 PHP 元件管理及散佈的問題,在 2009 年 php|tek ⼤大會上成⽴立 PHP-FIG 組織,⺫⽬目的在於制定 PHP 社群在開發元件時的規範 • 由 PHP-FIG 所推動的通⽤用元件規範,統⼀一了所有 PHP 元件的 namespace、autoload 的作法,讓所有的 元件開發者皆能依此遵循;也讓所有的元件使⽤用者 僅需學習⼀一種⽅方式就可以使⽤用任何第三⽅方元件 • ⺫⽬目前常聽到的 PSR-* 就是由 PHP-FIG 定義的規範
  • 10. Composer 的興起 • 2012 年由 Nils Adermann 及 Jordi Boggiano 聯⼿手開發 了 Composer,特⾊色包括: - 針對專案做套件相依性管理 - 採⽤用 JSON 做為設定檔編寫⽅方式 - ⽀支援 SVN、Git 等現代常⾒見的VCS 系統做為套件原 始碼管理及下載⽅方式 • ⺫⽬目標在於取代傳統⼿手動剪貼或 PEAR/Pyrus 過時的管 理⽅方式,讓所有的開發者都能透過指令很簡單的取 得/載⼊入第三⽅方元件
  • 11. 什麼是 Packagist? • PHP 的元件管理中⼼心,開發者在⾃自⼰己的 Github 上儲 放源始碼,並到 Packagist 上登記,就可以讓其他開 發者取得該元件 • 在 Packagist 上⾯面可以查詢到所有開放源始碼的第三 ⽅方元件的版本資訊、元件相依性及安裝/下載數等統 計資訊 • Packagist 讓 PHP 元件的散佈與更新變得容易且⽅方便 • 簡⽽而⾔言之,Packagist 是尋找元件的地⽅方;Composer 是安裝元件的⼯工具
  • 13. 使⽤用 Composer 的最低需求 composer.phar 執⾏行檔 + + git 版本控制 php 5.3.2 (openssl extension)
  • 14. *nix 環境安裝 curl  -­‐sS  https://getcomposer.org/installer  |  php php  -­‐r  "readfile('https://getcomposer.org/installer');"  |  php installer  會檢查系統環境是否符合  Composer  的最低需 求。若不符合的話會提⽰示修正;若符合的話,就會⾃自動下載   composer.phar  到當前⼯工作⺫⽬目錄下 若系統沒有  CURL  的話,可以⽤用以下指令取代 mv  composer.phar  /usr/local/bin/composer 將  composer  變成系統全域指令
  • 15. Windows 環境安裝 • Composer 提供了 Windows 版安裝程式,直接下載 https://getcomposer.org/Composer-­‐ Setup.exe 後,依照安裝程式步驟提⽰示安裝即可 • 由於 Composer 相依於 PHP,因此在安裝過程中會 尋問 php.exe 所在位置,請將本地端 PHP 安裝位置 提供給安裝程式設定即可 • 請務必注意指定給 Composer 的 PHP 版本、php.ini 設定且正確掛載 Composer 所需的 extension
  • 16. 隨⾝身版 (本地端安裝) • 其實 Composer 是⼀一個 PHP binary 檔,也就是所謂 的 PHAR (PHP archive)。所以只要有 PHP Runtime, 其實 Composer 本⾝身可以做到隨⾝身版 (免安裝) 的效 果 • 可以直接將 composer.phar 放置在專案根⺫⽬目錄底下, 只是在輸⼊入指令時要改成: php  composer.phar  {command}
  • 17. composer  [list] • 顯⽰示 composer 所有的指令 • 若在下指令的時候,突然忘了指令的全名時,可以 先⽤用這個指令查詢⼀一下,再重新輸⼊入指令即可 • 範例: $  composer   $  composer  list
  • 18. composer  {cmd}  -­‐-­‐help   • 部份 composer 指令可接受額外參數,若⼀一時忘記參 數的使⽤用⽅方式時,可先加 --help 於該指令後⽅方,即 顯⽰示該指令的說明⽂文件,待確認⽤用法後再重新輸⼊入 指令 • 範例: $  composer  list  -­‐-­‐help   $  composer  install  -­‐-­‐help $  composer  help  list   $  composer  help  install
  • 19. composer  self-­‐update • Composer 本⾝身更新⾮非常頻繁,除了增加新功能、修 正錯誤外,也在逐步改善效能不彰的問題 • 請務必養成定期更新 Composer 的習慣,若超過 30 天沒有更新,在使⽤用 Composer 指令時,也會有更 新提⽰示 • 範例: $  composer  self-­‐update   $  composer  selfupdate
  • 20. $  [sudo]  composer  self-­‐update 現在就更新!
  • 22. 啟始⼀一個 Composer 專案 • 在 Composer 的世界裡,所有的專案都是⼀一個「套 件」,所以即便我們只是要「使⽤用」第三⽅方套件, 也必需先啟始⼀一個套件專案 • 所有的 Composer 專案都依賴 composer.json 這個 config 檔來定義專案設定值。因此要啟始⼀一個專案就 得先寫 composer.json 檔 • Composer 本⾝身有提供指令可以⽤用互動問答的⽅方式來 幫助我們產⽣生 composer.json。⽤用這種⽅方式可以⽐比較 輕鬆的撰寫專案設定檔
  • 23. composer  init • 由 Composer 以互動問答的⽅方式,幫助我們定義專 案內各項必填設定值,快速地產⽣生 composer.json 檔 • ⼀一個 composer.json ⾄至少需要填寫:套件名稱、套件 描述、作者資訊、最低穩定度、套件類型、授權、 相依性 • 範例: $  composer  init
  • 25. 如何決定版本號? • Composer 建議並希望所有的套件版本號都可以依循 SemVer 的規範。因此如何決定 composer.json 內的版 本號要怎麼寫,就得先了解什麼是 SemVer? • SemVer 的全名是 SemanticVersioning,其內容是提供 開發者⼀一個訂定軟體釋出時版本號的⼀一種規範,讓 版本號不再只是隨開發者⾼高興來定義,⽽而是讓版本 號本⾝身即具備意義 • 更多 SemVer 的全⽂文可參考:http://semver.org/
  • 27. 版本號演進 0.1.0 0.2.0 1.0.1 1.1.0 0.1.1 1.0.0 1.0.2 2.0.0 開發版   第⼀一次釋出 第⼀一次釋出   的修正版 開發版   重⼤大更新 穩定版   第⼀一版釋出 第⼀一次   穩定版修正 第⼆二次   穩定版修正 穩定版   新功能推出 穩定版   重⼤大更新
  • 28. Version Constraints Exact Match 1.2.3 1.2.3 Wildcard Range 1.0.* >=1.0 且 <1.1 Hyphen Range 1.0 - 2.0 >=1.0.0 且 <2.1 Tilde Operator ~1.2 >=1.2 且<2.0 Caret Operator ^1.2.3 ^0.3 >=1.2.3 且 <2.0 >=0.3.0 且 <0.4.0 Stability Flags @stable @dev dev > alpha > beta > RC > stable 預設抓 stable,但可⽤用 @ 指定
  • 29. 填寫版本號的忠告 • 務必遵循 SemVer 規範 • 絕對不要⽤用 dev-master 或是其他不穩定的版本 • 養成習慣上 Packagist 上查版本號,確認版本需求後 再填 (若是該 Package 遵循 SemVer 的話,可使⽤用 Caret Operator) • 若對填寫版本號不是這麼有保握的話,可以先⽤用 Packagist Semver Checker 驗證⼀一下您的寫法 • 每次更動 composer.json 內容後,⽤用 composer validate 檢查
  • 30. composer  validate • 為了確保 composer.json 內的格式是正確的, Composer 提供了 validate 這個指令協助我們檢測 • 每次更動 composer.json 後,養成好習慣先⽤用這個指 令確保沒有錯誤後再執⾏行其他指令 • 範例: $  composer  validate
  • 31. composer  install • 套件安裝指令,install 指令會先檢查 composer.lock 是否存在? - 若不存在的話,就跑 composer  update 來產⽣生⼀一個 - 若存在的話,依照 lock 裡的 package 版本來安裝 • 所有的套件會下載⾄至 /vendor 資料夾底下,並產⽣生 Composer 的 classmap 做為套件載⼊入的對照表 • 範例: $  composer  install
  • 32. 使⽤用 Composer ⾃自動載⼊入 • 只要是透過 Composer 安裝的套件,就可以透過 Composer ⾃自動載⼊入,不再需要⾃自⾏行 include 或 require 了! • 要讓 Composer 幫我們做⾃自動載⼊入,只需要在我們 的程式最頂端加上⼀一⾏行,引⼊入 Composer 的 autoload.php 即可: require  __DIR__.'/vendor/autoload.php';
  • 34. composer.json {     "name":  "{vendor}/{package-­‐name}",     "description":  "{package  description}",     "keywords":  ["{keyword1}",  "{keyword2}"],     "license":  "{license}",     "type":  "project",     "require":  {       "{vendor/package}":  "{version}"     },     "require-­‐dev":  {       "{vendor/package}":  "{version}"     },     "autoload":  {                  /*  套件載⼊入設定  */     },          "autoload-­‐dev":  {                  /*  套件載⼊入設定  */          },   }
  • 35. composer.lock • 每⼀一次 Composer 在解決完套件相依性後,會將最 終決定安裝的版本號寫⼊入 composer.lock 檔內,若 把 lock 檔打開來看,會發現裡⾯面是⼀一個很⼤大的套件 對照表 • 務必把 lock 檔與 json 檔⼀一同放進版本控制系統,隨 著原始碼發佈給專案的其他開發者,⽽而其他開發者 拿到 lock 檔後,只要⽤用 composer  install 就可以 安裝與⾃自⼰己⼀一模⼀一樣的套件版本,⽽而不會有套件衝 突或不⼀一致的情況
  • 36. composer  show • 可以查詢套件的版本及相關資訊 • -­‐-­‐installed  (-­‐i) 可以列出⺫⽬目前專案裡安裝的所 有相依套件資訊 • 範例: $  composer  show  monolog/monolog   $  composer  show  -­‐-­‐installed   $  composer  show  -­‐i
  • 37. scripts 區段 • Composer 在執⾏行過程中有數個階段,為了讓開發者 在各階段可以有執⾏行其他指令的機會,Composer 設 計了⼀一系列的 event hook 供開發者使⽤用 • 套件開發者可以設定在不同的事件發⽣生時,可以呼 叫 Composer 執⾏行指定的動作。這些動作都被紀錄 在 composer.json 裡的 scripts 區段 • 若因為任何原因⽽而需要強制執⾏行 scripts 區段裡的某 個事件指令時,可以透過 composer  run-­‐script 來呼叫 scripts 裡的動作
  • 38. composer  run-­‐script • 執⾏行 composer.json 內 scripts 區段的各個指令,執⾏行 指令前需指定要執⾏行的指令為何? • 範例: $  composer  run-­‐script  post-­‐root-­‐package-­‐install   $  composer  run-­‐script  post-­‐create-­‐project-­‐cmd   $  composer  run-­‐script  post-­‐install-­‐cmd
  • 39. ⾃自動載⼊入的魔法 • 由於 composer.json 裡說明了該套件的載⼊入⽅方式,因 此 Composer 就知道該怎麼載⼊入對應的類別 • 為了加速 Composer 載⼊入各類別的檔案,Composer 會預先將所有的類別與檔案的對照表,寫⼊入 vendor/ composer/autoload_*.php 的檔案內 • 所以當我們直接 require  __DIR__.'/vendor/ autoload.php'; 時,就已經載⼊入 Composer 的⾃自 動載⼊入類別,後續的類別載⼊入,就可以統⼀一交給 Composer 處理
  • 40. PSR-4 • 雖然 PHP 的⾃自動載⼊入設計可以讓開發者⾃自⾏行決定類 別該怎麼被載⼊入,但若每⼀一個套件的載⼊入⽅方式都不 同的話,對套件的使⽤用者來說是⾮非常痛苦的 • 由 PHP-FIG 定義的 PSR 系列規範中,PSR-4 就定義 了套件該怎麼命名 namespace,及各類別與資料夾的 放置⽅方式,透過統⼀一的規範下,Composer 僅需實作 相容於 PSR-4 的⾃自動載⼊入機制,就可以幫我們載⼊入 所有的類別 • PSR-4 的 autoloading 策略是同步 PHP namespace 及 Class 放置於資料夾的對應做載⼊入,概念簡單且易 懂!
  • 41. 更新/安裝新套件 • 專案所使⽤用到的相依套件會不定期更新,若要取得 最新版的套件,則需要執⾏行更新套件指令 • 若專案需要使⽤用到額外的套件時,也需要透過更新 套件指令,除了升級現有套件外,也⼀一併安裝新的 套件 • Composer 提供 update 這個更新指令,這個指令會 重新分析 composer.json 裡的套件相依性,除了安裝 新的套件外,也會更新現有的套件。所有動作完成 後,也會更新 composer.lock 檔並更新 autoload 裡的 classmap
  • 42. composer  update • 套件更新指令,Composer 會先檢查 composer.json 檔的內容,從中取得版本設定,並依照相依性判定 要安裝的最終版本: - 判定後就會安裝所決定的所有套件 - 安裝完後會更新 composer.lock • 範例: $  composer  update
  • 43. 該⽤用 install 還是 update • 只要專案內已經有 composer.lock 檔、⽽而⼜又不需要更 新/安裝套件時,就是使⽤用 composer  install • 只有在安裝新套件、需要更新套件版本時,才需要 使⽤用 composer  update 指令。這通常都是專案核⼼心 開發/管理者才需要做的動作 • 由於 composer install 會直接使⽤用 lock 檔內紀錄 的套件直接安裝,跳過解析套件相依性的過程,且 安裝時也會儘量⽤用快取過的檔案來安裝。因此在記 憶體使⽤用、運作效能及安裝速度上都會有很⼤大的提 升!
  • 45. composer  global • ⼤大多數的 Composer 元件是獨⽴立安裝於各別專案 內,但 Composer 元件也可以做為散佈指令列⼯工具 的⼀一種⽅方式。 • 透過將元件以 global 的⽅方式安裝,Composer 會將該 元件安裝在 COMPOSER_HOME ⺫⽬目錄底下,將 COMPOSER_HOME/vendor/bin 加⼊入 PATH 後,即可 全域使⽤用該指令 • 範例: $  composer  global  reguire  vender/package:version
  • 46. $  composer  global  require  laravel/installer:"^1.2" (安裝  laravel-­‐installer) ★ 套件會安裝⾄至 COMPSER_HOME:   Windows 位置:C:UsersUSERNAMEAppDataRoamingComposervendorbin   *nix 位置:~/.composer/vendor/bin
  • 47. 設定環境變數 (PATH) • 需要在作業系統裡將 Composer Global Package 的路 徑設定⾄至環境變數內,這樣當我們執⾏行指令時,作 業系統才能知道該去哪裡尋找我們要執⾏行的程式 • 環境變數裡可以設定多個路徑位置,作業系統會依 照填寫路徑的順序逐⼀一去尋找指令程式。若都找不 到才會回傳錯誤 • 各家作業系統設定⽅方式略有不同,請參考各作業系 統環境變數設定的教學。若使⽤用 wagon 的話,在 cmder 啟動時會⾃自動載⼊入搭配預載 Composer 的 Global Package 位置進環境變數內
  • 48. export  PATH=$PATH:~/.composer/vendor/bin (*nix  作業系統在  .bashrc  裡加⼊入  PATH) ★ $PATH 的前後順序是有影響的,請依需求⾃自⾏行調整 @set  COMPOSER_HOME=%WAGON_ROOT%composer   @set  PATH=%COMPOSER_HOME%vendorbin (wagon  則是在  wagoncmdervendorinit.bat  裡設定)
  • 49. $  composer  global  update (⽇日後要更新  Global  套件時)
  • 50. 單元總結 • 在這個單元裡我們學到了些什麼? - PHP 元件與套件管理的需求 - Composer 的安裝⽅方式 - Composer 基礎操作與指令 - Composer 進階技巧 - Composer Global 套件