èªç±ãå¹³çãããã¯ã¹åãããããªããã£ãå
ScalaMatsuri 2020 ã§ ‘èªç±ãå¹³çãããã¯ã¹åãããããªããã£ãå’ ãšããããŒã¯ã§ç»å£ããŸããã
ScalaMatsuri 2020 ã§ ‘èªç±ãå¹³çãããã¯ã¹åãããããªããã£ãå’ ãšããããŒã¯ã§ç»å£ããŸããã
sbt-projectmatrix 㯠sbt ã®ã¯ãã¹ãã«ããæ¹åããããã«ãåãå®éšãšããŠäœã£ãŠãããã©ã°ã€ã³ã§ãæ¬çš¿ã¯ç¬¬1åã第2åã第3åã«ç¶ã第4匟ã ã0.6.0 ããªãªãŒã¹ããã®ã§ããã§ç޹ä»ããã
sbt-projectmatrix ããã«ãã«è¿œå åŸã以äžã®ããã«ã㊠2ã€ã® Scala ããŒãžã§ã³ã䜿ã£ããããªãã¯ã¹ãã»ããã¢ããããã
ThisBuild / organization := "com.example"
ThisBuild / scalaVersion := "2.12.10"
ThisBuild / version := "0.1.0-SNAPSHOT"
lazy val core = (projectMatrix in file("core"))
.settings(
name := "core"
)
.jvmPlatform(scalaVersions = Seq("2.12.12", "2.13.3"))
ããã¯ããããã® scalaVersion ã«ãµããããžã§ã¯ããäœãã ++ ã¹ã¿ã€ã«ã®ã¹ããŒããã«ãªã¯ãã¹ãã«ããšéã£ãŠãããã¯äžŠåã«ãã«ããããããã¯å€ãã£ãŠããªãã
ååã§ã¯ % ã䜿ã£ãŠäŸåæ§ãã¹ã³ãŒãä»ãã§ããããšã玹ä»ããã
JVM2_13 ãšãããµãã£ãã¯ã¹ã远å ãã代ããã«ãsbt-projectmatrix 0.6.0 ãã JVM 軞㚠2_13 軞ã¯ããã©ã«ããšããŠãcoreJVM2_13 ã§ãªã¯ãæ®éã« core ãšã util ãšããååã®ãµããããžã§ã¯ããçæããããšã«ããã
Scala 3.0 ã¯çµã¿èŸŒã¿ã§ Scala 2.13.x ã«å¯Ÿããã€ã³ã¿ãŒãªãã©ããªãã£ãæã¡ã2.13.x ãã©ã³ãã§ãæè¿ã«ãªã£ãŠ TASTy reader ãšãã Scala 3.0 ã€ã³ã¿ãŒãªãã©ããªãã£æ©èœã远å ãããã詳现ã¯çããšããŠããããçšã㊠1ã€ã®ãµããããžã§ã¯ã㯠Dotty å¥ã®ãµããããžã§ã¯ã㯠2.13 ã䜿ããšãã£ãããšãå¯èœãšãªãã
æ¬æ¥ä»ãã§ Twitter ã® Build Team ã«å ¥ç€ŸããŸãããäžçäžã«ãã Twitter 瀟ã®ããããããŒããµããŒãããæ¬¡äžä»£ãã«ãã»ã·ã¹ãã ã®æ§ç¯ã«é¢ããããšã«ãªããŸãã
ãã®ããŒã ã¯ã¢ããªãã»ãã«ãããŒã«ã§ãã Pants ã®éçºã«é¢ãã£ãŠããŠã瀟å ã®ã·ã¹ãã ã Bazel ãžç§»è¡ãããã®ãåœé¢ã®è²¬åãšãªããšæããŸããããããããŒã»ãšã¯ã¹ããªãšã³ã¹ãéçºå¹çãšããããšã«é¢ããŠç±ãæããæã£ãŠããããŒã ãšäžç·ã«åãããšãããåãé¡ã£ãŠããä»äºãªã®ã§ãããŒã ã®äººãã¡ãæ°ãã課é¡ãšã®åºäŒããæ¥œãã¿ã«ããŠããŸãã
ãŸãããã®å ŽãåããŠéæž¡æã« DM ãªã©ã§ã倧äžå€«ã«ããŠãããšãã瀟å ã§åã®ããšãæšèŠããŠããããããããžã§ã¯ãã®ãªãã¡ãŒãªã©è²ã 声ããããŠãããçããã«æè¬ãããã§ãããããªå£°ããã£ãã®ã§å æ°ã«ãã£ãŠãããŸãããããããšãããããŸãã4æã«çŸ©åãµããã£ã«ã«ãå§ãŸã£ãŠããããããŸã§æéãç¡ããŠã§ããªãã£ããã«ããã£ãã·ã¥ãšã Selective functor ã¿ãããªäœæ¥ãããããScala Center ã®çŽ æŽãããæ¹ã ãšã³ã©ãããããšãã§ããã®ã§ãããããæå³ã§ã¯è²ã è¯ãã£ããªãšæããŸãã
EE Build team ã¯ãSan Francisco, Remote USããšãããã±ãŒã·ã§ã³ãããŸã åéäžã¿ãããªã®ã§ãèå³ã®ãã人ã¯å¿åããŠäžç·ã«äœæ¥ããŸãããã
æ¬çš¿ã§ã¯ Ãlafur ããã® olafurpg/sbt-ci-release ã䜿ã£ãŠ sbt ãã©ã°ã€ã³ã®ãªãªãŒã¹ãèªååããŠã¿ããsbt-ci-release ã® README 㯠Sonatype OSS åãã®æ®éã®ã©ã€ãã©ãªã®ãªãªãŒã¹ãåæã«æžãããŠãããsbt ãã©ã°ã€ã³ã®ãªãªãŒã¹ã«å¿ èŠãªå·®å以å€ã®è©³çŽ°ã¯ README ãåç §ããŠã»ããã
ãªãªãŒã¹ãèªååããããšãã®ãã®ããã¹ãã»ãã©ã¯ãã£ã¹ã ããsbt ãã©ã°ã€ã³ã®ãªãªãŒã¹ã«é¢é£ããŠç¹ã«å¬ããããšãããããã®æ¹æ³ã䜿ãããšã§ Bintray ã® sbt organization ã«ãŠãŒã¶ãŒã远å ããã«ãè€æ°äººã§ sbt ãã©ã°ã€ã³ã®ãªãªãŒã¹æš©éãå ±æããããšãå¯èœãšãªããããã¯ä»äºã§ã¡ã³ãããŠãããã©ã°ã€ã³ããããšãã«äŸ¿å©ã ã
sbt-release ã䜿ã£ãŠããå Žåã¯åé€ãããsbt-ci-release ã远å ããã
addSbtPlugin("org.foundweekends" %% "sbt-bintray" % "0.5.6")
addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.3")
version.sbt ãåé€ããã
sbt-dynver ãå€å°æããŠãã¿ã°ã®ä»ããŠããªãã³ãããã§ -SNAPSHOT ããŒãžã§ã³ã䜿ããããã«ãã:
ThisBuild / dynverSonatypeSnapshots := true
ThisBuild / version := {
val orig = (ThisBuild / version).value
if (orig.endsWith("-SNAPSHOT")) "2.2.0-SNAPSHOT"
else orig
}
ãã©ã°ã€ã³ã¯éåžž sbt-bintray ã䜿ã£ãŠãªãªãŒã¹ããã®ã§ãpublishTo ã bintray / publishTo ã«æ»ããpublishMavenStyle ã false ã«ããã
publishMavenStyle := false,
bintrayOrganization := Some("sbt"),
bintrayRepository := "sbt-plugin-releases",
publishTo := (bintray / publishTo).value,
publish ãèªåçã«ãªãªãŒã¹ããããã«ããŠã»ããã®ã§ãçŸåš bintrayReleaseOnPublish := false ãèšå®ããŠããå Žåã¯ãããåé€ããã
sbt 1.3.12 ããããªãªãŒã¹ãã¢ããŠã³ã¹ããããªãªãŒã¹ããŒãã®å®å šçã¯ããã«ãã - https://github.com/sbt/sbt/releases/tag/v1.3.12 ã
ç¹ã« Scala Center ã«ã瀌ãèšãããããã°å ±åãpull request ã¬ãã¥ãŒãã³ã³ããªãã¥ãŒã·ã§ã³ãã¡ãããšæ£ããæã«è¡ãããªã©ã¡ã³ã掻åãè¡ãã«ã¯ããçšåºŠæéãããããã5æäžã® sbt ã®ã¡ã³ã掻å㯠Scala Center ãã¹ãã³ãµãŒããŠããããDaryja ããå§ã Scala Center ã®ã¡ã³ããŒã¯çæ°è»œã«å ±åäœæ¥ãããã人ãã¡ã ã
sbt 1.3.11 ã§ launcher çµ±ååšãã«ãªã°ã¬ãã·ã§ã³ããããrepositories ãã¡ã€ã«ãç¡èŠããããšãã圢ã®ãã°ãåºããsbt 1.3.12 ã¯ãããä¿®æ£ããã #5583
é垞㯠project/build.properties ã
sbt.version=1.3.12
ãšæžãæããã ãã§ ok ã ããããããªãªãŒã¹ã«ã¹ã¯ãªããã®ä¿®æ£ãå«ãŸããŠããå ŽåãããããŸãå
šãŠã® JAR ãã¡ã€ã«ãäºãå
¥ã£ã *.(zip|tgz|msi) ã䜿ã£ãã»ããååã®äŸåæ§è§£æ±ºãéããªãããã€ã³ã¹ããŒã©ãŒã䜿ã£ãã€ã³ã¹ããŒã«ãæšå¥šãããã€ã³ã¹ããŒã©ãŒã¯ SDKMAN ãªã©ã«å
¬éãããã
sdk upgrade sbt
Homebrew ã®ã¡ã³ããã¯ãã£ãš brew äŸåæ§ã䜿ããããšããçç±ã§ JDK 13 ãžã®äŸåæ§ã远å ãã brew#50649ããã®ãããPATH ãéã£ãŠãã java ã JDK 8 ã 11 ã§ãã£ãŠã sbt ã JDK 13 ã§å®è¡ãããããã«ãªã£ãŠããŸãã
sbt ã JDK 13 ã§å®è¡ããã®ãåé¿ããã«ã¯ jEnv ãã€ã³ã¹ããŒã«ããããSDKMAN ã«ä¹ãæããå¿
èŠãããã
sbt 1.3.11 ããããªãªãŒã¹ãã¢ããŠã³ã¹ããããªãªãŒã¹ããŒãã®å®å šçã¯ããã«ãã - https://github.com/sbt/sbt/releases/tag/v1.3.11 ã
ç¹ã« Scala Center ã«ã瀌ãèšãããããã°å ±åãpull request ã¬ãã¥ãŒãã³ã³ããªãã¥ãŒã·ã§ã³ãã¡ãããšæ£ããæã«è¡ãããªã©ã¡ã³ã掻åãè¡ãã«ã¯ããçšåºŠæéãããããã5æäžã® sbt ã®ã¡ã³ã掻å㯠Scala Center ãã¹ãã³ãµãŒããŠããããDaryja ããå§ã Scala Center ã®ã¡ã³ããŒã¯çæ°è»œã«å ±åäœæ¥ãããã人ãã¡ã ã
é垞㯠project/build.properties ã
sbt.version=1.3.11
ãšæžãæããã ãã§ ok ã ããããããªãªãŒã¹ã«ã¹ã¯ãªããã®ä¿®æ£ãå«ãŸããŠããå ŽåãããããŸãå
šãŠã® JAR ãã¡ã€ã«ãäºãå
¥ã£ã *.(zip|tgz|msi) ã䜿ã£ãã»ããååã®äŸåæ§è§£æ±ºãéããªãããã€ã³ã¹ããŒã©ãŒã䜿ã£ãã€ã³ã¹ããŒã«ãæšå¥šãããã€ã³ã¹ããŒã©ãŒã¯ SDKMAN ãªã©ã«å
¬éãããã
sdk upgrade sbt
Homebrew ã®ã¡ã³ããã¯ãã£ãš brew äŸåæ§ã䜿ããããšããçç±ã§ JDK 13 ãžã®äŸåæ§ã远å ãã brew#50649ããã®ãããPATH ãéã£ãŠãã java ã JDK 8 ã 11 ã§ãã£ãŠã sbt ã JDK 13 ã§å®è¡ãããããã«ãªã£ãŠããŸãã
sbt ã JDK 13 ã§å®è¡ããã®ãåé¿ããã«ã¯ jEnv ãã€ã³ã¹ããŒã«ããããSDKMAN ã«ä¹ãæããå¿
èŠãããã
sbt 1.3.11 㯠lm-coursier ã 2.0.0-RC6-4 ãžãšã¢ããã°ã¬ãŒãããããã¯ãã£ãã·ã¥ã®å ŽæãšããŠã® $HOME/.coursier/cache ãã£ã¬ã¯ããªã廿¢ããŠãOS ã«ç¹å®ã®ãã£ã¬ã¯ããªã䜿ãããã«ãªã:
Jar Jar Abrams ã¯ãJava ã©ã€ãã©ãªãã·ã§ãŒãã£ã³ã°ãããŠãŒãã£ãªãã£ã§ãã Jar Jar Links ã®å®éšç Scala æ¡åŒµã ã
ã©ã€ãã©ãªäœè ã«ãšã£ãŠä»ã®ã©ã€ãã©ãªã¯è«žåã®å£ã ãä»ã®ã©ã€ãã©ãªã䜿ãããšã¯äœæ¥ã®äºéåãé¿ããä»ã®ã©ã€ãã©ãªã䜿ããããªããšããã®ã¯ããã«ã¹ã¿ã³ããŒããšèšãããããªãããããããã®äžæ¹ã§ãã©ã€ãã©ãªã远å ãã床ã«ããã¯ãŠãŒã¶åŽã«ãããšéæ¥çäŸåæ§ã远å ãããããšã«ãªããè¡çªãèµ·ããå¯èœæ§ãäžããããšã«ãªããããã¯åäžã®ããã°ã©ã å ã«ãã㊠1ã€ã®ããŒãžã§ã³ã®ã©ã€ãã©ãªããæãŠãªãããšã«ãããã
ãã®ãããªè¡çªã¯ããã°ã©ã ãã©ã³ã¿ã€ã ããã¬ãŒã ã¯ãŒã¯äžã§å®è¡ãããå Žåã«ããèµ·ãããsbt ãã©ã°ã€ã³ããã®äŸã ãSpark ãããã1ã€ã®ç·©åçãšããŠéæ¥çã©ã€ãã©ãªãèªåã®ããã±ãŒãžã®äžã«ã·ã§ãŒãã£ã³ã°ãããšããæ¹æ³ãããã2004幎㫠herbyderby (Chris Nokleberg) ãã㯠Jar Jar Links ãšããã©ã€ãã©ãªãåããã±ãŒãžåããããŒã«ãäœã£ãã
2015幎㫠Wu Xiang ããã Jar Jar Links ã䜿ã£ãã·ã§ãŒãã£ã³ã°ã®ãµããŒãã sbt-assembly ã«è¿œå ãããããã¯ååããªäžæ©ã ã£ããã課é¡ãæ®ã£ãŠãããåé¡ã® 1ã€ã¯ Scala ã³ã³ãã€ã©ã¯ ScalaSignature æ
å ±ã *.class ãã¡ã€ã«ã«åã蟌ãããJar Jar ããã®ããšãç¥ããªãããšã ã2020幎ã«ãªã£ãŠ Simacan瀟㮠Jeroen ter Voorde ããã ScalaSignature ã®å€æã sbt-assembly#393 ã«ãŠå®è£
ãããsbt 以å€ã§ãããã¯åœ¹ã«ç«ã€ãããããªãã®ã§ãç¬ç«ããã©ã€ãã©ãªã«æãåºãããããã Jar Jar Abrams ã ã
ã³ã¢ã«ã¯ shadeDirectory 颿°ãå®è£
ãã Shader ãªããžã§ã¯ããããã
package com.eed3si9n.jarjarabrams
object Shader {
def shadeDirectory(
rules: Seq[ShadeRule],
dir: Path,
mappings: Seq[(Path, String)],
verbose: Boolean
): Unit = ...
}
ãã®é¢æ°ã¯ãdir ã JAR ãã¡ã€ã«ãå±éãããã£ã¬ã¯ããªã§ããããšãæåŸ
ããã
sbt ã³ã¢ã»ã³ã³ã»ããã®ããŒã¯ããããšãå㯠sbt ãã«ãžã¥ã¢ã«ã«é¢æ°åãªãã«ãã»ããŒã«ãšèšã£ãŠããã颿°åããã°ã©ãã³ã°ã® 2ã€ã®ç¹åŸŽãšããŠããŒã¿ãå€åãããã®ã§ã¯ãªã immutable (äžå€)ãªããŒã¿æ§é ã䜿ãããšãšããã€ãã©ã®ããã«ã㊠effect (äœçš) ãåãæ±ããã«æ°ã䜿ã£ãŠããããšãæããããã
ãã®èгç¹ããèŠããšãã»ããã£ã³ã°åŒãšã¿ã¹ã¯ã¯ãã® 2ç¹ã«åèŽããŠãããšèããããšãã§ãã:
å¿åã»ããã£ã³ã°ã¯ Initialize[A] ã§è¡šããã以äžã®ããã«ãªã£ãŠãã:
sealed trait Initialize[A] {
def dependencies: Seq[ScopedKey[_]]
def evaluate(build: BuildStructure): A // approx
....
}
ååã®ä»ããã»ããã£ã³ã°ã¯ Setting ã¯ã©ã¹ã§è¡šããã:
sealed class Setting[A] private[Init] (
val key: ScopedKey[A],
val init: Initialize[A],
val pos: SourcePosition
) ....
sbt.Task ã¯å¯äœçšé¢æ° () => A ã®ã©ãããŒã ãšäŸ¿å®çã«èããŠããããã ããåãã¡ããcompile ã¯ã¿ã¹ã¯ã ããšèšããšããã®æèã§ã®ã¿ã¹ã¯ã¯ Initialize[Task[A]] ã§è¡šããããã€ãŸãããã㯠Task[A] åãè¿ãã»ããã£ã³ã°ã ã
ãã㯠Def.task ã®æ»ãå Def.Initialize[Task[A]] ãèŠãããšã§ç¢ºèªããããšãã§ããã
Def.task ã¯ã¿ã¹ã¯ (Def.Initialize[Task[A]]) ã® Applicative åæããšã³ã³ãŒãããããã®ãã¯ãã ã以äžã® task1ãtask2ãtask3 ãèå¯ãã:
lazy val task1 = taskKey[Int]("")
lazy val task2 = taskKey[Int]("")
lazy val task3 = taskKey[Int]("")
task1 := 1
task2 := 2
task3 := {
val t1 = task1.value
val t2 = task2.value
t1 + t2
}
ãããæ§ã¿ãã«æ§æã§æžãäžããšãããªã:
build.sbt ã¯ãèªåçãªäžŠååŠçãè¡ãã¿ã¹ã¯ã»ã°ã©ããå®çŸ©ããããã® DSL ã ãã¿ã¹ã¯å士ã®ã¡ãã»ãŒãžã»ããã·ã³ã°ã¯ something.value ãã¯ãã§è¡šããããã㯠Applicative åæ (task1, task2) mapN { case (t1, t2) => .... } ããšã³ã³ãŒãããã
é·ãèµ°ã£ãŠãã task1 ããããšããéäžã§ task2 ãšéä¿¡ã§ããä»çµã¿ãããã°ãããšæã£ãŠããã

