Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SBT Basic Concepts
Search
Pishen Tsai
July 12, 2016
Programming
680
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SBT Basic Concepts
Pishen Tsai
July 12, 2016
More Decks by Pishen Tsai
See All by Pishen Tsai
Introduction to Minitime
pishen
1
180
都什麼時代了,你還在寫 while loop 嗎?
pishen
2
760
Pishen's Emacs Journey
pishen
0
160
Scala + Google Dataflow = Serverless Spark
pishen
6
880
Shapeless Introduction
pishen
2
930
ScalaKitchen
pishen
1
490
sbt-emr-spark
pishen
1
170
My Personal Report of Scala Kansai 2016
pishen
0
440
annoy4s
pishen
0
120
Other Decks in Programming
See All in Programming
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
1
2k
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
720
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
340
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
7.8k
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
270
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
180
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
210
AIの中の人になってみる
htkym
0
120
typoなんかねぇよ
raspython3
0
550
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
110
リアルな遅延を測る仕様
kota_yata
1
130
Featured
See All Featured
Done Done
chrislema
186
16k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
500
The Cult of Friendly URLs
andyhume
79
7k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
BBQ
matthewcrist
89
10k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
580
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
420
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
430
Game over? The fight for quality and originality in the time of robots
wayneb77
1
250
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Transcript
SBT Basic Concepts @pishen
build.sbt
name := "hello_world" SettingKey[String] a function Setting[String]
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]]
> inspect libraryDependencies Setting: Seq[ModuleID] = List(...) > show libraryDependencies
List(...)
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 {...}
Define your own Key
SettingKey[T] TaskKey[T] InputKey[T] name, version compile run
val a = settingKey[Int]("this is a") val demo = taskKey[Unit]("demo")
Description, will be shown in > inspect SettingKey[Int] > show a > demo
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
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
SBT is recursive ``The project directory is another build inside
your build, which knows how to build your build.
SBT is recursive ``The project directory is another build inside
your build, which knows how to build your build.
my-project/ └ src/main/scala/.../Main.scala └ Hello.scala └ anything.sbt └ build.sbt └
target/ └ Main.class
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()
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()
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
Some examples
pishen/annoy4s src/main/cpp/annoyjava.cpp src/main/resource/linux-x86-64/libannoy.so win32-x86 darwin freebsd-x86 ... g++ https://github.com/pishen/annoy4s
pishen/annoy4s libraryDependencies += "net.java.dev.jna" % "jna" % "4.2.2" https://github.com/pishen/annoy4s project/plugins.sbt
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
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
Scopes
compile Key
test:compile Key Configuration
test:compile::fullClasspath Key Configuration other Key
Configuration scope compile test * runtime staging production Global custom
configurations : : : : : : name name name name name name "G" "A" "B" "C" "D" delegate
Configuration scope compile test * runtime staging production : :
: : : : compile compile compile compile compile compile Configuration Key
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
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?
Solution 1 name in Staging := "D" + (version in
Staging).value inConfig(Staging)(Seq( name := "D" + version.value )) build.sbt
Question 2 > compile Configuration? Key?
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
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
Task scope * :: name compile test assembly :: ::
:: name name name name :: assembly Key Key
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
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
Mixed scope test:compile::fullClasspath fullClasspath in (Test, compile) := {...}
Publishing
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.4.8" ~/.ivy2/cache/ Maven Central
Bintray JCenter ~/.ivy2/local/
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.4.8-SNAPSHOT" ~/.ivy2/cache/ Maven Central
Bintray JCenter ~/.ivy2/local/
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/
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
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!
> thanks @pishen