hhvm / 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: 2023-09-13 03:27:26 UTC
README
HHVM上自动加载类、枚举、函数、typedef和常量的自动加载器。
使用方法
- 添加一个
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/
定义包含在vendor/autoload.hack
中"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(),而不是代码生成的字典。有关此模式的信息,请参阅使用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
环境变量设置为真值,则禁用;这是因为这不是生产环境推荐的方法,你可能希望你的自动化测试环境反映生产环境 - 如果vendor/是可写的,则结果同时在APC和一个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。与内置在repo授权构建中的静态预构建自动加载程序不同,这个本地自动加载程序是增量工作的,适合用于开发环境中的自动加载。有关设置此自动加载程序的更多信息,请参阅hhvm 4.109的博客文章。
当使用本地自动加载程序(无论是repo auth还是ext-facts自动加载程序)时,您不需要hhvm-autoload在运行时要求类/函数/类型/常量。如果您(以及您的供应商依赖项)没有调用Facebook\AutoloadMap
命名空间中的任何函数,除了Facebook\AutoloadMap\initialize()
之外,您就不需要hhvm-autoload anymore。在这种情况下,您可以删除此依赖项并删除对initialize()
的调用。如果您使用其他函数,例如Facebook\AutoloadMap\Generated\map()
,您仍然需要hhvm-autoload生成的vendor/autoload.hack文件。
Hhvm-autoload支持输出一个转发所有查询到ext-facts的vendor/autoload.hack文件。Facebook\AutoloadMap\Generated\map_uncached()
在此模式下始终是最新的,因为HH\Facts
始终是最新的。Facebook\AutoloadMap\Generated\map()
是在请求内缓存的(因为某些代码可能依赖于从多个调用中获取相同的结果)。您可以通过将"useFactsIfAvailable": true
添加到hh_autoload.json配置文件来启用此模式。Hhvm-autoload将发出一个shim文件而不是完整的映射。如果HH\Facts\enabled()
返回false,或者当将--no-facts
传递给vendor/bin/hh-autoload
时,此选项将被忽略。我们建议在构建生产环境时传递--no-facts
(特别是repo auth模式)。返回硬编码的字典比询问HH\Facts
要快。
重要的是要注意。使用本地自动加载程序进行自动加载不尊重hh_autoload.json。repo auth自动加载程序允许任何代码使用任何符号。事实自动加载程序尊重.hhvmconfig.hdf中的配置。确保hh_autoload.json和.hhvmconfig.hdf中的配置相匹配。
工作原理
- 解析器(FactParse)提供了指定位置中所有Hack定义的列表
- 这被用来生成类似于classmap的东西,除了包括其他类型的定义
- 将映射提供给HHVM,使用
HH\autoload_set_paths()
- 如果已注册了本地自动加载器,则该自动加载器将有意不注册自己。因此,在仓库认证模式或基于事实的自动加载器注册时调用
Facebook\AutoloadMap\initialize()
是无效操作。
贡献
我们欢迎GitHub问题和拉取请求——请参阅CONTRIBUTING.md以获取详细信息。
许可
hhvm-autoload遵循MIT许可。