é垞㯠task1 ããµãã¿ã¹ã¯ã«åããããšã§ããã解決ããããããããããå®è£
ããã®ã¯äžççžã§ã¯ãããªãããšããããäŸãã°ãZinc ã«ååã ãã³ã³ãã€ã«ããŠãæ®ãã¯åŸã§ç¶ããŠäžãã? ããã㯠Coursier ã«è§£æ±ºã ãè¡ã£ãŠå®éã®ããŠã³ããŒãã¯åŸã§ãšã©ãèšãã°ããã ããã?
ãããå°ãšã㊠task1 ãäœããã® JSON ãã¡ã€ã«ãçæããŠãtask2 ã¯ãã¡ã€ã«ãçŸãããŸã§åŸ
ã£ãŠããããèªã¿èŸŒããšããããæ¹ãèãããããJSON ãã¡ã€ã«ã®ä»£ããã« Promise[A] ã®ãããªäžŠè¡ããŒã¿æ§é ã䜿ã£ãŠæ¹åããããšãã§ãããããããåŸ
æ©ãšããåä»ãªãã®ãæ®ã£ãŠãããsbt ã¯äžŠåã«å®è¡ããã¿ã¹ã¯ã®æ°ãéã£ãŠããã®ã§ãåŸ
æ©ã®ããã«æ ã䜿ãã®ã¯ãã£ãããªããDaniel ããã® Thread Pools ã«ãã®èŸºãã®äºãè¯ããŸãšãŸã£ãŠãããä»åããã®ã¯å·®ãåœããäœæ¥ãäžåè¡ããªãããããã³ã° IO ããŒãªã³ã°ãšèããããšãã§ãããšæãã
scala.concurrent.Promise ã®ã©ãããŒãå®è£
ã㊠Def.promise ãšåŒãã ãå
·äœäŸã§èª¬æãã:
val midpoint = taskKey[PromiseWrap[Int]]("")
val longRunning = taskKey[Unit]("")
val task2 = taskKey[Unit]("don't call this from shell")
val joinTwo = taskKey[Unit]("")
// Global / concurrentRestrictions := Seq(Tags.limitAll(1))
lazy val root = (project in file("."))
.settings(
name := "promise",
midpoint := Def.promise[Int],
longRunning := {
val p = midpoint.value
val st = streams.value
st.log.info("start")
Thread.sleep(1000)
p.success(5)
Thread.sleep(1000)
st.log.info("end")
},
task2 := {
val st = streams.value
val x = midpoint.await.value
st.log.info(s"got $x in the middle")
},
joinTwo := {
val x = longRunning.value
val y = task2.value
}
)
ãŸããmidpoint ãšãã PromiseWrap[Int] ã®ã¿ã¹ã¯ãäœããã³ãã³ãåŒã³åºãã®åºŠã«ãã¬ãã·ã¥ãª promise ãæ¬²ããã®ã§ã¿ã¹ã¯ã䜿ããæ¬¡ã«ãlongRunning ãšããã¿ã¹ã¯ããã£ãŠãããã¯éäžã§ promise ãè£å®ãããtask2 㯠midpoint.await.value ã«äŸåãããããã¯ãmidpoint ã«æ ŒçŽããã promise ãå®äºãããŸã§ sbt ã®ã¹ã±ãžã¥ãŒã©ãŒã¯ task2 ãéå§ããªãããšãæå³ããã
Google ã®ãã«ãã€ã³ãã© Blaze (çŸåšã¯ Bazel ãšããŠãªãŒãã³ãœãŒã¹åãããŠãã) ã®ããšãç¥ã£ãŠãã Scala ã®ããŒã«ãã§ã€ã³ã«ã䌌ããããªä»çµã¿ã欲ãããšãã£ãšæãç¶ããŠãããããã¯ç¹ã«ç¬åµçãªçºæ³ãšããèš³ã§ã¯ç¡ããPeter Vlugter ãããš Ben Dougherty ããã® nailgun Zinc ã§ã®æ©èœ (Pants ã§äœ¿ãããŠãã?) ããKrzysztof Romanowski ããã® Hoarder ãªã©å è¡ç ç©¶ãããããããã¯ãäœæ¥ãã£ã¬ã¯ããªã«åãã㊠Zinc Analsis ãã¡ã€ã«å ã«æ ŒçŽãããŠãã絶察ãã¹ã倿ãããšããã¢ã€ãã£ã¢ããæãç«ã£ãŠããã
åã®äœæ¥ã®è©³çްã«å ¥ãåã«ãåé¡ã¹ããŒã¹ããã£ãšãã¢ãããã
Akka ã® akka-actor/compile ã sbt 1.3.10 ã§ãã«ããããšãã®ããã«ãªã:
cd ~/work/quicktest/
git clone git@github.com:akka/akka.git akka-0
cd akka-0
sbt
akka > akka-actor/compile
[info] Generating 'Tuples.scala'
[info] Generating 'Functions.scala'
[info] Updating
[info] Resolved dependencies
[info] Updating
[info] Formatting 22 Java sources...
[info] Reformatted 0 Java sources
[info] Compiling 191 Scala sources and 28 Java sources to /Users/eed3si9n/work/quicktest/akka-0/akka-actor/target/scala-2.12/classes ...
....
[success] Total time: 39 s, completed May 6, 2020 1:53:36 PM
å¥ã®äººãåãããšãããã®ãåçŸãããã®ã§ããã®ãã£ã¬ã¯ããªããšå¥ã®å Žæã«ã³ããŒãã:
Zinc 1.4.0-M1 ããªãªãŒã¹ãããããã¯ããŒã¿çã§ãã£ãŠå°æ¥ã® 1.4.x ãšã®äºææ§ã¯ä¿èšŒãããªãããšã«æ³šæããŠã»ããããã ã1.3.x ãšæ¯èŒçè¿ãã³ããããéžãã ã®ã§å®çšæ§ã¯é«ãã¯ãã ã
java.util.Date ã®äœ¿çšã java.time ç³»ãžãšçœ®ãæãã zinc#714 by @slandelleZinc 㯠Scala ã®ããã®å·®åã³ã³ãã€ã©ã ãZinc 㯠Scala 2.10 ~ 2.13 ãš Dotty ãã³ã³ãã€ã«ããããšãå¯èœã ãããããŸã§ã®æ Zinc ãã®ãã®ã¯ Scala 2.12 ã§å®è£ ãããŠããããã㯠Scala 2.12 ã§å®è£ ãããŠãã sbt 1.x ãšããŠã¯åé¡ç¡ãããZinc ã 2.13 ã§ãã¯ãã¹ãã«ãããŠæ¬²ãããšããèŠæã¯åãããã£ãã
ã©ããã Gatling 㯠Zinc ãã©ã€ãã©ãªãšããŠäœ¿ã£ãŠããããããGatling ã®ã³ã¢éçºè ã® Stephane Landelle ããã¯ã¢ããããŒãã«å¿ èŠãªããããéã£ãŠããããæåŸã«åãããå¿ èŠããã£ãäœæ¥ã¯å ¥ãçµãã ãµããããžã§ã¯ããè§£ãã»ãããŠåé ç·ããããšã ããããã«ã¯åãæšæ¥æžãã sbt-projectmatrix ã䜿ã£ãã
Li Haoyi ããã Mill ã Scala 2.13 ã§æžãã®ã«ãããåŸ ã£ãŠãããããããæ¥œãã¿äžãã :)
sbt-projectmatrix 㯠sbt ã®ã¯ãã¹ãã«ããæ¹åããããã«ãåãå®éšãšããŠäœã£ãŠãããã©ã°ã€ã³ã§ãæ¬çš¿ã¯åã åãååã«ç¶ã第3匟ã ã0.5.0 ããªãªãŒã¹ããã®ã§ããã§ç޹ä»ããã
sbt-projectmatrix ããã«ãã«è¿œå åŸã以äžã®ããã«ã㊠2ã€ã® Scala ããŒãžã§ã³ã䜿ã£ããããªãã¯ã¹ãã»ããã¢ããããã
ThisBuild / organization := "com.example"
ThisBuild / scalaVersion := "2.12.10"
ThisBuild / version := "0.1.0-SNAPSHOT"
lazy val core = (projectMatrix in file("core"))
.settings(
name := "core"
)
.jvmPlatform(scalaVersions = Seq("2.12.10", "2.11.12"))
ãã㯠coreJVM2_11 ãš coreJVM2_12 ãšãããµããããžã§ã¯ããäœãã ++ ã¹ã¿ã€ã«ã®ã¹ããŒããã«ãªã¯ãã¹ãã«ããšéã£ãŠãããã¯äžŠåã«ãã«ããããããã¯å€ãã£ãŠããªãã
ååã§ã¯åã§è€æ°ã®æ¬¡å ã衚çŸã§ãã VirtualAxis ã玹ä»ããã
0.4.0 ã¯çµæ§ããç·ãã£ãŠããããå®éã«äœ¿ã£ãŠã¿ããšäžäŸ¿ãªç¹ããã£ãããŸã㯠% æ§æãç¡ãããšã ã
ãµããããžã§ã¯ãéã§ Test ã³ã³ãã£ã®ã¥ã¬ãŒã·ã§ã³ããã ãäŸåããããCompile å士ãTest å士ã§äŸåãããšããã®ã¯è¯ãããããšã ã0.5.0 㯠% ã远å ããŠãããå¯èœãšããã
lazy val app = (projectMatrix in file("app"))
.dependsOn(core % "compile->compile;test->test")
.settings(
name := "app"
)
.jvmPlatform(scalaVersions = Seq("2.12.10"))
lazy val core = (projectMatrix in file("core"))
.settings(
name := "core"
)
.jvmPlatform(scalaVersions = Seq("2.12.10", "2.13.1"))
Project ã«ããæ©èœã®äžã€ãšã㊠.configure(...) ã¡ãœãããšãããã®ãããããã㯠Project => Project 颿°ã®å¯å€é·åŒæ°ãåãåããé æ¬¡é©çšããã ãã®ãã®ã ãåãåãæ±ã£ãŠãããã«ãã«ãããããŸã«åºãŠããã®ã§ .configure(...) ããããš Project ãã ProjectMatrix ã«ç§»æ€ãããããªãã
2014幎3æã« Lightbend瀟 (åœæ Typesafe瀟) ã«å ¥ç€Ÿãããä¿¡ããããªããã㪠6幎ã®åŸã2020幎4æ7æ¥ããã£ãŠéè·ãšãªã£ããLightbendãããŒãããŒå瀟ã顧客ããããŠã«ã³ãã¡ã¬ã³ã¹ãªã©ã§åºäŒã£ãè²ããªäººãšã€ãªãããæã£ããäžç·ã«äœæ¥ããæ©äŒãããããã®ã¯æè¬ããŠãããæ¯ãè¿ããš COVID-19åã®æä»£ã§ãšãŒããããã¢ãžã¢ãåç±³ãªã©ãæ°ã¶æããšã«é£ã³åã£ãŠã«ã³ãã¡ã¬ã³ã¹ã«åºãã瀟å å宿ãè¡ã£ãŠããã®ãçŸå®é¢ãããŠæããã
以äžã¯éå»6幎ã®ç°¡åãªæ¯ãè¿ãã ã
Scala ãè¶£å³ã§å§ããã®ã¯ 2009幎ã®çµããé ãªã®ã§ã2014å¹Žã®æç¹ã§ã¯ 4幎ãããã¯æžããŠããã®ã§ã¯ãªãããäžåºŠãç¬ç¿ Scalazããçµãã£ãŠãé¢é£ãããã¿ã§æåã® nescala ã®ããŒã¯ãè¡ã£ãã10åãããã® sbt ãã©ã°ã€ã³ãäœã£ãŠãStackoverflow ã§ãè¯ã掻åããŠãã
3æã« Lightbend瀟ã®ããŒãªã³ã°ããŒã (åœæã¯ Typesafe瀟ãQ課ã) ã«å ¥ç€Ÿãããåœæã®ã¡ã³ããŒã¯ Josh Sereth ãš Toni CuneiãJosh ãš sbt ã®ã¡ã³ããããã®ã¯ç¢ºãã«ä»äºã®åæ ã ãã©ããä»äºã¯æŠç¥ãããã¯ãé£é¢ãšããããåŠã³ã®å€ã顧客ããªãã³ãªãã®ã倧åã ã£ããå ¥ç€ŸããçŽåŸã«é¡§å®¢å ã«åœå ç·ã§é£ãã§ãApache Ivy ã®ã³ãŒããèªãã ããããã¡ã€ãªã³ã°ãããããã®ãèŠããŠãããæåã¯é¢é£ãã£ãããããã« sbt ã®äžã§ã¯ã©ã€ãã©ãªäŸåæ§åšããæãæ £ãããã«ãªã£ãã
2014幎5æã«ã¯ sbt ã®ããŒãžã§ã³çªå·ã 0.13.2 ãã 0.13.5 ãšé£ã°ã㊠sbt 1.x ã·ãªãŒãºã®ãã¯ãããžãŒã¬ãã¥ãŒãšãããå¿ èŠãªæ©èœãå®éšçã«å°å ¥ããŠããããšã§ sbt 1.x ãšã®å·®ã倧ãããªãéããªãããã«ãããšããã¢ã€ãã£ã¢ã ã£ãã
sbt 0.13.6 ã«ãªã£ãŠãæªè§£æ±ºã®äŸåæ§ã®ãšã©ãŒãè¶³ããªãäŸåæ§ã®æšã§è¡šç€ºããããeviction warningãupdateOptions ã§ã® withLatestSnapshots ãªã©åã远å ããã©ã€ãã©ãªäŸåæ§åšãã®æ©èœãåºãŠããããã«ãªãã
2014幎åŸåã«ã¯ Q課㯠Typesafe Reactive Platform v1 ã®ããã®ã€ã³ãã©äœããè¡ã£ãããã㯠Toni ãå®è£ ãã Dbuild ãå ã«ããåçšé åžããã±ãŒãžã ã
2015幎3æãJosh ãšäžç·ã«åã®æåã® Scala Days ã®ããŒã¯ ‘The road to sbt 1.0 is paved with server’ ãè¡ã£ããåœæã®åããèŠããš Josh ã«ã¯ sbt ã«é¢ããç¡éã®ç¥èŠã«å¯ãã§ããããã«èŠããã
å
é±ã¯ãScala ã§ãŠãŒã¶ã©ã³ãããèŠåãåºãä»çµã¿ã®ææ¡ã§ãã #8820 ã«ã€ããŠæžãããäŸãšã㊠ApiMayChange ã¢ãããŒã·ã§ã³ãå®è£
ããã
package foo
import scala.annotation.apiStatus, apiStatus._
@apiStatus(
"should DSL is incubating, and future compatibility is not guaranteed",
category = Category.ApiMayChange,
since = "foo-lib 1.0",
defaultAction = Action.Warning,
)
implicit class ShouldDSL(s: String) {
def should(o: String): Unit = ()
}
ããã¯å§ããšããŠã¯äžå¿äœ¿ãããã©ããå°ãåé·ã ããããªãããã® API ã¹ããŒã¿ã¹ãé »ç¹ã«äœ¿ãããå Žåãã©ã€ãã©ãªäœè ãç¬èªã®ã¹ããŒã¿ã¹ã¢ãããŒã·ã§ã³ãå®çŸ©ã§ãããšå¬ãããšæãã仿¥ã¯ãã®æ¹æ³ãèããã
ãã®åã«å°ãè£æ¹ã®è§£èª¬ãå¿
èŠãšãããã³ã³ãã€ã©ãã¢ãããŒã·ã§ã³ãèŠãæãã®æ
å ±ã¯ AnnotationInfo ãšããŠæž¡ãããåŒæ°ã¯æ§ææšã§è¡šããããããã«ãã£ãŠã³ãŒã«ãµã€ãã®ãœãŒã¹ã³ãŒãã¯ããããã¢ãããŒã·ã§ã³ã®ã³ãŒããã³ã³ã¹ãã©ã¯ã¿ã§äœããã£ããªã©ã®äºã¯åãããªããäžæ¹ãã¢ãããŒã·ã§ã³ã¯ã©ã¹ã«ã¿ã°ä»ããããã¢ãããŒã·ã§ã³ã®ããšã¯åããã
ã¢ãããŒã·ã§ã³ã®ã«ä»ããããšãåæã«äœãããã¢ãããŒã·ã§ã³ã¯ã¡ã¿ã¢ãããŒã·ã§ã³ãšåŒã°ããããã䜿ãããšã§ apiStatus ã®ç¶æ¿ãè¡ãããšãã§ãã:
import scala.annotation.{ apiStatus, apiStatusCategory, apiStatusDefaultAction }
import scala.annotation.meta._
@apiStatusCategory("api-may-change")
@apiStatusDefaultAction(apiStatus.Action.Warning)
@companionClass @companionMethod
final class apiMayChange(
message: String,
since: String = "",
) extends apiStatus(message, since = since)
category ã defaultAction ã extends apiStatus(....) ã§æž¡ãã®ã§ã¯ãªã @apiStatusCategory ãš @apiStatusDefaultAction ã䜿ã£ãŠæå®ããã
äžã©ã€ãã©ãªäœè ãšããŠãScala ã§ã¡ãœãããã¿ã°ä»ãããŠã«ã¹ã¿ã ã®ã³ã³ãã€ã©èŠåããšã©ãŒãçºåã§ãããšãããªãšåããæã£ãŠãããäœæ æå³çã«ã³ã³ãã€ã©ãšã©ãŒãåºãå¿ èŠãããã®ããšæããããããªããäžã€ã®ãŠãŒã¹ã±ãŒã¹ãšããŠã¯ãAPI ã廿¢ããåŸã§ãã€ã°ã¬ãŒã·ã§ã³ã®ããã®ã¡ãã»ãŒãžã衚瀺ãããããšã ã
Restligeist macro: n. A macro that fails immediately to display migration message after implementation has been removed from the API.
— âugene yokotâ (@eed3si9n) August 30, 2016
åã¯ããã Restligeist macroãã€ãŸãå°çžéãã¯ããšåŒãã§ãããäŸãã°ãsbt 1.3.8 ã«ãã㊠<<= ã䜿ããšä»¥äžã®ãšã©ãŒã¡ãã»ãŒãžãèµ·åæã«è¡šç€ºãããã
/tmp/hello/build.sbt:13: error: `<<=` operator is removed. Use `key := { x.value }` or `key ~= (old => { newValue })`.
See http://www.scala-sbt.org/1.x/docs/Migrating-from-sbt-013x.html
foo <<= test,
^
[error] sbt.compiler.EvalException: Type error in expression
[error] Use 'last' for the full log.
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?
ããå®çŸå¯èœãšããã®ã¯è¯ãããšã ãã©ãããããããã¯ãã䜿ããªããã°ãããªãã®ããã®ãä»°ã
ãããåç°ããã«ãããš Haskell ã ãšãããããã®ããšã¯åã·ã°ããã£ã« Whoops ãšæžãã ãã§ã§ããããã:
-- | This function is being removed and is no longer usable.
-- Use 'Data.IntMap.Strict.insertWith'
insertWith' :: Whoops "Data.IntMap.insertWith' is gone. Use Data.IntMap.Strict.insertWith."
=> (a -> a -> a) -> Key -> a -> IntMap a -> IntMap a
insertWith' _ _ _ _ = undefined
2019幎3æã«å㯠scala/scala ã« #7790 ãšãã pull request ãéã£ãŠ @compileTimeError ãšããã¢ãããŒã·ã§ã³ãææ¡ãããã¬ãã¥ãŒã®æµããåãå
¥ããŠãããã¡ pull request 㯠@restricted ã¢ãããŒã·ã§ã³ãš configurable ãªèŠåãªãã·ã§ã³ -Wconf ãšãããã®ã«å€ãã£ãŠãã£ãã@restricted ã¯ã©ãã«ã«ãã£ãŠã¡ãœããã®ã¿ã°ä»ããè¡ãã-Wconf ã¯ãã®ã¿ã°ã -Wconfig apiMayChange:foo.*:error ãšãããµãã«ããŠèŠåããšã©ãŒã«ãšã¹ã«ã¬ãŒããããããšãã§ãããšãããã®ã ã
Giter8 0.12.0 ã« giter8-launcher ãšããå°ããªã¢ããªã远å ããããã®ã¢ããªã®ç®ç㯠Giter8 ãã³ãã¬ãŒãã®æ¯ãèããäºæž¬å¯èœã«ããããšã«ãããçŸç¶ã ãšããã³ãã¬ãŒãäœè ã Giter8 ããŒãžã§ã³ X ãæ³å®ããŠãã³ãã¬ãŒããäœã£ããšããŠããŠãŒã¶ãŒåŽã¯ “sbt new” ã«å梱ãããå¥ãª Giter8 ããŒãžã§ã³ Y ã䜿ã£ãŠå®è¡ãããŠããã
sbt ã®è¯ãã¢ã€ãã£ã¢ã®äžã€ã«ãŠãŒã¶ãŒãã©ã®ããŒãžã§ã³ã® sbt ã¹ã¯ãªãããã€ã³ã¹ããŒã«ããŠããŠãã³ã¢ã® sbt ããŒãžã§ã³ã¯ãã«ãäœè
ã project/build.properties ãã¡ã€ã«ã䜿ã£ãŠæå®ã§ãããšãããã®ããããããã«ãã£ãŠãèªåã®ãã·ã³ã§ããåäœããªããåé¡ã倧å¹
ã«æ¹åããããgiter8-launcher 㯠sbt ã«ããã sbt-launcher ã«åæ§ã®ãã®ã ãgiter8-launcher ã¯ãã³ãã¬ãŒãã®ã¯ããŒã³ããŠãproject/build.properties ãã¡ã€ã«ãèªã¿èŸŒãã§ããã³ãã¬ãŒãã®ã¬ã³ããªã³ã°ã«çšããå®éã® Giter8 ããŒãžã§ã³ã決å®ããã
ãã³ãã¬ãŒãäœè
㯠project/build.properties ãã¡ã€ã«ãçšããŠä»¥äžã®ããã« Giter8 ããŒãžã§ã³ãæå®ã§ãã:
giter8.version=0.12.0
sbt-projectmatrix 㯠sbt ã®ã¯ãã¹ãã«ããæ¹åããããã«ãåãå®éšãšããŠäœã£ãŠãããã©ã°ã€ã³ã§ãæ¬çš¿ã¯åç¯ã«ç¶ã第2匟ã ã0.4.0 ããªãªãŒã¹ããã®ã§ããã§ç޹ä»ããã
sbt-projectmatrix ããã«ãã«è¿œå åŸã以äžã®ããã«ã㊠2ã€ã® Scala ããŒãžã§ã³ã䜿ã£ããããªãã¯ã¹ãã»ããã¢ããããã
ThisBuild / organization := "com.example"
ThisBuild / scalaVersion := "2.12.10"
ThisBuild / version := "0.1.0-SNAPSHOT"
lazy val core = (projectMatrix in file("core"))
.settings(
name := "core"
)
.jvmPlatform(scalaVersions = Seq("2.12.10", "2.11.12"))
ãã㯠coreJVM2_11 ãš coreJVM2_12 ãšãããµããããžã§ã¯ããäœãã ++ ã¹ã¿ã€ã«ã®ã¹ããŒããã«ãªã¯ãã¹ãã«ããšéã£ãŠãããã¯äžŠåã«ãã«ããããããã¯å€ãã£ãŠããªãã
åç¯ã§ã¯ãã®èãæ¹ãã¯ãã¹ã»ãã©ãããã©ãŒã ãã¯ãã¹ã»ã©ã€ãã©ãªãžãšå¿çšãããããšãèããã
Support for mixed-style matrix dependencies #13 ãš Support for pure Java subprojects #14 ãšãã 2ã€ã® issue ãç«ãŠãããŠã0.2.0 ã®èšèšã«éçãããããšã«æ°ã¥ããã0.2.0 ã¯ååã¯ä»¥äžã®ããã«è¡šçŸããã:
final class ProjectRow(
val idSuffix: String,
val directorySuffix: String,
val scalaVersions: Seq[String],
val process: Project => Project
) {}
ããã¯ãåã远跡ã§ãããã® (äŸãã°ãã©ãããã©ãŒã ) ã 1ã€ã®æ¬¡å ãšãã©ã¹ã§ç¹å®ã® Scala ããŒãžã§ã³ã«éå®ãããå ±åããã issue ã¯ãããªãã¯ã¹å ã®åãå¥ã®ãããªãã¯ã¹å ã®åãžãšå°ã匱ããå¶éãçšããŠé¢é£ä»ããããšããŠãããšæå³ã§åãåé¡ã®å€çš®ã§ãããšèšããã
Pamflet ã¯çãææžãç¹ã«ãªãŒãã³ãœãŒã¹ã»ãœãããŠã§ã¢ã® ãŠãŒã¶ã»ããã¥ã¡ã³ããå ¬éããããã®ã¢ããªã ã
Pamflet 0.8.2 ã¯ã¢ãã¹ããŒã¹ã®ã¿ã€ããã§ã€ã¹ã SFMono ãžãšå€æŽããããŸããBlueprint ãã Bootstrap ã«ç§»è¡ãããšãã«äžæã«å°å ¥ããããã³ã¯ã®æåè²ãå ã«æ»ãã
äŸåæ§ãªãŸã«ã㌠(dependency resolver)ããããã¯ããã±ãŒãžãããŒãžã£ãŒã¯ããŠãŒã¶ãŒã«ãã£ãŠäžããããå¶çŽã®éåãå ã«ççŸããªãã¢ãžã¥ãŒã«ã®éåãæ±ºå®ããããã°ã©ã ã ãéåžžãã®å¶çŽèŠä»¶ã¯ã¢ãžã¥ãŒã«åãšãããã®ããŒãžã§ã³çªå·ãå«ããJVM ãšã³ã·ã¹ãã ã«ããã Maven ã¢ãžã¥ãŒã«ã¯ organization (group id) ãæå®ã«çšããããããã®ä»ã®å¶çŽãšããŠãããŒãžã§ã³ç¯å²ãé€å€ã¢ãžã¥ãŒã«ãããŒãžã§ã³ãªãŒããŒã©ã€ããªã©ãããã
ããã±ãŒãžã³ã°ã¯å€§ãŸãã« OS ããã±ãŒãž (HomebrewãDebian packages ãªã©)ãç¹å®ã®ããã°ã©ãã³ã°èšèªã®ã¢ãžã¥ãŒã« (CPANãRubyGemãMaven ãªã©)ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã®ãšã¯ã¹ãã³ã·ã§ã³ (Eclipse ãã©ã°ã€ã³ãIntelliJ ãã©ã°ã€ã³ãVS Code extensions ãªã©) ã® 3ã€ã®ã«ããŽãªãŒãããã
èãå§ãã®è¿äŒŒãšããŠã¢ãžã¥ãŒã«äŸåæ§ã DAG (æåéå·¡åã°ã©ã) ã ãšèããããšãã§ãããããã¯äŸåæ§ã°ã©ããããã㯠“deps graph” ãšåŒã°ããã以äžã®ãã㪠2ã€ã®ã¢ãžã¥ãŒã«äŸåæ§ããããšãã:
a:1.0ãããã¯ããã« c:1.0 ã«äŸåãããb:1.0ãããã¯ããã« c:1.0 ãš d:1.0 ã«äŸåããã+-----+ +-----+
|a:1.0| |b:1.0|
+--+--+ +--+--+
| |
+<-------+
| |
v v
+--+--+ +--+--+
|c:1.0| |d:1.0|
+-----+ +-----+
a:1.0 ãš b:1.0 ã«äŸåãããšãa:1.0ãb:1.0ãc:1.0ããã㊠d:1.0 ãåŸããããããã¯æšãæ©ããŠããã ãã ã
çããããã«ã¡ã¯ãsbt ãããžã§ã¯ãã代衚ã㊠sbt 1.3.0-RC1 ãã¢ããŠã³ã¹ããŸãããã㯠sbt 1 ã®ãã£ãŒãã£ãŒãªãªãŒã¹ç¬¬3匟ã§ããã€ããªäºææ§ã¯ç¶æãã€ã€æ°æ©èœã«ãã©ãŒã«ã¹ãåœãŠããªãªãŒã¹ãšãªã£ãŠãããsbt 1 㯠Semantic Versioning ã«ããšã¥ããŠãªãªãŒã¹ãããã®ã§ããã©ã°ã€ã³ã¯ sbt 1.x ã·ãªãŒãºäžæ©èœããããšãæåŸ ãããŠããã
sbt 1.3 ã®äž»ãªæ°æ©èœã¯ããã©ã«ãã§ã® Coursier ã䜿ã£ãã©ã€ãã©ãªç®¡çãClassLoader ã¬ã€ã€ãªã³ã°ãIO ã®æ¹åããã㊠super shell ã ããããã®æ©èœã®çµã¿åããããã«ãã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããããšãé¡ã£ãŠããã
clean;Test/compile; ã§åäœããããã«ãªã£ãã #4456 by @eatkinssbt.internal.inc.ZincUtil 以äžã®é¢æ°ã§ LM ã䜿ããã®ã ZincLmUtil ã«ç§»åããŠãZinc ãã LM ã«äŸåããªãããã«ãªã£ãã zinc#655 by @dwijnandsbt 1.3.0 ã¯ã©ã€ãã©ãªç®¡çã« Coursier ãæ¡çšãããCoursier ã¯ãã©ã€ãã©ãªäŸå解決ãè¡ããã®ã§ Ivy ã«äŒŒãŠããããããé«éåãæ±ã㊠Alexandre Archambault ãã (@alexarchambault) ã«ããäžãã Scala ã§ãªã©ã€ãããããã®ã ã
泚æ: ç¶æ³ã«ãã£ãŠã¯ Coursier ã®è§£æ±ºçµæã¯ Ivy ãšç°ãªãããšããããã (äŸãã°ããªã¢ãŒãã® -SNAPSHOT 㯠24æéãã£ãã·ã¥ããã)ãã©ã€ãã©ãªç®¡çã Apache Ivy ã«æ»ãããå Žåã¯ã以äžã®èšå®ã build.sbt ã«æžãããšãã§ãã:
å»å¹Ž sbt ã®ã¯ãã¹ãã«ããæ¹åããããã«ãsbt-projectmatrix ãšããå®éšçãã©ã°ã€ã³ãæžããã0.2.0 ããªãªãŒã¹ããã®ã§ããã§ç޹ä»ããã
sbt-projectmatrix ããã«ãã«è¿œå åŸã以äžã®ããã«ã㊠2ã€ã® Scala ããŒãžã§ã³ã䜿ã£ããããªãã¯ã¹ãã»ããã¢ããããã
ThisBuild / organization := "com.example"
ThisBuild / scalaVersion := "2.12.8"
ThisBuild / version := "0.1.0-SNAPSHOT"
lazy val core = (projectMatrix in file("core"))
.settings(
name := "core"
)
.jvmPlatform(scalaVersions = Seq("2.12.8", "2.11.12"))
ãã㯠coreJVM2_11 ãš coreJVM2_12 ãšãããµããããžã§ã¯ããäœãã
++ ã¹ã¿ã€ã«ã®ã¹ããŒããã«ãªã¯ãã¹ãã«ããšéã£ãŠãããã¯äžŠåã«ãã«ãããã
1ã€ä»¥äžã®ãããªãã¯ã¹ããããšé¢çœããªãã
ThisBuild / organization := "com.example"
ThisBuild / scalaVersion := "2.12.8"
ThisBuild / version := "0.1.0-SNAPSHOT"
// uncomment if you want root
// lazy val root = (project in file("."))
// .aggregate(core.projectRefs ++ app.projectRefs: _*)
// .settings(
// )
lazy val core = (projectMatrix in file("core"))
.settings(
name := "core"
)
.jvmPlatform(scalaVersions = Seq("2.12.8", "2.11.12"))
lazy val app = (projectMatrix in file("app"))
.dependsOn(core)
.settings(
name := "app"
)
.jvmPlatform(scalaVersions = Seq("2.12.8"))
ãã®äŸã§ã¯ core 㯠Scala 2.11 ãš 2.12 ã«å¯ŸããŠãã«ãããããapp ã¯ãã®ãã¡ã® 1ã€ã®ã¿å¯Ÿå¿ããŠããã
git clone --no-hardlinks --branch master originalRepoURL childRepo
cd childRepo
git filter-branch --prune-empty --subdirectory-filter path/to/keep master
git remote remove origin
git prune
git gc --aggressive
originalRepoURLãmasterãpath/to/keep ãªã©ã¯é©åœãªå€ã«å€ãããå
šãŠã®ãã©ã³ããåŠçãããå Žå㯠-- --all ã䜿ãã
è€æ°ã®ãã¹ããã£ã«ã¿ãŒãããå Žåã¯ã--index-filter ãš brew install gnu-sed findutils ã«ãã£ãŠã€ã³ã¹ããŒã«ã§ãã GNU xargs ãš GNU sed ã䜿ãå¿
èŠãããã
git clone --no-hardlinks --branch master originalRepoURL childRepo
cd childRepo
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- path1/to/keep path2/to/keep' --prune-empty master
git filter-branch --prune-empty --parent-filter 'gsed "s/-p //g" | gxargs git show-branch --independent | gsed "s/\</-p /g"'
git remote remove origin
git prune
git gc --aggressive
originalRepoURLãmasterãpath1/to/keepãpath2/to/keep ãªã©ã¯é©åœãªå€ã«å€ãããå
šãŠã®ãã©ã³ããåŠçãããå Žå㯠-- --all ã䜿ãã
ãã㯠Travis CI ã«èªåã§ JDK ãã€ã³ã¹ããŒã«ãã解説ã®ç¬¬2匟ã ã以åã¯ãjabba ã玹ä»ããã
仿¥ã¯ SDKMAN!, ãšãããMarco Vermeulen (@marc0der) ãããäœã£ãå æ°ãªååã®ããŒã«ãèŠãŠãããããã¯ãJDK ã®ä»ã«ã GroovyãSparkãsbt ãªã© JVM äžã®æ§ã ãªããŒã«ã察象ãšããç°å¢ãããŒãžã£ãŒã ã
sdkman_auto_selfupdate ã远å ããããŸããsdk install ã®è¡ã« || true ã远å ããã以äžã¯ SDKMAN! ã䜿ã£ãŠ Travis CI äžã§ AdoptOpenJDK 8 ãš 11 ãçšããŠã¯ãã¹ãã«ãããæ¹æ³ã :
dist: xenial
language: scala
scala: 2.12.10
matrix:
include:
- env:
- ADOPTOPENJDK=11
- env:
- ADOPTOPENJDK=8
before_install:
# adding $HOME/.sdkman to cache would create an empty directory, which interferes with the initial installation
- "[[ -d /home/travis/.sdkman/ ]] && [[ -d /home/travis/.sdkman/bin/ ]] || rm -rf /home/travis/.sdkman/"
- curl -sL https://get.sdkman.io | bash
- echo sdkman_auto_answer=true > /home/travis/.sdkman/etc/config
- echo sdkman_auto_selfupdate=true >> $HOME/.sdkman/etc/config
- source "/home/travis/.sdkman/bin/sdkman-init.sh"
install:
- sdk install java $(sdk list java | grep -o "$ADOPTOPENJDK\.[0-9]*\.[0-9]*\.hs-adpt" | head -1) || true
- unset _JAVA_OPTIONS
- unset JAVA_HOME
- java -Xmx32m -version
script: sbt -Dfile.encoding=UTF8 -J-XX:ReservedCodeCacheSize=256M ++$TRAVIS_SCALA_VERSION! test
before_cache:
- find $HOME/.ivy2 -name "ivydata-*.properties" -delete
- find $HOME/.sbt -name "*.lock" -delete
cache:
directories:
- $HOME/.cache/coursier
- $HOME/.ivy2/cache
- $HOME/.sbt/boot
- $HOME/.sdkman
ãžã§ããèµ°ããšã以äžã®ããã«è¡šç€ºãããã¯ãã :
Docker å ã§ sbt ãèµ°ããããã£ãã®ã§ãã€ã¡ãŒãžãããã€ãäœã£ããGitHub ãªããžããªã¯ eed3si9n/docker-sbtã
幎æ«ã®é£äŒäžã« Pamflet ã® left TOC (ç®æ¬¡) ãå®è£ ããŠãPamflet 0.8.0 ãšããŠãªãªãŒã¹ããã
Pamflet ã¯çãææžãç¹ã«ãªãŒãã³ãœãŒã¹ã»ãœãããŠã§ã¢ã® ãŠãŒã¶ã»ããã¥ã¡ã³ããå ¬éããããã®ã¢ããªã ã
çŸè¡ã® Scala 2.13.0-M5 ã®ãŸãŸã§è¡ããšãscala.Seq 㯠scala.collection.Seq ãã scala.collection.immutable.Seq ã«å€æŽãããäºå®ã ãScala 2.13 collections rework ã«äœæ
ä»ãŸã§äžå€ãããªãã£ãã®ãã®è§£èª¬ãå°ãæžãããŠãããè¡éããæšãéããšãscala.Seq ãããã©ã«ãã§äžå€ã«ãªãããšãåã¶ã¹ãã ãšèšã£ãŠãããã ãšæãã
ããã©ã«ãã§åãäžå€ã«ãªãããšã¯ã¢ããªãæ°ããæžãããã³ãŒãã«ã¯è¯ãããšã ãšæããã©ã€ãã©ãªäœè ã«ãšã£ãŠã¯ããå°ããã¿ãã£ãŠãããããããªãã
Array(...) ã䜿ã£ãŠããå Žåãã®äžå€ Seq ãžã®å€æŽã¯ãbreaking change ã€ãŸãéäºæãª API 倿Žãšãªãããã
倱æäŸãšããŠã¯ scopt/scopt#218 ããããåã scopt ã®ã¯ãã¹ãã«ããè¡ã£ãããargs ãæž¡ããªããªã£ãããããScala 2.13.0-M5 ã«ãããŠã args 㯠Array[String] ã®ãŸãŸã ã
ã·ã³ãã«ãªä¿®æ£ã¯å
šãŠã®ãœãŒã¹ã«ãã㊠scala.collection.Seq ã import ããããšã ãåãæ¬²ããã®ã¯ Seq ã䜿ããšã³ã³ãã€ã«ãéããªããªãããšã ã
ãŸãæåã«ãã£ãŠã¿ãã®ã¯ scala.Seq ã unimport ããŠãscala.collection.Seq ã scala.collection.immutable.Seq ã®ã©ã¡ããã import ããããšã匷å¶ããããšã ã
import scala.{ Seq => _, _ }
æãå€åŽã«ããã¹ã³ãŒãå
ã§ããã©ã«ãã® import scala._ ã«ãã£ãŠ Seq ãšããååãæçžãããŠãããããããã¯å¹æãç¡ããããšãããèããŠã¿ããšãããä»®ã«ãããããŸããã£ããšããŠã import æãå
šãŠã®ãœãŒã¹ã«å¿ããã«æžããªããã°ãããªãã®ã§ãè¯ãæã§ã¯ç¡ãã
æè¡ã«ã³ãã¡ã¬ã³ã¹ã«ããã女æ§ã®åå ç (ããã®ä»ã®ããã¯ã°ã©ãŠã³ããæã€äººã®åå ç) ãæ¹åããã«ã¯ãåšèŸºã®ã«ã«ãã£ãŒãå€ããŠããå¿ èŠãããããã®ããã«ã¯ä»¥äžã® 2ç¹ã«é¢ããŠããããªãšããã·ã°ãã«åãšã³ãã¥ãã±ãŒã·ã§ã³ãå¿ èŠãšãã
鱿«äžã« sbt ã®ããã® super shell ã®å®è£ ããŸãšãŸã£ãŠããã®ã§ããã«å ±åããã倧ãŸããªæŠèŠãšããŠã¯ãã¿ãŒããã«ç»é¢ã®äž nè¡ãä¹ã£åã£ãŠä»èµ°ã£ãŠããã¿ã¹ã¯ã衚瀺ãããã
ãã°ã¯å€ãã®å Žé¢ã§æçšã§ãæãšããŠã¯äœãèµ·ãã£ãŠããããç¥ãããã®å¯äžã®çŸå®è§£ã§ãã£ãããããã ãã©ããsbt ã®ãããªã³ã³ãœãŒã«ã¢ããªã«ãããŠã¯ããã°ã䜿ã£ãŠãã«ãã»ãŠãŒã¶ã«çŸåšãªã«ãèµ·ãã£ãŠããããå ±åããã®ã¯ããŸããããªãããšãããã
仮㫠sbt ãäžåãã°ã衚瀺ããªãã£ããšãããšãsbt ãé·æéèµ°ãã¿ã¹ã¯ãå®è¡ããŠäžèŠåºãŸã£ãŠããŸã£ããšãã«äœãèµ·ããŠãããåãããªããªãããã®ãããupdate ã®ãããªã¿ã¹ã¯ã¯ “Updating blabla subproject” ãš “Done updating” ãšãã£ãéå§ãçµäºãã°ã衚瀺ãããupdate ã¿ã¹ã¯ã¯ãŠãŒã¶ããã«ãã«ãã£ãŠéåžžã«é·ãæéãããã£ãŠããŸãããšã§æåã ããå°ãªãã©ã€ãã©ãªäŸåæ§ãæã€ãã®ä»ã®å€ãã®ãã«ã㯠1s 以å
ã§å®äºããããã®ãããªå Žåããã«ãã®éå§æã« “Done updating” ããºã©ãŒããšå£ã®ããã«äžŠã¶ããšã«ãªãã
ã€ãŸãããã°è¡šç€ºãçŸç¶å ±åã«äœ¿ãã®ã¯ãã°ãåºãããŠããããç¶æ ãšãæ å ±ãè¶³ããªããŠäžäŸ¿ãªäž¡æ¥µç«¯ã®éãæºããããšã«ãªãã
人çã«ãããå€ãã®äºãšåæ§ã«ããã£ãããšã®æç€ºæ¹æ³ããŠãŒã¶ãŒã»ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã®äœæ¥ãšããããã¯ããã®ãã®ã®å¿ èŠäžå¯æ¬ ãªåŽé¢ã§ãããç¹ã«ãã®äœæ¥ããããã¯ããèªæã§ç¡ããã®ã»ã©ãããé¡èã«ãªãã
åã¯ãsbt ãåäžã®ã³ãã³ãå®è¡å ã«ãããŠã¿ã¹ã¯ã䞊ååŠçããããšãåœããåã®ããã«èããŠãããããããæè¿ã«ãªã£ãŠãã®äºãç¥ããªã人ãããå Žé¢ã«åºãããããšãå¢ããŠãããããã¯ãå®ã¯ãã£ãšããªããšã ããªããªãããã«ãã® DSL ããŠãŒã¶ã€ã³ã¿ãŒãã§ã€ã¹ã sbt ãã¿ã¹ã¯ã®äžŠååŠçãè¡ã£ãŠããããšãæããã«ããŠããªãããã ã
ããã«ãå€åã®ãŠãŒã¶ã sbt ãã¿ã¹ã¯ã䞊åå®è¡ããŠããããšãä¿¡ããŠãããšããŠããçŸåšã¯ã©ã®ã¿ã¹ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ãªã£ãŠããã®ããç¥ãã®ãé£ãããäœããã®ãã©ã°ã€ã³ãäžå¿
èŠã« update ãåŒã³åºãããããœãŒã¹ãäžåå€ãã£ãŠããªãã®ã«ããã»ã¹å€ã® Typescript ã³ã³ãã€ã©ãåŒã³åºãããããŠãããããããªãã
çŸåšå®è¡äžã®ã¿ã¹ã¯ã衚瀺ãã “super shell” ã¯ãããã®åé¡ã解決ããã1s 以å ã«å®è¡ããã¿ã¹ã¯ã¯ç»é¢ã«ã¯è¡šç€ºããããé·æéèµ°ã£ãŠããã¿ã¹ã¯ã¯ã«ãŠã³ãã¢ããããæèšã衚瀺ãããã

