dbflute / dbflute-core

DBFlute core libraries for Java8
http://dbflute.seasar.org/
23 stars 18 forks source link

DBFlute Engine: LastaFlute FreeGen Geared option, for Maven multi project #164

Closed jflute closed 4 months ago

jflute commented 1 year ago

Change logic to derive base project name.

final Path basePath = Paths.get(path, "../" + DfStringUtil.substringLastFront(new File(path).getName(), "-") + "-base");

https://dbflute.slack.com/archives/CAPMSMTCK/p1673866217229989

あわねくんに相談、DBFluteのlastafluteMap.dfpropの isLastaDocMavenGeared/isLastaDocGradleGeared なんだけど...
(FreeGen実行すると、自動的に[App]LastaDocTestのtest_document()を実行するやつ)
// プログラムはこちら:
https://github.com/dbflute/dbflute-core/blob/develop/dbflute-engine/src/main/java/org/dbflute/logic/manage/freegen/table/lastaflute/DfLastaDocTableLoader.java#L224
1. test_swaggerも混ぜて実行しても良いだろうか?
test_swagger()も一緒に実行して、自動追従されるようにしたいなと思ったのだけど、isSwaggerMavenGearedを新規に作るのではなく、LastaのDocumentという意味合いを広く捉えて、今のプロパティに含めても良いかなと思って。
こう修正しちゃう:
-Dtest=*LastaDocTest#test_document
↓
-Dtest=*LastaDocTest#test_*
2. 別スレッドでパラレルで動かしてるけど、シリアルにしても良いだろうか?
今は、テスト実行は別スレッドで動く、かつ、自動生成が終わってから動くので、FreeGenしても最新でドキュメントが作られるわけじゃなく、すれ違っちゃう。
自然と徐々に最新になっていくという意味でこう実装されてると思うんだけど、連動させるプロパティなので、FreeGenが少し遅くなっても良いのでその場のFreeGenの結果と一致する方が良いかなと思った。(Swagger出力して、そのままFreeGenでRemoteApiGenってのもできるかなと)
このプロパティ使ってるって聞かないので、この辺はちょい変えちゃっても良いかなと思い。(Introで使うかなと思っている)
上記の二つの修正、何か懸念があれば意見をくれると嬉しい。

そういえば、これマルチプロジェクトで実行したときって、そもそもどういう挙動するんだろう?
ってふと思って試してみたら、commonプロジェクトのLastaDocTestだけしか実行されないというか、commonにはそのテストは存在しないので、うまく動かないかな。
シングルプロジェクト限定になってるのかな…
baseプロジェクトで以下を叩けばすべてのアプリのLastaDocTestが実行されるけど、FreeGenは大抵commonにあるからうまくいかない。
mvn -e test -DfailIfNoTests=false -Dtest=*LastaDocTest#test_*
厳密には、この辺もちゃんと吸収できるようなオプションとか用意しないといけないかも。(今回はintroなのでシングルだから問題ないけど)

↑いや、わかったぞ。
プログラム的にはbaseプロジェクトのパスを導出して実行しているので、一回でも実行されればすべてのLastaDocTestが実行されるので大丈夫のようにできているが…
final Path basePath = Paths.get(path, "../" + DfStringUtil.substringLastFront(new File(path).getName(), "-") + "-base");
もし、lastafluteMap.dfpropのcommonMapの方に、docがされてると…
; commonMap = map:{
    ; path = ..
    ; freeGenList = list:{ env ; config ; label ; message ; mail ; template ; doc ; namedcls }
    ; propertiesHtmlList = list:{ env ; config ; label ; message }
}
pathが “..” なので、baseプロジェクト名を導出してるところでロジックがすれ違ってしまっている。
DfStringUtil.substringLastFront(new File(path).getName(), "-") + "-base");
“..” だとハイフンがなくて切り取りができなくて、“..-base” という名前になってしまって、ProcessBuilderのカレントディレクトリが変な状態になっちゃう。
実際に試してみると、commonMapからdocを削除すると、それぞれのアプリでちゃんとlastadocのメタファイルが生成されて、docを入れると生成されない。
以下のようにあえて明示的にcommonのディレクトリ名を入れたらうまく動いた。ただ、Exampleでも “..” にしてるので、これはちょっと良くない。
; commonMap = map:{
    ; path = ../../maihama-common
たぶん、new File().getName()じゃなくて、new File().getCanonicalPath()とかにして、最後のディレクトリ名を確実に取得できるようにすれば依存しなくなるんじゃないだろうか。これはこれで要修正かな。
jflute commented 1 year ago

needs to fix

protected File prepareMvnTestProcessDirectory(String path) {
    final String currentAppProjectName = new File(path).getName(); // e.g. maihama-dockside
    final String pureProjectName = DfStringUtil.substringLastFront(currentAppProjectName, "-"); // e.g. maihama
    final Path basePath = Paths.get(path, "../" + pureProjectName + "-base"); // e.g. ../../maihama-dockside/../maihama-base
    return Files.exists(basePath) ? basePath.toFile() : new File(path);
}