さんざんこのドキュメントについて絶賛しながら書いていたのですが、このドキュメントの内容に不備(というか説明不足)があったのでそれについて独自調査、解決した内容を補足で説明しておきます。
実際に起こる事象
件の手順に従って、以下の手順を踏んだ場合の説明です。- サンプルのstage3にtestディレクトリを追加し
- WORKSPACEファイルを加工
- gtest.BULDをWORKSPACEと同階層に配置
- テスト実行
おそらく以下のエラーで引っかかると思います。
Unable to load package for //:gtest.BUILD: BUILD file not found in any of the following directories. Add a BUILD file to a directory to mark it as a package.
このエラーに関してですが、gtest.BUILDが有るにもかかわらず、BUILDファイルがない!と怒られています。
実は原文のマニュアルどおりにgtest.BUILDを省略してBUILDに内容をかけば切り抜けられる内容でも有るのですが、その場合今度はhttpprefixを外すことができなくなります。
なのでhttpprefixを外し、なおかつgtest.BUILDを利用している原文のマニュアルの意図通りにこの問題を解決する方法をこの記事では提示していきます。
実は原文のマニュアルどおりにgtest.BUILDを省略してBUILDに内容をかけば切り抜けられる内容でも有るのですが、その場合今度はhttpprefixを外すことができなくなります。
なのでhttpprefixを外し、なおかつgtest.BUILDを利用している原文のマニュアルの意図通りにこの問題を解決する方法をこの記事では提示していきます。
公式マニュアルに足りない情報
プロジェクト構成に関する説明
まず、公式マニュアルにはフォルダ構成の情報が乗っていません。
私の場合、ということになりますが、公式マニュアルの内容を実現するためのフォルダ、ファイル構成は以下のような構成となります。
bazel-gtest ├WORKSPACE ├BUILD ├gtest.BUILD ├/main │ ├ hello-world.cc │ └ BUILD ├/lib │ ├ hello-world.cc │ ├ hello-world.cc │ └ BUILD ├/test ├ hello-test.cc └ BUILD
ここで注目していただきたいのが、プロジェクトルートに、BUILDと、gtest.BUILDが併存しているということ、hello-greetがlibの下に移動されているということの2点です。
BULDファイルに関しては後述しますが、hello-greetのは位置は公式の3ステップサンプルのどのプロジェクトともフォルダ構成が異なっています。
なので、まず1点目の手順の修正として、stage2またはstage3を参考に上記のフォルダ構成を作る必要があります。
BUILDファイルの扱いに関する説明
さて、こちらの情報に関しては、最初に表示したエラーに直接的に関わる内容です。
正直これとかこれ読んだだけでは気付くことが難しいと思われます。
ただ理由はたった一言ですみます。
BUILDファイルがないからBazelがルートをパッケージと認識できていない。
はい
たったこれだけです。
あ、もう一回書きます?
BUILDファイルがないからBazelがルートをパッケージと認識できていない。
…
改めて周辺ドキュメントまで色々読んでみたのですが、gtest.BUILDは従来のBUILDで代用できますが、逆が出来るとはどこにも書いていないのです。
つまり、gtest.BUILDをプロジェクトルートに配置したとしても、Bazelがルートディレクトリまで含めてパッケージと認識してgtest.BUILDを検索対象に含めるためには、ルートディレクトリにBUILDファイルが必要となるわけです。
ちなみにこのBUILDファイルは内容空で構いません。
実際に私もそうやって置いています。
その上で実行すると、初めて以下のような結果が得られるわけです。
正直これとかこれ読んだだけでは気付くことが難しいと思われます。
ただ理由はたった一言ですみます。
BUILDファイルがないからBazelがルートをパッケージと認識できていない。
はい
たったこれだけです。
あ、もう一回書きます?
BUILDファイルがないからBazelがルートをパッケージと認識できていない。
…
改めて周辺ドキュメントまで色々読んでみたのですが、gtest.BUILDは従来のBUILDで代用できますが、逆が出来るとはどこにも書いていないのです。
つまり、gtest.BUILDをプロジェクトルートに配置したとしても、Bazelがルートディレクトリまで含めてパッケージと認識してgtest.BUILDを検索対象に含めるためには、ルートディレクトリにBUILDファイルが必要となるわけです。
ちなみにこのBUILDファイルは内容空で構いません。
実際に私もそうやって置いています。
その上で実行すると、初めて以下のような結果が得られるわけです。
bazel test test:hello-test INFO: Analyzed target //test:hello-test (1 packages loaded, 2 targets configured). INFO: Found 1 test target... Target //test:hello-test up-to-date: bazel-bin/test/hello-test INFO: Elapsed time: 0.687s, Critical Path: 0.63s INFO: 5 processes: 5 linux-sandbox. INFO: Build completed successfully, 10 total actions //test:hello-test PASSED in 0.1s Executed 1 out of 1 test: 1 test passes. INFO: Build completed successfully, 10 total actions
さいごに
今回の内容はドキュメントとサンプルコードを組み合わせた独自調査によるものですので、実際にはもっとうまいやり方が有る可能性もあります。
ただ前回までのところで解説した公式ドキュメントに対する補足としては、必要十分な内容と思いますので、参考になればと思います。
0 件のコメント:
コメントを投稿