# 包/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 会检查是否有新的更新钩子可用。如果有,它们会依次执行。