developer tip

코드에서 내 Scala 앱의 이름과 버전 (SBT에 설정된대로)에 액세스 할 수 있습니까?

optionbox 2020. 12. 12. 10:37
반응형

코드에서 내 Scala 앱의 이름과 버전 (SBT에 설정된대로)에 액세스 할 수 있습니까?


다음과 같이 Scala 빌드 정의를 사용하여 SBT (0.11.0)로 앱을 빌드하고 있습니다.

object MyAppBuild extends Build {

  import Dependencies._

  lazy val basicSettings = Seq[Setting[_]](
    organization  := "com.my",
    version       := "0.1",
    description   := "Blah",
    scalaVersion  := "2.9.1",
    scalacOptions := Seq("-deprecation", "-encoding", "utf8"),
    resolvers     ++= Dependencies.resolutionRepos
  )

  lazy val myAppProject = Project("my-app-name", file("."))
    .settings(basicSettings: _*)
    [...]

프로세스가 끝날 때 .jar을 패키징하고 있습니다.

내 질문은 간단합니다. 내 Scala 코드에서 프로그래밍 방식으로 애플리케이션의 이름 ( "my-app-name") 및 버전 ( "0.1")에 액세스하는 방법이 있습니까? 내가 도울 수 있다면 두 곳에서 반복하고 싶지 않습니다.

어떤 안내라도 대단히 감사합니다!


sbt-buildinfo

방금 sbt-buildinfo를 작성 했습니다 . 플러그인 설치 후 :

lazy val root = (project in file(".")).
  enablePlugins(BuildInfoPlugin).
  settings(
    buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
    buildInfoPackage := "foo"
  )

편집 : sbt-buildinfo의 최신 버전을 반영하도록 위의 스 니펫이 업데이트되었습니다.

foo.BuildInfo사용자 정의하여 원하는 설정으로 개체를 생성 합니다 buildInfoKeys.

임시 접근 방식

나는 이것을 위해 플러그인을 만들려고 했지만 (내가 썼다) 파일을 생성하는 빠른 스크립트가 있습니다.

sourceGenerators in Compile <+= (sourceManaged in Compile, version, name) map { (d, v, n) =>
  val file = d / "info.scala"
  IO.write(file, """package foo
    |object Info {
    |  val version = "%s"
    |  val name = "%s"
    |}
    |""".stripMargin.format(v, n))
  Seq(file)
}

버전을 foo.Info.version.


이름과 버전이 매니페스트에 삽입됩니다. Package 클래스의 Java 리플렉션을 사용하여 액세스 할 수 있습니다 .

val p = getClass.getPackage
val name = p.getImplementationTitle
val version = p.getImplementationVersion

참고 URL : https://stackoverflow.com/questions/8732891/can-i-access-my-scala-apps-name-and-version-as-set-in-sbt-from-code

반응형