質問
Ohata Yuji · 2021年8月17日

$SYSTEM.OBJ.ImportDir()利用時のSourceControlの利用について。

こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。

スタジオ以外でSourceControlを利用されている方がいれば教えてください。

現在SourceControlを用いて、コンパイル前に
自動コードレビュー(静的解析)を行うような仕組みを構築しております。
実際にスタジオやVSCodeでの保存時には、上記の仕組みが動作しソースチェックが行われるのですが、
clsの一括取り込みを行おうと『$SYSTEM.OBJ.ImportDir()』を実行した際には
SourceControlが動作していないように見えております。

以下のような形でメソッド実行しているのですが、オプション等の不備になるのでしょうか?

> Do $SYSTEM.OBJ.ImportDir("ファイルが存在するパス","*.cls;*.mac;*.int;*.inc;*.dfi","ck",,1)

Product version: IRIS 2021.1
00
1 0 2 28
Log in or sign up to continue

Ohataさん
こんにちは。

実際にSourceControlを使っているわけではないのでよくわかっていない部分はありますが、
スタジオやVSCodeで保存した際には、スタジオやVSCodeのフック処理にてSourceControlの処理が実行されるかと思います。しかしImportDirなどObjectScriptのメソッドにはこのような機能がないため、SourceControlの処理は実行されません。

ImportDirメソッドを実行されるということは、その前に特定のディレクトリに.CLSなどのファイルを保存されるかと思います。
その際にSourceControlで使用する作業ディレクトリに保存すれば、SourceControlの処理が実行されるかと思うのですが、いかがでしょうか?

抽象的な内容ですみません。
何らかのヒントになれば幸いです。

Minamoto さん
こんにちは。ご回答いただきありがとうございます!

> しかしImportDirなどObjectScriptのメソッドにはこのような機能がないため、SourceControlの処理は実行されません。
やはりそうでしたか。私の方でもそもそも仕組みがないのではないかと疑っていました。

確かにExport前にチェックできていれば問題はないのですが、
チェック観点を追加した際に水平展開的に全体に仕掛けようと思った際に
どうやろうかなぁ、と試行錯誤していた状態です。

もう少しやり方は検討させていただきますが、本課題はいったんクローズさせていただきます。

こんな感じのメソッドを作って、登録済みのクラス全体をチェックかける仕組みを構築してみました。

ClassMethod CheckAllClass()
{
    Do $SYSTEM.OBJ.GetClassList(.classes, "/application=1/generated=0")
    Set class = ""
    For {
        Set class = $ORDER(classes(class))
        If (class = "") {
            Quit
        }

        If ($EXTRACT(class,1,4) = "csp.") {
            Continue
        }

        Write !,"****************コンパイルチェック開始****************",!
        Write "TARGET : "_class,!
        #; 各種チェッククラスの実行。
        Set hasErr = '##class(AbstractMethodChecker).%New().IsCorrectDefine(class)
        Set hasErr = hasErr + '##class(ClassNamingChecker).%New().IsCorrectDefine(class)
        Set hasErr = hasErr + '##class(DefineNamingChecker).%New().IsCorrectDefine(class)
        Set hasErr = hasErr + '##class(MethodImplChecker).%New().IsCorrectImpl(class)

        Write "****************コンパイルチェック完了****************",!

        If (hasErr > 0) {
            Write "コンパイルエラーがあります。",!
        }
    }
}