Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SBT Basic Concepts

SBT Basic Concepts

Pishen Tsai

July 12, 2016
Tweet

More Decks by Pishen Tsai

Other Decks in Programming

Transcript

  1. build.sbt (*.sbt) name := "hello_world" version := "0.1.0-SNAPSHOT" scalaVersion :=

    "2.11.8" libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.4.8" //libraryDependencies += // "com.typesafe.akka" % "akka-actor_2.11" % "2.4.8" Setting[String] Setting[Seq[ModuleID]]
  2. build.sbt import java.util.Date def getTime() = new Date().getTime val baseVersion

    = "0.1.0" version := { println("Mom! I'm here!!") baseVersion + "_" + getTime() } class A() {...} object B {...}
  3. val a = settingKey[Int]("this is a") val demo = taskKey[Unit]("demo")

    Description, will be shown in > inspect SettingKey[Int] > show a > demo
  4. Implement the Settings val demo = taskKey[Unit]("demo") name := "hello_world"

    demo := { println("Hello, this is project " + name.value) } dependency > demo > inspect demo build.sbt
  5. Parallelization & deduplication val demo1 = taskKey[Unit]("demo1") val demo2 =

    taskKey[Unit]("demo2") val demo3 = taskKey[Unit]("demo3") demo1 := println("demo1") demo2 := println("demo2") demo3 := { demo1.value println("demo3") demo2.value demo1.value } demo1 demo2 demo3 demo2 demo1 demo3 build.sbt
  6. SBT is recursive ``The project directory is another build inside

    your build, which knows how to build your build.
  7. SBT is recursive ``The project directory is another build inside

    your build, which knows how to build your build.
  8. my-project/ └ src/main/scala/.../Main.scala └ Hello.scala └ anything.sbt └ build.sbt └

    project/ └ MyPlugin.scala └ target/ └ Main.class class A() {...} object B {...} val a = new A()
  9. my-project/ └ src/main/scala/.../Main.scala └ Hello.scala └ anything.sbt └ build.sbt └

    project/ └ MyPlugin.scala └ cool.sbt └ assembly.sbt └ target/ └ Main.class libraryDependencies += "joda-time" % "joda-time" % "2.9.4" addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3") val now = DateTime.now()
  10. my-project/ └ src/main/scala/.../Main.scala └ Hello.scala └ anything.sbt └ build.sbt └

    project/ └ MyPlugin.scala └ cool.sbt └ assembly.sbt └ project/ └ PluginOfMyPlugin.scala └ target/ └ Main.class
  11. pishen/annoy4s val compileNative = taskKey[Unit](...) import com.sun.jna.Platform import sys.process._ compileNative

    := { val lib = s"src/main/resources/${Platform.RESOURCE_PREFIX}/libannoy.so" val cpp = "src/main/cpp/annoyjava.cpp" s"g++ -o $lib -shared -fPIC $cpp".! } > compileNative https://github.com/pishen/annoy4s build.sbt
  12. KKBOX/spark-deployer libraryDependencies ++= Seq( "com.typesafe" % "config" % "1.3.0", "com.amazonaws"

    % "aws-java-sdk-s3" % "1.10.34", "com.amazonaws" % "aws-java-sdk-ec2" % "1.10.34", "org.pacesys" % "openstack4j" % "2.0.9" ) addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.0") https://github.com/KKBOX/spark-deployer project/plugins.sbt
  13. Configuration scope compile test * runtime staging production Global custom

    configurations : : : : : : name name name name name name "G" "A" "B" "C" "D" delegate
  14. Configuration scope compile test * runtime staging production : :

    : : : : compile compile compile compile compile compile Configuration Key
  15. Define Configurations lazy val Staging = config("staging") name := "G"

    name in Staging := "D" + name.value build.sbt > show name > show *:name > show staging:name > inspect staging:name Global
  16. Question 1 lazy val Staging = config("staging") version := "1.0"

    version in Staging := "1.0.1" name in Staging := "D" + version.value build.sbt > show staging:name D1.0? D1.0.1?
  17. Solution 1 name in Staging := "D" + (version in

    Staging).value inConfig(Staging)(Seq( name := "D" + version.value )) build.sbt
  18. Usage of Configuration lazy val Staging = config("staging") lazy val

    Production = config("production") val deploy = taskKey[Unit]("deploy") val servers = settingKey[Seq[String]]("servers") val baseSettings = Seq( deploy := {... servers.value ...} ) inConfig(Staging)(baseSettings) inConfig(Production)(baseSettings) deploy.sbt
  19. Usage of Configuration servers in Staging := Seq("192.168.0.1") servers in

    Production := Seq("140.112.172.1", ...) build.sbt > staging:deploy > production:deploy sbt-codedeploy https://github.com/gilt/sbt-codedeploy
  20. Task scope * :: name compile test assembly :: ::

    :: name name name name :: assembly Key Key
  21. Question 3 val demo = taskKey[Unit]("demo") version := "1.0" version

    in demo := "1.0.1" demo := println("D" + version.value) build.sbt > demo D1.0? D1.0.1? demo::version
  22. Usage of Task scope fullClasspath in assembly += baseDirectory.value /

    "production-resources" my-project/ └ src/main/ └ scala/... └ resources/application.conf └ build.sbt └ production-resources/ └ production.conf include "production.conf" build.sbt
  23. organization := "net.pishen" name := "my-project" version := "0.1.0-SNAPSHOT" crossScalaVersions

    := Seq("2.10.6", "2.11.8") > +publishLocal ~/.ivy2/local/ Project A libraryDependencies += "net.pishen" %% "my-project" % "0.1.0-SNAPSHOT" Project B ~/.ivy2/cache/
  24. Resolvers val r = "My Resolver" at "http://my-server/my-repository" val r

    = Resolver.sonatypeRepo("public") val r = Resolver.bintrayRepo("owner", "repo") val r = Resolver.sftp(...) val r = Resolver.... resolvers += r publishTo := Some(r) > publish
  25. Publish your own library via Bintray 1. Create an account

    on https://bintray.com/ 2. Install bintray-sbt https://github.com/softprops/bintray-sbt 3. Share your masterpiece to the world!