hhvm/hhvm-autoload

该软件包已被废弃,不再维护。没有建议的替代软件包。

安装量: 609,349

依赖项: 90

建议者: 0

安全: 0

星级: 32

关注者: 17

分支: 22

开放问题: 5

语言:Hack

类型:composer-plugin

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

README

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

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/定义包含在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以更快地重新生成映射
  • 指定devFailureHandlerFacebook\AutoloadMap\HHClientFallbackHandler
  • 指定Facebook\AutoloadMap\FailureHandler的子类
  • 使用文件系统监视器,如watchman,在必要时调用上述命令之一

Facebook\AutoloadMap\HHClientFallbackHandler可能是Hack开发的最佳选择。

HHClientFallbackHandler

如果你正在Hack中工作,这个处理器将在几乎所有情况下消除手动重建映射的需要。

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

  • 如果CICONTINUOUS_INTEGRATIONTRAVIS环境变量设置为真值,则禁用;这是因为这不是生产环境推荐的方法,你可能希望你的自动化测试环境反映生产环境
  • 如果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许可