facebook/hhvm-autoload

此包已被弃用且不再维护。作者建议使用 hhvm/hhvm-autoload 包。

安装数: 3,861

依赖项: 2

建议者: 0

安全: 0

星标: 31

关注者: 6

分支: 21

开放问题: 4

语言:Hack

类型:composer-plugin

v3.3.2 2022-05-30 18:49 UTC

README

HHVM上自动加载类、枚举、函数、typedefs和常量的自动加载器。

Continuous Integration

使用方法

  1. 添加一个 hh_autoload.json 文件(见下文部分)
  2. composer require hhvm/hhvm-autoload
  3. 使用 require_once (__DIR__ . '(/..)(repeat as needed)/vendor/autoload.hack'); 从您的入口点函数中引入自动加载文件
  4. 调用 Facebook\AutoloadMap\initialize() 以将自动加载器注册到hhvm。
  5. 要重新生成映射,运行 vendor/bin/hh-autoloadcomposer 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 来更快地重新生成映射
  • 指定 devFailureHandlerFacebook\AutoloadMap\HHClientFallbackHandler
  • 指定 Facebook\AutoloadMap\FailureHandler 的自定义子类
  • 使用文件系统监控工具,例如 watchman,在必要时调用上述命令之一。

Facebook\AutoloadMap\HHClientFallbackHandler 对于 Hack 开发来说可能是最方便的。

HHClientFallbackHandler

如果你正在使用 Hack,这个处理程序几乎在所有情况下都可以消除手动重建映射的需求。

它会向 hh_client 请求映射中不存在的定义,并具有以下附加行为

  • 如果 CICONTINUOUS_INTEGRATIONTRAVIS 环境变量设置为真值,则该处理程序将被禁用;这不是生产环境的推荐做法,你可能希望你的自动化测试环境反映生产环境
  • 结果将同时缓存在 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许可证