# 包/Packages
<p class="uk-article-lead">包是 Pagekit 擴展它的功能的概念。包有主題和擴展兩種形式。</p>
[toc=2]
## 包的位置
所有包都存放在 `/packages` 目錄中,在子目錄中以提供者進行分類。
每個包都屬于一個特定的提供者 - 例如,官方所有包都屬于 `pagekit`,包括 _博客_ 擴展和_One_ 主題。
提供者名字是開發者或組織獨具代表性的標識。至少它會匹配一個 GitHub 用戶名。包名也將定義它所在目錄的名稱。
## 包的內容
一個包至少包含兩個文件:
1. 包含包的元數據的 `composer.json`,它是包的定義。
2. `index.php` 所謂的[模塊定義](modules.md),并為 Pagekit 添加實際的功能。
其余的內容則取決與包的 `類型/ type`.要了解更多關于包的實際內容,查看[主題開發教程](223157) 或者[擴展開發教程](223156)。
## 包的定義
包是由它的 `composer.json` 定義的。這個文件包含了包的名稱、由[Composer](https://getcomposer.org)安裝的潛在依賴,以及顯示在 Pagekit 商店的其他信息。
主題中的這個文件類似下面這樣:
```json
{
"name": "pagekit/theme-hello",
"type": "pagekit-theme",
"version": "0.9.0",
"title": "Hello",
"description": "A blueprint to develop your own themes.",
"license": "MIT",
"authors": [
{
"name": "Pagekit",
"email": "info@pagekit.com",
"homepage": "http://pagekit.com"
}
],
"extra": {
"image": "image.jpg"
}
}
```
關于此文件的更多信息,查看[Composer 文檔](https://getcomposer.org/doc/01-basic-usage.md).
## 安裝鉤子
包可以是已啟用、已禁用或者未安裝三種狀態。一旦改變了狀態,你可能需要修改數據庫架構或者運行其他自定義代碼。
Pagekit 通過一個自定義腳本文件提供了安裝鉤子。此文件需要先在 `composer.json` 文件中定義。
```json
"extra": {
"scripts": "scripts.php"
}
```
自定義的腳本文件必須返回一個包含回調的 PHP 數組。
```php
return [
'install' => function ($app) {},
'uninstall' => function ($app) {},
'enable' => function ($app) {},
'disable' => function ($app) {},
'updates' => [
'0.5.0' => function ($app) {},
'0.9.0' => function ($app) {}
]
];
```
### Install
在包被 _安裝了_之后執行 install 鉤子
### Uninstall
在包被_卸載了_之前執行 uninstall 鉤子
即使你的擴展已經在管理面板中被_禁用_或者_卸載_了,Pagekit 也不會修改已經創建的數據表。你必須注意你需要修改的數據庫。
### Enable
包被_啟用_后執行 enable 鉤子
### Disable
包被_禁用_前執行 disable 鉤子
### Updates
在包被啟用的前提下,Pagekit 會檢查是否有新的更新鉤子可用。如果有,它們會依次執行。