åããŠåããã®ãããªæ©èœã«æ°ä»ããã®ã¯ Gradle ã® “rich console” ã ãBuck ããããå®è£ ããŠããŠã“super console” ãšåŒã°ããŠãããããã®ã§ãåããã®ååãåããããšã«ããã
äžã¶æãããåã« Scala ã§æžãã³ã³ãœãŒã«ã»ã²ãŒã ãæžããããå®ã¯ããã¯ãã®æ©èœã®ããã®äºåç ç©¶ã ã£ãã
ã³ã³ãã€ã«ããããããªããã°ã³ã³ãã€ã«ããªããèŠåãªã©ãããªããæè¿æ°ã«å
¥ã£ãŠãã Scala ã³ã³ãã€ã©ã®ãã©ã°ã¯ "-Xlint" ãš "-Xfatal-warnings" ã® 2ã€ã ã
以äžã¯ããµããããžã§ã¯ããšå ±ã«äœ¿ããã»ããã£ã³ã°ã®äŸã :
ThisBuild / scalaVersion := "2.12.6"
lazy val commonSettings = List(
scalacOptions ++= Seq(
"-encoding", "utf8",
"-deprecation",
"-unchecked",
"-Xlint",
"-feature",
"-language:existentials",
"-language:experimental.macros",
"-language:higherKinds",
"-language:implicitConversions"
),
scalacOptions ++= (scalaVersion.value match {
case VersionNumber(Seq(2, 12, _*), _, _) =>
List("-Xfatal-warnings")
case _ => Nil
}),
Compile / console / scalacOptions --= Seq("-deprecation", "-Xfatal-warnings", "-Xlint")
)
lazy val foo = (project in file("foo"))
.settings(
commonSettings,
name := "foo",
)
-Xlint ã¯è²ã
ãªã³ã³ãã€ã«èŠåã远å ããã@smogamiããã Scala Compiler Options ãšããããŒãžãã³ã³ããªãã¥ãŒãããŠãããã®ã§ -Xlint ãäœããã£ãŠããã®ããèªããããã«ãªã£ãã
çºåããèŠåã®äžäŸãšããŠãååŒæ°ã Any ã«æšè«ããããšèŠåãã -Xlint:infer-any ãšããã®ãããã

èŠåãåé¡ãªã®ã¯ãã ãããåŸåãã«ãããŠå±±ç©ã¿ã«ãªã£ãŠããŸãããšã ã-Xfatal-warnings ã¯èŠåãã³ã³ãã€ã«ã»ãšã©ãŒã«ããã®ã§ç¡èŠã§ããªããªãã
ãã ããèŠåãåé¿äžå¯èœãªå ŽåããããäŸãã°ãåŸæ¹äºææ§ã®ããã« deprecated ãªã¡ãœããã䜿ãå¿ èŠããããããããªããç¹å®ã®åŒã ãã§èŠåãæå¶ã§ããã°ãããšæãã