facebook / hhvm-autoload
Requires
- composer-plugin-api: ^1.0|^2.0
- hhvm: ^4.153
Requires (Dev)
- facebook/fbexpect: ^2.1
- hhvm/hacktest: ^2.0
Replaces
- dev-main / 3.x-dev
- v3.3.2
- v3.3.1
- v3.3.0
- v3.2.x-dev
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.6
- v3.1.5
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.0
- v2.0.x-dev
- v2.0.14
- v2.0.13
- v2.0.12
- v2.0.11
- v2.0.10
- v2.0.9
- v2.0.8
- v2.0.7
- v2.0.6
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0
- v1.8
- v1.7
- v1.6.9
- 1.6.8
- 1.6.7
- v1.6.6
- v1.6.5
- v1.6.4
- v1.6.3
- v1.6.2
- v1.6.1
- v1.6.0
- v1.5.4
- v1.5.3
- v1.5.2
- v1.5.1
- v1.5.0
- v1.4.3
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.1
- v1.3.0
- v1.2.1
- v1.2.0
This package is auto-updated.
Last update: 2022-07-13 01:00:16 UTC
README
HHVM上自动加载类、枚举、函数、typedefs和常量的自动加载器。
使用方法
- 添加一个
hh_autoload.json
文件(见下文部分) composer require hhvm/hhvm-autoload
- 使用
require_once (__DIR__ . '(/..)(repeat as needed)/vendor/autoload.hack');
从您的入口点函数中引入自动加载文件 - 调用
Facebook\AutoloadMap\initialize()
以将自动加载器注册到hhvm。 - 要重新生成映射,运行
vendor/bin/hh-autoload
、composer dump-autoload
或其他生成映射的命令
配置(hh_autoload.json
)
一个最小配置文件如下
{ "roots": [ "src/" ] }
这将查找位于 src/
的可自动加载的定义,并且还会查找 vendor/
。如果 vendor/
中的项目也包含 hh_autoload.json
文件,则会处理这些项目。
以前我们也支持没有 hh_autoload.json
的项目,通过模拟Composer的自动加载行为,但我们不再这样做,因为那主要适用于HHVM无法解析的PHP文件。
以下设置是可选的
"extraFiles": ["file1.hack"]
- 不应自动加载,但应由vendor/autoload.hack
通过require()
引入的文件。这应该比在Composer下更少需要。"includeVendor": false
- 不要在vendor/autoload.hack
中包含vendor/
定义"devRoots": [ "path/", ...]
- 仅在开发模式下包含的附加根目录,而不是作为依赖项安装时"relativeAutoloadRoot": false
- 不要使用相对于__DIR__
的路径进行自动加载。相反,在构建自动加载映射时使用包含hh_autoload.json
的文件夹的路径。"failureHandler:" classname<Facebook\AutoloadMap\FailureHandler>
- 使用指定的类来处理不是映射的定义。默认为无。"devFailureHandler": classname<Facebook\AutoloadMap\FailureHandler>
- 使用不同的处理器用于开发环境。默认与failureHandler
相同。"parser:" any of [ext-factparse]"
- 选择要使用的解析器,但只有一个有效选项。默认为合理的解析器。"useFactsIfAvailable": false
- 使用 ext-facts(HH\Facts...)来支持 Facebook\AutoloadMap\Generated\map() 而不是 codegenned 字典。有关此模式的信息,请参阅 使用 HH\Facts。
开发中(失败处理器)使用
当你添加、删除或移动定义时,有几种选择可用
- 运行
composer dump-autoload
来重新生成映射 - 运行
vendor/bin/hh-autoload
来更快地重新生成映射 - 指定
devFailureHandler
为Facebook\AutoloadMap\HHClientFallbackHandler
- 指定
Facebook\AutoloadMap\FailureHandler
的自定义子类 - 使用文件系统监控工具,例如 watchman,在必要时调用上述命令之一。
Facebook\AutoloadMap\HHClientFallbackHandler
对于 Hack 开发来说可能是最方便的。
HHClientFallbackHandler
如果你正在使用 Hack,这个处理程序几乎在所有情况下都可以消除手动重建映射的需求。
它会向 hh_client
请求映射中不存在的定义,并具有以下附加行为
- 如果
CI
、CONTINUOUS_INTEGRATION
或TRAVIS
环境变量设置为真值,则该处理程序将被禁用;这不是生产环境的推荐做法,你可能希望你的自动化测试环境反映生产环境 - 结果将同时缓存在 APC 和 vendor/ 目录中的一个文件中,如果 vendor/ 可写的话
你可以在子类中覆盖这些行为。
自定义处理程序
你可能需要的信息来自
Facebook\AutoloadMap\Generated\build_id()
:每次重建映射时都会重新生成的唯一 ID;它包括日期、时间和一个长的随机十六进制字符串。如果你的失败处理程序有缓存,那么当这个值发生变化时,最有可能应该将其无效化,例如,通过将其包含在缓存键中。Facebook\AutoloadMap\Generated\map()
:自动加载映射Facebook\AutoloadMap\Generated\root()
:包含项目根目录的目录,即vendor/
的父目录
与 HH\Facts 一起使用
HHVM 4.109 引入了 ext-facts 和 ext-watchman。与静态预构建的自动加载程序(它内置在一个 仓库授权 构建中)不同,这个本地自动加载程序是增量工作的,适合在开发环境中自动加载。有关设置此自动加载程序的更多信息,请参阅 hhvm 4.109 的博客文章。
当使用本地自动加载程序(无论是仓库授权还是 ext-facts 自动加载程序)时,你不需要 hhvm-autoload 在运行时要求类/函数/类型/常量。如果你(以及你的供应商依赖项)没有调用 Facebook\AutoloadMap
命名空间中的任何函数,除了 Facebook\AutoloadMap\initialize()
,那么你不再需要 hhvm-autoload。在这种情况下,你可以取消此依赖项并删除对 initialize()
的调用。如果你使用其他函数,如 Facebook\AutoloadMap\Generated\map()
,你仍然需要 hhvm-autoload 生成的 vendor/autoload.hack 文件。
Hhvm-autoload 支持输出一个 vendor/autoload.hack 文件,该文件将所有查询转发到 ext-facts。《code>Facebook\AutoloadMap\Generated\map_uncached() 在此模式下始终是最新的,因为 HH\Facts
总是是最新的。《code>Facebook\AutoloadMap\Generated\map() 在请求内被缓存(由于某些代码可能依赖于从多个调用中获得相同的结果)。你可以通过在 hh_autoload.json 配置文件中添加 "useFactsIfAvailable": true
来启用此模式。Hhvm-autoload 将发出一个模拟文件而不是完整的映射。如果 HH\Facts\enabled()
返回 false,或者当将 --no-facts
传递给 vendor/bin/hh-autoload
时,则忽略此选项。我们建议在构建用于生产时传递 --no-facts
(特别是仓库授权模式)。从 HH\Facts
返回硬编码字典比询问 HH\Facts
更快。
重要提示。使用本地自动加载程序进行自动加载不尊重 hh_autoload.json。仓库授权自动加载程序允许任何代码使用任何符号。事实自动加载程序尊重 .hhvmconfig.hdf 中的配置。确保 hh_autoload.json 和 .hhvmconfig.hdf 中的配置相匹配。
它的工作原理
- 解析器(FactParse)提供了指定位置中所有Hack定义的列表
- 这被用来生成类似于类图的东西,但包括了其他类型的定义
- 该映射通过
HH\autoload_set_paths()
提供给HHVM,具体请见HHVM官方文档 - 如果已注册了本地自动加载器,则此自动加载器将有意不注册自己。因此,在repo auth模式下调用
Facebook\AutoloadMap\initialize()
或在基于事实的自动加载器注册时,该调用将不起作用。
贡献
我们欢迎GitHub问题和拉取请求,请参阅CONTRIBUTING.md以获取详细信息。
许可
hhvm-autoload遵循MIT许可证。