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

SBT Basic Concepts

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

SBT Basic Concepts

Avatar for Pishen Tsai

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!