SBTプロジェクトアクセス構築時間とGITバージョンの方法


必要なのは、現在のWebアプリケーションがどのソース・バージョンに対応しているのか、いつコンパイルされているのかを確認して、新しいバージョンが導入されていないためにエラーが発生したのか、解決されていないバグがあるのかを判断することです.
sbtとscalaに詳しくないので、この案は不器用かもしれませんが、問題を解決することができます.基本的な考え方は、コンパイル前に構築時間とGITバージョンをテキストファイルに書き込み、実行時にバックグラウンドjavaコードで読み取り、フロントエンドに送信することです.
sbtファイルは.sbt接尾辞でもよいし.scala接尾辞でもよいし.scala接尾辞であれば制限が少なく任意に処理できるが、一般的には.sbt接尾辞ファイルが用いられる.sbtファイルには関数しか書けないので、構築情報をファイルに書き込む操作はすべて関数に入れます.
.sbtファイルに次の内容を追加します.
import java.text.SimpleDateFormat
import java.util.Date

...

//  NowDate            
def NowDate(): String = {
  val now: Date = new Date()
  val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  val date = dateFormat.format(now)
  return date
}

// GIT header   public         ,                 
def createGitHeaderFile(dir:String):sbt.File={
  val propFile = sourceDir("/public/data/gitv.txt")
  try{
    val h =Process("git rev-parse HEAD").lines.head
    IO.write(propFile, h)
  }catch{
    case ex:Exception => {
      ex.printStackTrace()
      IO.write(propFile, "ERROR_GET_GIT_HEADER_FAIL")
    }
  }

  val btFile = sourceDir("/public/data/buildtime.txt")
  val nowText = NowDate()
  IO.write(btFile, nowText)

  return file(s"${file(".").getAbsolutePath}/$dir")
}

//          git  header    public/data/gitv.txt
//            ,      ,                 ,       
unmanagedSourceDirectories in Compile ++= Seq(
  createGitHeaderFile("/scala")
)

Webプロジェクトのjavaファイルで構築情報を読み出し、処理したりフロントエンドに送信したりすることができます.
istr = env.resourceAsStream("public/data/gitv.txt");
if (istr.nonEmpty()){
    InputStream i=istr.get();

    BufferedReader reader = new BufferedReader(new InputStreamReader(i));
    try {
        String s = reader.readLine();
        if (s!=null){
            gitHeader=s;
        }
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("cannot read public/data/gitv.txt");
    }
}

istr = env.resourceAsStream("public/data/buildtime.txt");
if (istr.nonEmpty()){
    InputStream i=istr.get();

    BufferedReader reader = new BufferedReader(new InputStreamReader(i));
    try {
        String s = reader.readLine();
        if (s!=null){
            this.buildTime=s;
        }
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("cannot read public/data/buildtime.txt");
    }
}