Posted at

Hackを使いこなす .hhconfig達人への道


.hhconfig

Hackは、単純に <?hh // strict を記述したHackのファイルを用意するだけではなく、

.hhconfig ファイルをプロジェクトのルートに作成しなければなりません。

このファイルは自動で作られるものではない、というのを忘れずに覚えておきましょう。

このファイルは主にTypechckerのためのもので、

Typecheckerが型チェックを行う場合に、プロジェクト全体のコードを分析するわけですが、

この時、アプリケーションのプロジェクトルートはどこか、というのを教えるために設置する必要がある、ということです。

最近のHackはバージョンアップで記法や型周りで変更が入ることもあり、

.hhconfigで一部だけTypecheckerの振る舞いを変更したり、

実装コードに対して厳格にチェックする様にしたり、と

アプリケーション開発時に結構重宝することが多いです。

.hhconfigファイルを作ればいいだけ、という情報は 古すぎる情報 なので、

しっかりと覚えましょう。

今回はHackの達人になりたい方むけに .hhconfig でよく使われるものを解説していきましょう


assume_php

PHPファイルを混入させて使うかどうかの設定です。

今現在はHackのコードの中にPHPのコードが混入するのを想定し、デフォルトはtrueになっています。

Hackのみで開発する場合は不要なので、必要がなければfalseで良いです。

ただしこれがtrueになっていてもPHPライブラリがHackのコードに入る場合は、

strictにすることはできません。

今後HHVM自体でもHack環境のみになっていくため、

ライブラリ、フレームワークを作って公開する場合は false にしておきましょう。

どうしてもPHPのライブラリなどを混ぜて利用したい場合は、hhiファイルを作成して、

hh-autoloadに取り込んでください。 PHPのライブラリの補完について

assume_php=false


safe_vector_array / safe_array

strictモードでは利用できませんが、

arrayの <_> <_, _> の混入についてですね。

fooの引数にただの配列が指定されていますが、

内部でコールしているメソッドの引数の配列が異なっています。

これを良しするかどうかです。

デフォルトでは良しとしないことになっています(true)

  public function foo(array $data): void {

$this->bar($data);
$this->baz($data);
}

public function bar(array<string> $data): void {
$this->baz($data);
}

public function baz(array<int, string> $_): void {

}

不具合の原因にも繋がりますので、

PHPから移行途中のコードや、昔のHackのコードを動かす場合、

といったケース以外はtrueにしておくのをオススメします。


.hhconfig

safe_array = true



deregister_php_stdlib

Hackのhhiファイルなどに <<__PHPStdLib>> と書かれている関数がいくつもあります。

主にPHPで利用されている関数です。

これを有効にするとこれらの関数が利用できなくなります。

デフォルトはfalse


.hhconfig

deregister_php_stdlib = false



user_attributes

Hackのアノテーション / Attributesに関するものです。

__ から始まるものはHackであらかじめ用意されているものですが、

それが以外のものは開発者が自由に作ることができます。

これはプロジェクト内で独自アノテーションを利用する場合に、

開発者が作る・使うものを明記することでそれ以外のものの混入を防いだり、勝手にたくさん作られるのを制御できます。

下記の様にuser_attributesで空文字指定すると、

開発者が独自アノテーションを作ることはできません。


.hhconfig

user_attributes = 


次の例の通りに記述すると、 <<Hoge>> は使うことができますが、

それ以外の独自アノテーションは利用できません。


.hhconfig

user_attributes = Hoge



disallow_return_by_ref

参照渡しの返却を許可するかどうかの設定です。

デフォルトはfalseですが、

trueにすると前回紹介した xhp-lib / (初めてのXHP,

初めてのXHP Tutorial / XHPとReact
) が引っかかってエラーが発生します。


.hhconfig

disallow_return_by_ref = true


ちなみにHackで参照渡しで返却したい場合は、下記の書き方です。

  public function &returnReferenceArray(): array<string, string> {

return [];
}

あたまに &


ignored_paths

特定のファイルを完全に無視するようにするためのものです。

このオプションには、正規表現の配列が含まれています。

たとえば、 ignored_paths = ["vendor /.* tests?/"] というようになります


.hhconfig

ignored_paths = ["vendor /.* tests?/"]


今回取り上げたのは一部だけですが、

みなさんの環境であれ?!って思ったら .hhconfig を確認しみましょう!