Конфигурационный файл
Каждый Zephir проект должен содержать конфигурационный файл config.json
. Этот файл читается компилятором Zephir всякий раз, когда компилируется расширение, либо в процессе генерации Си-кода. Это позволяет разработчику изменять расширение или поведение компилятора.
Этот файл использует формат JSON (текстовый формат обмена данными, основанный на JavaScript) в качестве формата конфигурации:
{
"namespace": "test",
"name": "Test Extension",
"description": "My amazing extension",
"author": "Tony Hawk",
"version": "1.2.0"
}
Параметры, определенные в этом файле, переопределяют любые заводские настройки, предоставляемые Zephir.
Поддерживаются следующие параметры:
api
Используется для настройки автоматически сгенерированной HTML-документации для вашего расширения. path
указывает, где создать документацию относительно корня проекта. base-url
используется для генерации файла sitemap.xml
для вашей документации. theme
используется для установки темы, используемой в сгенерированной документации (с помощью настройки name
), и любые опции, поддерживаемые темой (с помощью настройки options
). И наконец, theme-directories
используются для предоставления дополнительных путей поиска вашей темы:
{
"api": {
"path": "doc/%version%",
"base-url": "http://example.local/api/",
"theme": {
"name" : "zephir",
"options": {
"github": null,
"analytics": null,
"main_color": "#3E6496",
"link_color": "#3E6496",
"link_hover_color": "#5F9AE7"
}
},
"theme-directories": [
"my/api/themes"
]
}
}
author
Компания, разработчик, учреждение и т.д., которые разработали расширение:
{
"author": "Tony Hawk"
}
backend
Предоставляет способ настройки бэкэнда Zend Engine, используемого в вашем расширении. На данный момент поддерживается толькоtemplatepath
, который позволяет выбрать между ZendEngine2
и ZendEngine3
:
{
"backend": {
"templatepath": "ZendEngine3"
}
}
constants-sources
Чтобы импортировать только константы из исходного Си-файла в ваш проект, укажите путь к файлу в этой настройке:
{
"constants-sources": [
"utils/math_constants.h"
]
}
description
Описание расширения — любой текст, описывающий ваше расширение:
{
"description": "My amazing extension"
}
destructors
Этот параметр позволяет предоставить одну или несколько Си-функций, которые будут выполняться для определенных событий жизненного цикла расширения, в частности, RSHUTDOWN
(request
), PRSHUTDOWN
(post-request
), MSHUTDOWN
(module
), и GSHUTDOWN
(globals
). Для получения более подробной информации обратитесь к главе «Хуки жизненного цикла».
{
"destructors": [
{
"request": [
{
"include": "my/awesome/library.h",
"code": "c_function_for_shutting_down(TSRMLS_C)"
},
{
"include": "my/awful/library.h",
"code": "some_other_c_function_than_the_other_ones(TSRMLS_C)"
}
],
"post-request": [
{
"include": "my/awesome/library.h",
"code": "c_function_for_cleaning_up_after_the_response_is_sent(TSRMLS_C)"
}
],
"module": [
{
"include": "my/awesome/library.h",
"code": "release_module_deps(TSRMLS_C)"
}
],
"globals": [
{
"include": "my/awesome/library.h",
"code": "release_globals_deps(TSRMLS_C)"
}
]
}
]
}
extension-name
Базовое имя файла расширения. Оно должно следовать тем же правилам, что и настройка namespace
, которая используется как запасной вариант в случае, если эта не указана.
{
"extension-name": "test"
}
external-dependencies
Вы можете включить класс из другого пространства имён/расширения непосредственно в вашем собственном расширении, настроив его как показано здесь:
{
"external-dependencies": {
"My\\Awesome": "my/awesome/class.zep",
"My\\Awful": "my/awful/class.zep"
}
}
extra
Содержит дополнительные параметры, которые также могут быть переданы в командной строке. В настоящее время это:
export-classes
— генерирует заголовочные файлы для доступа к вашим классам из другого Си-кодаindent
— использованиетабуляции
илипробелов
для отступов в коде генерируемых файлов
{
"extra": {
"export-classes": true,
"indent": "tabs"
}
}
extra-cflags
Любые дополнительные флаги, которые вы хотите добавить в процесс компиляции:
{
"extra-cflags": "-I/usr/local/Cellar/libevent/2.0.21_1/include"
}
extra-classes
Если у вас уже есть PHP-класс, реализованный на Си, Вы можете включить его непосредственно в ваше расширение, как показано ниже:
{
"extra-classes": [
{
"header": "utls/old_c_class/class.h",
"source": "utils/old_c_class/class.c",
"init": "old_c_class",
"entry": "old_c_class_ce"
}
]
}
extra-libs
Любые дополнительные библиотеки, которые вы хотите добавить в процесс компиляции:
{
"extra-libs": "-L/usr/local/Cellar/libevent/2.0.21_1/lib -levent"
}
extra-sources
Любые дополнительные файлы, которые вы хотите добавить в процесс компиляции - каталог поиска относительно папки ext
вашего проекта:
{
"extra-sources": [
"utils/pi.c"
]
}
globals
Доступны глобальные расширения Для получения более подробной информации обратитесь к главе «Глобальные параметры расширения».
{
"globals": {
"my_setting_1": {
"type": "bool",
"default": true
},
"my_setting_2": {
"type": "int",
"default": 10
}
}
}
info
Секции phpinfo()
. За дополнительной информацией обратитесь к главе «Секции phpinfo()».
{
"info": [
{
"header": ["Directive", "Value"],
"rows": [
["setting1", "value1"],
["setting2", "value2"]
]
}
]
}
initializers
Этот параметр позволяет предоставить одну или несколько Си-функций для выполнения при определенных событиях жизненного цикла расширения - в частности, GINIT
(globals
), MINIT
(module
), и RINIT
(request
). Для получения более подробной информации обратитесь к главе «Хуки жизненного цикла».
{
"initializers": [
{
"globals": [
{
"include": "my/awesome/library.h",
"code": "setup_globals_deps(TSRMLS_C)"
}
],
"module": [
{
"include": "my/awesome/library.h",
"code": "setup_module_deps(TSRMLS_C)"
}
],
"request": [
{
"include": "my/awesome/library.h",
"code": "some_c_function(TSRMLS_C)"
},
{
"include": "my/awful/library.h",
"code": "some_other_c_function(TSRMLS_C)"
}
]
}
]
}
name
Имя расширения, используемое в скомпилированном Си коде. Может содержать только ASCII-символы:
{
"name": "test"
}
namespace
Пространство имён расширения. Это должен быть простой идентификатор, соответствующий регулярному выражению [a-zA-Z0-9\_]+
:
{
"namespace": "test"
}
optimizations
Оптимизации компилятора, которые должны быть включены или отключены в текущем проекте:
{
"optimizations": {
"static-type-inference": true,
"static-type-inference-second-pass": true,
"local-context-pass": false
}
}
optimizer-dirs
Каталоги, где находятся ваши собственные оптимизаторы. Каталог поиска находится относительно корневой папки вашего проекта:
{
"optimizer-dirs": [
"optimizers"
]
}
package-dependencies
Определение зависимостей библиотеки (ограничения версии будут проверяться с помощью pkg-config
, и может использовать один из операторов =
, >=
, <=
, или *
):
{
"package-dependencies": {
"openssl": "*",
"libpng": ">= 0.1.0",
"protobuf": "<= 2.6.1"
}
}
prototype-dir
Позволяет вам предоставить файлы прототипов, описывающие другие расширения, необходимые для сборки, которые не обязательно устанавливать на этапе сборки:
{
"prototype-dir": {
"igbinary": "prototypes",
"session": "prototypes"
}
}
requires
Позволяет вам перечислить другие расширения, необходимые для создания/использования вашего собственного:
{
"requires": {
"extensions": [
"igbinary",
"session"
]
}
}
silent
Подавляет почти весь вывод zephir
команд (аналогично -w
):
{
"silent": false
}
stubs
Эта настройка позволяет настроить способ генерации IDE заглушек. path
указывает, где должны быть созданы заглушки, а stubs-run-after-generate
указывает, следует ли автоматически (повторно) создавать заглушки, когда ваш код компилируется в Си:
{
"stubs": {
"path": "ide/%version%/%namespace%/",
"stubs-run-after-generate": false
}
}
verbose
Позволяет выводить более подробную информацию в сообщениях об ошибках при выбрасывании исключений zephir
командами. Эту настройку также можно включить с помощью -v
, или отключить с помощью -V
:
{
"verbose": false
}
version
Версия расширения. Должна соответствовать регулярному выражению [0-9]+\.[0-9]+\.[0-9]+
:
{
"version": "1.2.0"
}
warnings
Предупреждения компилятора, которые должны быть включены или отключены в текущем проекте:
{
"warnings": {
"unused-variable": true,
"unused-variable-external": false,
"possible-wrong-parameter": true,
"possible-wrong-parameter-undefined": false,
"nonexistent-function": true,
"nonexistent-class": true
}
}