codecamp

Typechecker Setup

安装好typechecker,你需要设置你的代码,可以用typechecker。

.hhconfig

首先,你将需要一个.hhconfig文件。这个文件很多次是空的(例如,只是touch .hhconfig),但也可以将配置设置添加到这个文件中。

该.hhconfig文件应该放在项目代码库的顶级目录中。Typechecker需要全局分析您的代码才能进行适当的类型检查,因此需要知道项目根目录的位置。它使用该.hhconfig文件 - 当调用Typechecker时hh_client,它将首先.hhconfig查找当前目录中或之上的第一个,然后检查.hhconfig所在位置下的所有文件。

.hhconfig第一次创建新的并运行typechecker 的正常顺序如下:

%(root project directory) touch .hhconfig
# Then run the typechecker client.
%(root project directory) hh_client

通用配置选项

通常,默认值为空.hhconfig将用于类型检查。但是,有一些可以放在.hhconfig文件中的配置选项。

assume_php

默认值:true 用法:assume_php = false

严格模式文件中,由于禁用了PHP兼容性(除此之外),Typechecker具有假设所有代码引用也都在Hack中的奢侈品。部分模式文件没有这个奢侈品。由于部分模式与PHP具有完全的互操作性,因此其中的代码允许调用PHP函数并操作PHP类 - Typechecker的代码看不到。这意味着当typechecker在部分模式文件中看到类或函数名称时,它一无所知,它必须假定该类或函数在一个PHP文件中被定义,它看不到,并且必须允许该代码通过。

这对PHP兼容性很好,通常是部分转换的代码库中所需要的。然而,它有一些缺点 - 最值得注意的是,它不会捕获到真正不存在的类的拼写错误或意外引用。这些问题只会在运行时显示。

该assume_php选项控制此行为。其默认值,true如上所述。当设置为false,那么Typechecker不再认为部分模式文件中的引用不能知道的类和函数在PHP文件中是无效的。它会在部分模式文件中引发错误,就像严格模式文件一样。这有助于覆盖部分转换的代码库。然而,为了获得更大的覆盖率,当然,所有的代码当然都可以看到typechecker,当然 - 你的转换必须足够远,所有的代码都是在Hack文件中(即使它只是声明模式)。代码没有需要完全转换为严格模式; 将这种增加覆盖范围扩大到严格模式之外就是这个选择。

user_attributes

默认值:empty 用法:user_attributes = CustomAttribute1 CustomAttribute2

您可以user_attributes使用所有自定义用户属性填充配置设置。此设置的主要用途是帮助确保您不会在代码库中拼写任何属性。它还可以确保您可以跟踪应使用什么属性来避免将任何流氓属性添加到代码中。

高级配置选项

您几乎肯定不需要更改任何这些选项,如果您不正确地执行此操作将会打破任何事情。它们被包括在这里是为了完整。

Memory

这些是用于高级调整typechecker如何使用内存。除非您的代码库包含超过10,000,000行代码,否则不需要更改这些代码。

  • gc_minor_heap_size - OCaml GC的标准配置参数
  • gc_space_overhead - OCaml GC的标准配置参数
  • sharedmem_global_size - Typechecker用于存储有关代码库的全局类型信息的区域大小
  • sharedmem_heap_size - 在类型检查时用于永久和临时存储的线程之间共享的总区域的大小

unsafe_xhp

默认值:false 用法:unsafe_xhp = true

设置此选项会true严重影响Typechecker对XHP文件的分析,在使用XHP时完全隐藏某些大类错误。只有在将Hack支持直接添加到库之前手动添加Hack类型到某些古代版本的XHP库,然后在随后的4年内未升级,这才有用。(如果你想知道你是否属于这个类别,你不会。)


Typechecker安装
Typechecker运行
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }