Giter Site home page Giter Site logo

sbt-buildinfo's Introduction

sbt-buildinfo

I know this because build.sbt knows this.

sbt-buildinfo generates Scala source from your build definitions.

Latest Stable

For sbt 1.x add sbt-buildinfo as a dependency in project/plugins.sbt:

sbt-buildinfo Scala version support

addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "x.y.z")
  • For sbt >= 0.13.6, see 0.11.0.
  • For sbt < 0.13.6, see 0.3.2.

Usage

Add the following in your build.sbt:

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

When you reload the settings and compile, this generates the following:

package hello

/** This object was generated by sbt-buildinfo. */
case object BuildInfo {
  /** The value is "helloworld". */
  val name: String = "helloworld"
  /** The value is "0.1-SNAPSHOT". */
  val version: String = "0.1-SNAPSHOT"
  /** The value is "2.10.3". */
  val scalaVersion: String = "2.10.3"
  /** The value is "0.13.2". */
  val sbtVersion: String = "0.13.2"
  override val toString: String = "name: %s, version: %s, scalaVersion: %s, sbtVersion: %s".format(name, version, scalaVersion, sbtVersion)
}

As this is generated source it will be found under target, specifically for a Scala 2.11 project under target/scala-2.11/src_managed/main/sbt-buildinfo

Customize buildInfoKeys by adding whatever keys you want to have in BuildInfo. You can use BuildInfoKey.map to change the generated field name and value, add new fields with tuples, or add new fields with values computed at build-time. Note: BuildInfoKey.map can handle both SettingKey[T] and TaskKey[T] types as arguments:

buildInfoKeys ++= Seq[BuildInfoKey](
  resolvers,
  libraryDependencies in Test,
  BuildInfoKey.map(name) { case (k, v) => "project" + k.capitalize -> v.capitalize },
  "custom" -> 1234, // computed at project load time
  BuildInfoKey.action("buildTime") {
    System.currentTimeMillis
  } // re-computed each time at compile
)

This generates:

  /** The value is Seq("Sonatype Public: https://oss.sonatype.org/content/groups/public"). */
  val resolvers: Seq[String] = Seq("Sonatype Public: https://oss.sonatype.org/content/groups/public")
  /** The value is Seq("org.scala-lang:scala-library:2.9.1", ...). */
  val test_libraryDependencies: Seq[String] = Seq("org.scala-lang:scala-library:2.9.1", ...)
  /** The value is "Helloworld". */
  val projectName = "Helloworld"
  /** The value is 1234. */
  val custom = 1234
  /** The value is 1346906092160L. */
  val buildTime = 1346906092160L

Tasks can be added only if they do not depend on sourceGenerators. Otherwise, it will cause an infinite loop.

Here's how to change the generated object name:

buildInfoObject := "Info"

This changes the generated object name to object Info. Changing the object name is optional, but to avoid name clash with other jars, package name should be unique. Use buildInfoPackage key for this.

buildInfoPackage := "hello"

build number

A build number can be generated as follows. Note that cross building against multiple Scala would each generate a new number.

buildInfoKeys += buildInfoBuildNumber

BuildInfoOption.ToMap

Add the following option

buildInfoOptions += BuildInfoOption.ToMap

to generate toMap method:

val toMap = Map[String, Any](
  "name" -> name,
  "version" -> version,
  "scalaVersion" -> scalaVersion,
  "sbtVersion" -> sbtVersion)

BuildInfoOption.ToJson

Add the following option

buildInfoOptions += BuildInfoOption.ToJson

to generate toJson method.

BuildInfoOption.Traits

Add the following option

buildInfoOptions += BuildInfoOption.Traits("TestTrait1", "TestTrait2")

to mixin traits to the generated object.

BuildInfoOption.BuildTime

Add the following option

buildInfoOptions += BuildInfoOption.BuildTime

to add timestamp values:

/** The value is "2015-07-30 03:30:16.849-0700". */
val builtAtString: String = "2015-07-30 03:30:16.849-0700"
/** The value is 1438227016849L. */
val builtAtMillis: Long = 1438227016849L

BuildInfoOption.PackagePrivate

Set the package using buildInfoPackage and use the option BuildInfoOption.PackagePrivate

buildInfoPackage := "hello"
buildInfoOptions += BuildInfoOption.PackagePrivate

to make the generated BuildInfo object package private:

/** This object was generated by sbt-buildinfo. */
private[hello] case object BuildInfo {  
  ...
}

BuildInfoOption.ConstantValue

Add the following option

buildInfoOptions += BuildInfoOption.ConstantValue

to have all vals in the BuildInfo object declared final and without an explicit type annotation:

/** This object was generated by sbt-buildinfo. */
case object BuildInfo {
  /** The value is "helloworld". */
  final val name = "helloworld"
  ...
}

This is particular useful if the values must be constants โ€“ e.g., if you need to assign them to annotation arguments.

BuildInfoOption.ImportScalaPredef

Add the following option

buildInfoOptions += BuildInfoOption.ImportScalaPredef

to explicitly import scala.Predef._ in the generated code.

package hello

import scala.Predef._

/** This object was generated by sbt-buildinfo. */
case object BuildInfo {
  ...
}

This import is necessary only when using compiler option -Yno-imports. Please note, the generated import is not compatible when compiling with Scala 3 compiler option -source:future because import wildcards must be *.

License

MIT License

sbt-buildinfo's People

Contributors

arixmkii avatar asflierl avatar ckipp01 avatar dependabot[bot] avatar devstuff avatar duhemm avatar dwijnand avatar eed3si9n avatar enginyoyen avatar gokyo avatar jedesah avatar joriscode avatar leviramsey avatar magneticflux- avatar martingd avatar mmynsted avatar pdalpra avatar philippus avatar regadas avatar reid-spencer avatar rogach avatar rreckel avatar rtyley avatar samir-chouaieb avatar sciss avatar sellout avatar tkawachi avatar xerial avatar xuwei-k avatar yarosman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sbt-buildinfo's Issues

Map keys?

Hi there. Is it possible to map keys somehow? For example I have the standard sbt key homepage

homepage := Some( url( "https://github.com/Sciss/ScalaInterpreterPane" ))

and

buildInfoKeys := Seq[ Scoped ]( name, organization, version, scalaVersion, description, homepage, licenses )

I would like to have BuildInfo.homepage: java.net.URL or at least String, instead of Some[String] (btw, shouldn't that be Option[String]). And I would like to have BuildInfo.license: (String, java.net.URL) instead of BuildInfo.licenses: Seq[ (String, String) ].

Is this possible somehow?

Race condition in multiple module project

it appears to only happen when using multiple source generators (in my case, sbt-scalabuff & sbt-buildinfo), always need to run the compile step twice to succeed. the first pass fails with:

[error] source file 'sbtrace/child/target/scala-2.10/src_managed/main/sbt-buildinfo/BuildInfo.scala' could not be found

I've put together a small sample project to replicate the problem:

https://github.com/nefilim/sbtrace

Bug when compiling on scalaVersion upgrade

Hi,

I have a problem when trying to upgrade my build.sbt scalaVersion from 2.10.6 to 2.11.6 using buildInfo plugin.
When I compile my project, I get this error :

[error] /Users/jeanbombeur/Desktop/workspace/cvaden-hot-fca/target/src_managed/main/sbt-buildinfo/BuildInfo.scala:7: BuildInfo is already defined as case class BuildInfo
[error] case object BuildInfo {
[error] ^
[error] one error found
error Compilation failed

The error seems weird since I just did a "clean" command and my "target" directory is clean.

Here is what my build.sbt looks like (I just obfuscated some names) :

import _root_.sbtassembly.Plugin.AssemblyKeys._
import _root_.sbtassembly.Plugin.MergeStrategy
import _root_.sbtassembly.Plugin.PathList
import _root_.sbtassembly.Plugin._
import _root_.sbtbuildinfo.BuildInfoPlugin
import _root_.sbtbuildinfo.BuildInfoPlugin.autoImport._
import _root_.sbtrelease.ReleasePlugin._
import com.typesafe.sbt.SbtNativePackager
import com.typesafe.sbt.SbtScalariform._
import com.typesafe.sbt.packager.SettingsHelper
import com.typesafe.sbt.packager.SettingsHelper
import com.typesafe.sbt.packager.universal.UniversalPlugin
import com.typesafe.sbt.packager.universal.UniversalPlugin.autoImport._
import sbtassembly.Plugin.AssemblyKeys._

name := """my-project"""

organization := "fr.me"

scalaVersion := "2.11.6"

scalacOptions ++= Seq("-deprecation", "-feature")

incOptions := incOptions.value.withNameHashing(true)

scalariformSettings
releaseSettings
assemblySettings

// Avro Section
sbtavrohugger.SbtAvrohugger.specificAvroSettings

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => {
  case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
  case m if m.startsWith("META-INF") => MergeStrategy.discard
  case PathList("javax", "servlet", xs@_*) => MergeStrategy.first
  case PathList("org", "apache", xs@_*) => MergeStrategy.first
  case PathList("org", "jboss", xs@_*) => MergeStrategy.first
  case "about.html" => MergeStrategy.rename
  case "reference.conf" => MergeStrategy.concat
  case _ => MergeStrategy.first
}
}

artifact in(Compile, assembly) <<= (artifact in Compile, version) apply ((art, v) => {
  art
})

addArtifact(artifact in(Compile, assembly), assembly)

SettingsHelper.makeDeploymentSettings(Universal, packageBin in Universal, "zip")

resolvers += Resolver.sonatypeRepo("release")

resolvers ++= Common.resolvers

val sparkVersion = "1.5.2"
val kafkaVersion = "0.8.2.2"
val chillVersion = "0.8.0"
val slf4jVersion = "1.7.19"
val avroVersion = "1.8.0"
val elastic4sVersion = "1.7.5"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
  "org.apache.spark" %% "spark-streaming-kafka" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion % "provided" ,
  "org.apache.kafka" %% "kafka" % kafkaVersion % "provided",
  "org.apache.avro" % "avro" % avroVersion,
  "io.confluent" % "kafka-avro-serializer" % "1.0.1",
  "org.specs2" %% "specs2-core" % "3.7.2" % "test",
  "ch.qos.logback" % "logback-classic" % "1.1.3" % "provided",
  "org.slf4j" % "slf4j-api" % slf4jVersion % "provided",
  "com.twitter" %% "chill-avro" % chillVersion,
  "org.elasticsearch" %% "elasticsearch-spark" % "2.2.0" exclude("org.slf4j", "slf4j-api"),
  "com.maxmind.geoip2" % "geoip2" % "2.3.1",
  "com.sksamuel.elastic4s" %% "elastic4s-core" % elastic4sVersion,
  "eu.bitwalker" % "UserAgentUtils" % "1.19",
  "joda-time" % "joda-time" % "2.9.2",
  "com.github.ben-manes.caffeine" % "caffeine" % "2.2.2",
  "ua_parser" % "ua-parser" % "1.3.1.0"
)

dependencyOverrides ++= Set(
  "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4"
)

lazy val root = (project in file("."))
  .enablePlugins(SbtNativePackager, UniversalPlugin)
  .enablePlugins(BuildInfoPlugin).settings(
  // Build version parameters from Jenkins
  // @see https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-JenkinsSetEnvironmentVariables

  buildInfoKeys := Seq[BuildInfoKey](name, version in ThisBuild, scalaVersion, sbtVersion),

  buildInfoKeys ++= Seq[BuildInfoKey](
    "EXTRA_INFO" -> sys.env.getOrElse("EXTRA_INFO", "N/A"),
    "BUILD_NUMBER" -> sys.env.getOrElse("BUILD_NUMBER", "N/A"),
    "BUILD_ID" -> sys.env.getOrElse("BUILD_ID", "N/A"),
    "NODE_NAME" -> sys.env.getOrElse("NODE_NAME", "N/A"),
    "GIT_BRANCH" -> sys.env.getOrElse("GIT_BRANCH", "N/A"),
    "GIT_COMMIT" -> sys.env.getOrElse("GIT_COMMIT", "N/A"),
    "BUILD_AT" -> {
      val dtf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
      dtf.setTimeZone(java.util.TimeZone.getTimeZone("UTC"))
      dtf.format(new java.util.Date())
    })
)

Since the bug presents itselft whereas the only change I made is the scalaVersion upgrade, I guess it must be somehow related.

This bug prevents me from compiling properly and I would really like to use the jenkins env variables.
Can you help me on this ?

Regards,

Rรฉmy

Can't upgrade from 0.3.2 to 0.4.0

After doing this change:

diff --git a/project/Common.scala b/project/Common.scala
index fa7dcfd..23c3ba7 100644
--- a/project/Common.scala
+++ b/project/Common.scala
@@ -3,7 +3,9 @@ import Keys._

 import sbtassembly._
 import sbtassembly.AssemblyKeys._
-import sbtbuildinfo.Plugin._
+import sbtbuildinfo._
+import sbtbuildinfo.BuildInfoPlugin._
+import sbtbuildinfo.BuildInfoKeys._

 import scala.collection.JavaConverters._
 import java.nio.file.{Paths, Files}
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 398a2bd..57dd5d8 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -2,10 +2,10 @@ resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/release

 addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.7")

-addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.3.2")
+addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.4.0")

The plugin does not work anymore, SBT report the following error during compilation after clean; compile;:

[error] /home/alois/bestmile/platform/common/target/scala-2.11/src_managed/main/sbt-buildinfo/BuildInfo.scala:7: BuildInfo is already defined as case class BuildInfo
[error] case object BuildInfo {

Thanks

Symbol to String

I am not sure if this is a bug or an end-user error. Either way I did not expect the results.

If I create a nested Map, where the inner Map has a Symbol key, the type is changed to String.

Example:

     buildInfoKeys ++= Seq[BuildInfoKey](
             resolvers,
             libraryDependencies in Test,
             BuildInfoKey.map(name) { case (k, v) => "project" + k.capitalize -> v.capitalize },
             "custom" -> 1234, // computed at project load time
             BuildInfoKey.action("foo"){Map[String, Map[Symbol, String]]("a" -> Map('fiz -> "pop"), "b" -> Map('zing -> "wee"))}
             )

results in

     val foo = Map(("a" -> Map(("\'fiz" -> "pop"))), ("b" -> Map(("\'zing" -> "wee"))))

Generated files add BuildInfo inheritance twice - compilation failure

using sbt ;clean ;compile the generated file results in double inheritance

/target/scala-2.11/src_managed/main/sbt-buildinfo/MyClass.scala:9: trait BuildInfo is inherited twice
[error] case object MyClass extends com.deere.stratum.adp.util.BuildInfo with com.deere.stratum.adp.util.BuildInfo {

Compilation only succeeds when I manually go into the generated file and delete the with com.deere.stratum.adp.util.BuildInfo

Endless compilation loop when used on Play 2.2.0 project

I put this into project/plugins.sbt:

addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.2.5")

I put this into the top-level build.sbt:

buildInfoSettings

sourceGenerators in Compile <+= buildInfo

buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion)

buildInfoPackage := "com.micronautics.mocc"

buildInfoKeys ++= Seq[BuildInfoKey](
  resolvers,
  libraryDependencies in Test,
  BuildInfoKey.map(name) { case (k, v) => "project" + k.capitalize -> v.capitalize },
  BuildInfoKey.action("buildTime") {
    System.currentTimeMillis
  } // re-computed each time at compile
)

When I load a page, the Play project is recompiled and reloaded endlessly.

Is it possible to add build time to BuildInfo?

I tried doing it like this:

buildInfoKeys ++= Seq[BuildInfoKey]("buildTime" -> System.currentTimeMillis)

but that obviously does not work, since buildTime is fixed to time of config loading, not actual build time of a project.

Is there some way to add a key, which value will be computed exactly on build time?

Generated BuildInfo Code Won't Compile

First, I use sbt-buildinfo like this:

      buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
      buildInfoPackage := scrupalPackage.value,
      buildInfoObject  := {
        val s = scrupalPackage.value.split('.').map { s => s.head.toString.toUpperCase + s.tail }.mkString
        s.head.toString.toUpperCase + s.tail + "Info"
      },
      buildInfoOptions := Seq(BuildInfoOption.ToMap, BuildInfoOption.ToJson, BuildInfoOption.BuildTime),

My "scrupalPackage" setting has a string value like "scrupal.api" or "scrupal.utils". This informs the buildInfoPackage setting but I also use it to generate unique buildInfoObject values. The code there just converts the package name to CamelCase so "scrupal.api" becomes ScrupalApiInfo.

I uniqued those names to get around what I thought was a compilation problem resulting from having buildInfo settings like the above on several sub-projects. The error I get is like this one:

[info] Compiling 21 Scala sources to /Users/reidspencer/Code/scrupal/scrupal-utils/target/scala-2.11/classes...
[error] /Users/reidspencer/Code/scrupal/scrupal-utils/target/scala-2.11/src_managed/main/sbt-buildinfo/ScrupalUtilsInfo.scala:4: ScrupalUtilsInfo is already defined as case class ScrupalUtilsInfo
[error] case object ScrupalUtilsInfo {
[error]             ^
[error] one error found
[error] (scrupal-utils/compile:compileIncremental) Compilation failed

I've tried several things to get around this without

  • Make unique file names as above.
  • Change the subdir under dir and cacheDir to be the same (one was missing a hyphen)
  • Put the generated file in a directory that matches the package name
  • Change the BuildInfo.scala to not bother with caching

The first two in that list have been submitted as enhancements in my Pull Request.

The second two failed to resolve the issue so I didn't include them in the Pull Request.

At this point, I've tried what I can to get the issue resolved. It occurs because sbt is finding two class files of the same name and defining the same case object. Why that happens (even from a clean build), I have no idea. What I have located is two copies of the source, one in the cache stream, one in the managed sources directory. In my case, these paths:

server:scrupal reidspencer$ find . -name '*ScrupalUtils*' -ls
238102725        8 -rw-r--r--    1 reidspencer      staff                1159 Jun 29 22:10 ./scrupal-utils/target/scala-2.11/src_managed/main/scrupal/utils/ScrupalUtilsInfo.scala
238105866        8 -rw-r--r--    1 reidspencer      staff                1159 Jun 29 22:10 ./scrupal-utils/target/streams/$global/buildInfo/$global/streams/sbtbuildinfo/ScrupalUtilsInfo.scala
server:scrupal reidspencer$ 

I don't mind doing the leg work and will submit a pull request for this. I just need to know what's going wrong and what needs to be done to fix it.

Build fails with latest.release version

Hi,

In my project, if I use latest.release as the version number instead of specifying a specific version e.g.

addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "latest.release")

The build fails with the following error:

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: com.eed3si9n#sbt-buildinfo;latest.release: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

To debug, I downloaded the source for buildinfo and built it published it locally using publishLocal. If I then build by project, it succeeds. Perhaps the bintray version lacks a proper ivy.xml?

BuildInfo.buildInfoBuildNumber DRY

When adding buildInfoBuildNumber it generates a BuildInfo.buildinfoBuildnumber field. Better would be to just name it buildNumber instead.

Eclipse support?

First of all, thanks for this project, it looks great and I have been using it successfully.

One problem I encounter with it, however, is support for Eclipse. I use sbt 'eclipse with-source=true' to create an Eclipse project that I can import. However, the generated BuildInfo class is of course not yet available. Have their been any solutions for this?

Something like configuring the project in such a way that once you have run sbt compile, a subsequent sbt 'eclipse with-source=true' will add the generated BuildInfo.scala as a source to the Eclipse project?

Cannot compile with IntelliJ

After installing the sbt-buildinfo plugin, I cannot compile my project anymore in IntelliJ. The project compiles just fine using sbt.

The IntelliJ error:

Error:scalac: Output path /Users/cosmin/dev/logs-processing/target/scala-2.10/classes is shared between: Module 'logs-processing' production, Module 'root' production
Output path /Users/cosmin/dev/logs-processing/target/scala-2.10/test-classes is shared between: Module 'logs-processing' tests, Module 'root' tests
Please configure separate output paths to proceed with the compilation.
TIP: you can use Project Artifacts to combine compiled classes if needed.

The configuration in build.sbt is as follows:

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

Any tips on how to fix this annoying issue?

I should add that I now have an additional root module along my base project, which seems to cause the conflicting paths.

Increase buildInfoBuildNumber only on defined sbt task

I'm using sbt-buildinfo for play-2.2.2 and I really like it so far!
But would it be possible as well to enhance the Plugin to be able to define on which task the buildInfoBuildNumber will be increased? For example only when I do a dist?

ScalaDoc in Sbt BuildInfo

It would be nice if sbt-buildinfo also generated ScalaDoc. This allows us to include
various version values in the generated ScalaDoc.

  1. For the top level case object.
    "This file was generated by sbt-buildinfo plugin on mm/dd/yyyy.
  2. For each val (ScalaDoc by default includes the name and type but not the value!)
    "The value is VVV".

[email protected] and [email protected]

Cannot use with -Yno-imports

#78 breaks the use of sbt-buildinfo with the -Yno-imports compile flag.

Luckily the fix seems simple enough (hopefully it does not break yet another flag...), just fully qualify all the things.

Instant recompile

Hi,
I tried to use the plugin with my Play!2 project. The plugin works fine by means of generating the Info object.
However, it gets instantly recompiled (I just run play in development mode that causes sources to be recompiled automatically on demand). e.g. when I request the page on browser the sbt performs several compilations even no sources are changed.
I assume that is an effect of generating the source by plugin.

Did you see such behavior earlier? Can you please suggest some solution for my case?

Thanks

Migrating from 0.3.2 to 0.4.0

Issues encountered when switching from 0.3.2 to 0.4.0:

  1. error: .enablePlugins(BuildInfoPlugin) : not found: value BuildInfoPlugin

This is solved by changing the import statement from what it was in 0.3.2 ("import sbtbuildinfo.Plugin._") to just:

import sbtbuildinfo._

  1. error: .settings(buildInfoSettings: _*).settings( : not found: value buildInfoSettings

This one I'm stumped by, I can see it in your source file BuildInfoPlugin.scala line #38! I saw your migration notes, there you referred to a "commonSettings", which I couldn't see in your source. I tried changing buildInfoSettings to commonSettings, but got the same error.

I've got to be doing something silly, right?

Intellij or sbt-buildinfo issue ?

To make intellij happy I have to add target/classes_managed. This help IDE to find the BuildInfo object.

I first thought it was an sbt/inetllij issue but I saw this thread : https://youtrack.jetbrains.com/issue/SCL-7182

I'm using default intellij sbt import.

Did I miss something? If not, do you have any idea how we could make this smoother (avoid change default project structure from sbt intellij)?

Versions used :

  • sbt-buildinfo version 0.4.0
  • Playframework 2.3.9
  • Intellij 14.1

Thanks.

Value buildInfoKeys not found

I'm trying to use sbt-buildinfo 0.4. I followed tutorial and observed following behavior:

  import sbtbuildinfo.BuildInfoPlugin

 lazy val root = Project(
    "offer-server",
    file(".")
    ,settings = buildSettings ++
      Seq(
        buildInfoKeys := Seq(name, version, scalaVersion, sbtVersion),
        buildInfoPackage := "hello"
      )
  ).
    enablePlugins(BuildInfoPlugin).
    aggregate(api, util, cache,  /* etc */)

I have following output:

[error] ../project/Build.scala:260: not found: value buildInfoKeys
[error]         buildInfoKeys := Seq(name, version, scalaVersion, sbtVersion),
[error]         ^
[error] one error found

I'm using sbt.version=0.13.7. Would you mind to say if it's my error configuring the plugin?

Consider auto-enabling sbt-buildinfo

Due to use of auto-plugins in 0.4.0, it is not currently possible to define a "parent plugin" -- akin to a Maven parent pom -- that enables and configures sbt-buildinfo and auto-enables for all JVM projects.

This came up when upgrading the scodec-build plugin to sbt-buildinfo 0.4.0. In the previous version (https://github.com/scodec/scodec-build/blob/ea96e7132bbf94f6cee52290a1fe7f53a4a3111b/src/main/scala/scodec/build/ScodecBuildSettings.scala), sbt-buildinfo was manually configured and enabled from projectSettings.

Note that adding sbt-buildinfo to requirements is not an option because then ScodecBuildSettings would only be enabled when sbt-buildinfo is manually enabled or alternatively ScodecBuildSettings is manually enabled. The goal is to keep ScodecBuildSettings auto-enabled for any JVM project while also auto-enabling sbt-buildinfo.

"input changed"

There is a new text "input changed" appearing with the recent version. This is a bit confusion because it wasn't clear to me at first that this text is emitted by the buildinfo plugin. I think it should use log (with level info) instead of println, and also include buildinfo so that it is clear where this message belongs to.

buildInfoBuildNumber Issues

Withbuildinfo 0.2.5, placing the following in build.sbt:

buildInfoSettings

sourceGenerators in Compile <+= buildInfo

buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion)

buildInfoKeys += buildInfoBuildNumber

Produces the following error:

/home/mslinn/work/training/mocc/build.sbt:55: error: No implicit for Append.Value[Seq[sbtbuildinfo.Plugin.BuildInfoKey.Entry[_]], sbt.TaskKey[Int]] found,
  so sbt.TaskKey[Int] cannot be appended to Seq[sbtbuildinfo.Plugin.BuildInfoKey.Entry[_]]
buildInfoKeys += buildInfoBuildNumber

When used in a Play project, the following causes endless recompilation:

buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion, buildInfoBuildNumber)

Is there a way to generate values for BuildInfo.buildinfoBuildnumber with a Play 2.2.0 webapp?

Generated file's output folder.

Would some one be able to let me know why the generated file is output to a "sbt-buildinfo" folder:
https://github.com/sbt/sbt-buildinfo/blob/master/src/main/scala/sbtbuildinfo/BuildInfoPlugin.scala#L44
rather than something like:
sourceManaged.value / buildInfoPackage.value.replace(".", java.io.File.separator)

NOTE: I understand that sbt/Scala does not require the direct correlation between package and path that Java does, but I still find it a useful default.

Thanks.

BuildInfoBuildNumber is incremented on 'sbt run'

...and I doubt that's the behavior users are expecting.

It looks like you might need to scope your dependency here.

I would also argue that buildNumberTask should be public, as some users might want to use it to set buildinfoBuildnumber themselves, and use buildNumberTask to put buildinfo.properties somewhere other than in the project root.

Publish the latest version

Could you please publish the latest version of the plugin? The 0.2.1 version doesn't seem to contain the #7 change, and it's extremely inconvenient to specify a git dependency in each new project.

Keys in multi-project build

When using Build.scala with multiple projects instead of build.sbt per project, the values for BuildInfo keys are not picked up correctly. For example:

lazy val root = Project(
  id = "root",
  base = file("."),
  settings = Defaults.defaultSettings,
  aggregate = Seq(example-ws)
)

lazy val example_ws = Project(
  id = "example-ws",
  base = file("ws/example"),
  settings = Defaults.defaultSettings ++ BuildInfoPlugin.buildInfoSettings ++ Seq(
    sourceGenerators in Compile <+= BuildInfoPlugin.buildInfo,
    BuildInfoPlugin.buildInfoKeys := Seq[Scoped](scalaVersion, projectID)
  )
)

The problem is:

> project root
> compile

produces the following BuildInfo.scala for example-ws

object BuildInfo {
  val scalaVersion = "2.9.1"
  val projectId = "com.example:root:0.1.0-SNAPSHOT"
}

while

> project example-ws
> compile

produces the following for the same project:

object BuildInfo {
  val scalaVersion = "2.9.1"
  val projectId = "com.example:example-ws:0.1.0-SNAPSHOT"
}

A workaround is to use BuildInfoPlugin.buildInfoKeys := Seq[Scoped](scalaVersion, projectID in "example-ws"). This produces the correct value "com.example:example-ws:0.1.0-SNAPSHOT" also when compiled from root.

The problem seems to be around line 17 of Plugin.scala. The State object seems to be dependent on a global scope somehow rather than the on project being compiled.

java.lang.OutOfMemoryError: unable to create new native thread

I am having a crash consistently when using those settings. I am using Scala 2.11.2 and SBT 0.13.6.

buildInfoSettings

sourceGenerators in Compile <+= buildInfo

buildInfoKeys := Seq[BuildInfoKey](internalDependencyClasspath in Test)

Full stack trace

java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: unable to create new native thread
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
    at sbt.ConcurrentRestrictions$$anon$4.take(ConcurrentRestrictions.scala:196)
    at sbt.Execute.next$1(Execute.scala:88)
    at sbt.Execute.processAll(Execute.scala:91)
    at sbt.Execute.runKeep(Execute.scala:69)
    at sbt.EvaluateTask$.liftedTree1$1(EvaluateTask.scala:197)
    at sbt.EvaluateTask$.sbt$EvaluateTask$$run$1(EvaluateTask.scala:196)
    at sbt.EvaluateTask$.runTask(EvaluateTask.scala:214)
    at sbt.EvaluateTask$$anonfun$apply$1$$anonfun$apply$3.apply(EvaluateTask.scala:130)
    at sbt.EvaluateTask$$anonfun$apply$1$$anonfun$apply$3.apply(EvaluateTask.scala:129)
    at scala.Option$WithFilter.map(Option.scala:206)
    at sbt.EvaluateTask$$anonfun$apply$1.apply(EvaluateTask.scala:129)
    at sbt.EvaluateTask$$anonfun$apply$1.apply(EvaluateTask.scala:128)
    at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:166)
    at sbt.EvaluateTask$.apply(EvaluateTask.scala:128)
    at sbt.Extracted.runTask(Extracted.scala:38)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask.entry(Plugin.scala:116)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask.line(Plugin.scala:94)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask$$anonfun$2.apply(Plugin.scala:86)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask$$anonfun$2.apply(Plugin.scala:86)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask.makeFile(Plugin.scala:86)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask.file(Plugin.scala:67)
    at sbtbuildinfo.Plugin$BuildInfo$.apply(Plugin.scala:53)
    at sbtbuildinfo.Plugin$$anonfun$buildInfoSettings$1.apply(Plugin.scala:194)
    at sbtbuildinfo.Plugin$$anonfun$buildInfoSettings$1.apply(Plugin.scala:193)
    at scala.Function7$$anonfun$tupled$1.apply(Function7.scala:35)
    at scala.Function7$$anonfun$tupled$1.apply(Function7.scala:34)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)
    at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371)
    at java.util.concurrent.ExecutorCompletionService.submit(ExecutorCompletionService.java:181)
    at sbt.CompletionService$.submit(CompletionService.scala:30)
    at sbt.ConcurrentRestrictions$$anon$4.submitValid(ConcurrentRestrictions.scala:161)
    at sbt.ConcurrentRestrictions$$anon$4.submit(ConcurrentRestrictions.scala:149)
    at sbt.Execute.submit(Execute.scala:237)
    at sbt.Execute.ready(Execute.scala:217)
    at sbt.Execute.addNew(Execute.scala:188)
    at sbt.Execute.addChecked(Execute.scala:170)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:194)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:192)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at sbt.IDSet$$anon$1.foreach(IDSet.scala:37)
    at sbt.Execute.addNew(Execute.scala:192)
    at sbt.Execute.addChecked(Execute.scala:170)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:194)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:192)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at sbt.IDSet$$anon$1.foreach(IDSet.scala:37)
    at sbt.Execute.addNew(Execute.scala:192)
    at sbt.Execute.addChecked(Execute.scala:170)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:194)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:192)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at sbt.IDSet$$anon$1.foreach(IDSet.scala:37)
    at sbt.Execute.addNew(Execute.scala:192)
    at sbt.Execute.addChecked(Execute.scala:170)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:194)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:192)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at sbt.IDSet$$anon$1.foreach(IDSet.scala:37)
    at sbt.Execute.addNew(Execute.scala:192)
    at sbt.Execute.addChecked(Execute.scala:170)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:194)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:192)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at sbt.IDSet$$anon$1.foreach(IDSet.scala:37)
    at sbt.Execute.addNew(Execute.scala:192)
    at sbt.Execute.addChecked(Execute.scala:170)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:194)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:192)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at sbt.IDSet$$anon$1.foreach(IDSet.scala:37)
    at sbt.Execute.addNew(Execute.scala:192)
    at sbt.Execute.addChecked(Execute.scala:170)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:194)
    at sbt.Execute$$anonfun$addNew$3.apply(Execute.scala:192)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at sbt.IDSet$$anon$1.foreach(IDSet.scala:37)
    at sbt.Execute.addNew(Execute.scala:192)
    at sbt.Execute.runKeep(Execute.scala:68)
    at sbt.EvaluateTask$.liftedTree1$1(EvaluateTask.scala:197)
    at sbt.EvaluateTask$.sbt$EvaluateTask$$run$1(EvaluateTask.scala:196)
    at sbt.EvaluateTask$.runTask(EvaluateTask.scala:214)
    at sbt.EvaluateTask$$anonfun$apply$1$$anonfun$apply$3.apply(EvaluateTask.scala:130)
    at sbt.EvaluateTask$$anonfun$apply$1$$anonfun$apply$3.apply(EvaluateTask.scala:129)
    at scala.Option$WithFilter.map(Option.scala:206)
    at sbt.EvaluateTask$$anonfun$apply$1.apply(EvaluateTask.scala:129)
    at sbt.EvaluateTask$$anonfun$apply$1.apply(EvaluateTask.scala:128)
    at sbt.EvaluateTask$.withStreams(EvaluateTask.scala:166)
    at sbt.EvaluateTask$.apply(EvaluateTask.scala:128)
    at sbt.Extracted.runTask(Extracted.scala:38)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask.entry(Plugin.scala:116)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask.line(Plugin.scala:94)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask$$anonfun$2.apply(Plugin.scala:86)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask$$anonfun$2.apply(Plugin.scala:86)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask.makeFile(Plugin.scala:86)
    at sbtbuildinfo.Plugin$BuildInfo$BuildInfoTask.file(Plugin.scala:67)
    at sbtbuildinfo.Plugin$BuildInfo$.apply(Plugin.scala:53)
    at sbtbuildinfo.Plugin$$anonfun$buildInfoSettings$1.apply(Plugin.scala:194)
    at sbtbuildinfo.Plugin$$anonfun$buildInfoSettings$1.apply(Plugin.scala:193)
    at scala.Function7$$anonfun$tupled$1.apply(Function7.scala:35)
    at scala.Function7$$anonfun$tupled$1.apply(Function7.scala:34)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

The 0.2.1 version seems to be buggy

I use a function in one of the buildInfoKeys:

"buildTime" -> (() => System.currentTimeMillis)

If I am using source dependency on 7b0a05e or 413e861 it works as expected:

val buildTime = 1360810942882L

But if I am switching to binary dependency (0.2.1), I get the following:

val buildTime = "<function0>"

adding play version jvm version and jvm args

this plugin is super!

suggestion - would be great if you incorporate the example provided in #22 in the readme (home page of the gut repo)

also - can you please add support or play version JVM version and JVM args ?

again thank you!!

Support for setting multiple keys in BuildInfo.action style?

In this situation i want to set three BuildInfo keys from one sbt variable that contains them all - for this i have to run the regex three times, is it possible to set all the keys in one statement?

So in this case my 'flywayUrl' is jdbc:postgresql://myhost:myport/mydatabase?foo=bar

To match just the host i need to do this:

 BuildInfoKey.action("dbHost") { // Calculate the database host (extract from flywayUrl)
    val hostRegex = """jdbc:postgresql://(\w+):\d{2,5}/.+""".r
    flywayUrl.value match {
      case hostRegex(host) => host
    }
  }

Then i need to repeat this block twice more for the port and database, with different regexes

Any help appreciated, sorry if it's not really an "issue" - I couldn't find a freenode chatroom/suitable forum - please feel free to repoint me.

Edit: A regex matching all 3 parts i want would be: val flywayUrlRegex = """jdbc:postgresql://([\w-]+):(\d{2,5})/([\w_-]+)?.+""".r

list elements in the Json-Object a not properly formatted

for example libraryDependencies should be an Json-Array

libraryDependencies: ["org.scala-lang:scala-library:2.11.6", "com.typesafe.play:twirl-api:1.1.1", "org.scala-lang:scala-compiler:2.11.6", ...]

now it is a string like that: "List(org.scala-lang:scala-library:2.11.6, com.typesafe.play:twirl-api:1.1.1, org.scala-lang:scala-compiler:2.11.6, ... )"

BuildInfo should declare field types

In some cases (e.g. git tags) a BuildInfoKey can become Seq(), and the inferred type is Seq[Nothing]. This means that code that compiles in that case will stop compiling when build info changes.

These fields should have an explicit type declaration.

build version increments on every run

It seems that the build version number feature, makes the version number increment by 3, on every sbt run in my case. Has anyone else encountered that?

No idea why it increments by 3, but it seems it recompiles the buildinfo stuff for every sbt run, which correlates with why the number increments...

I've included in build.sbt:

buildInfoSettings

sourceGenerators in Compile <+= buildInfo

buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion, buildInfoBuildNumber)

buildInfoPackage := "buildVersioning"

buildInfoObject  := "Info"

EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Managed

and using addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.3.2" (in plugins.sbt, of course).

I'm not that fluent about source generators and the like, so not sure how to troubleshoot this, but am willing to learn!

My sbt configuration:

[info] This is sbt 0.13.5
[info] The current project is built against Scala 2.11.2
[info] Available Plugins: sbt.plugins.IvyPlugin, sbt.plugins.JvmPlugin, sbt.plugins.CorePlugin, sbt.plugins.JUnitXmlReportPlugin, play.twirl.sbt.SbtTwirl, com.scalapenos.sbt.prompt.SbtPrompt, com.typesafe.sbteclipse.plugin.EclipsePlugin, com.typesafe.sbt.SbtStartScript, spray.revolver.RevolverPlugin, org.netbeans.nbsbt.plugin.NetBeansPlugin, com.typesafe.sbt.SbtScalariform, sbtbuildinfo.Plugin, com.typesafe.sbt.SbtGit
[info] sbt, sbt plugins, and build definitions are using Scala 2.10.4

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.