|
Scala example source code file (build.scala)
The build.scala Scala example source codeimport sbt._ import Project.Setting import Keys._ import GenTypeClass._ import java.awt.Desktop import scala.collection.immutable.IndexedSeq import sbtrelease._ import sbtrelease.ReleasePlugin.autoImport._ import sbtrelease.ReleaseStateTransformations._ import sbtrelease.Utilities._ import com.typesafe.sbt.pgp.PgpKeys._ import com.typesafe.sbt.osgi.OsgiKeys import com.typesafe.sbt.osgi.SbtOsgi._ import sbtbuildinfo.BuildInfoPlugin.autoImport._ import sbtunidoc.Plugin._ import sbtunidoc.Plugin.UnidocKeys._ import org.scalajs.sbtplugin.ScalaJSPlugin import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ import org.scalajs.sbtplugin.cross._ object build extends Build { type Sett = Def.Setting[_] val isJSProject = SettingKey[Boolean]("isJSProject") lazy val publishSignedArtifacts = ReleaseStep( action = st => { val extracted = st.extract val ref = extracted.get(thisProjectRef) extracted.runAggregated(publishSigned in Global in ref, st) }, check = st => { // getPublishTo fails if no publish repository is set up. val ex = st.extract val ref = ex.get(thisProjectRef) Classpaths.getPublishTo(ex.get(publishTo in Global in ref)) st }, enableCrossBuild = true ) val scalaCheckVersion = SettingKey[String]("scalaCheckVersion") val kindProjectorVersion = SettingKey[String]("kindProjectorVersion") private[this] def gitHash(): String = sys.process.Process("git rev-parse HEAD").lines_!.head // no generic signatures for scala 2.10.x, see SI-7932, #571 and #828 def scalac210Options = Seq("-Yno-generic-signatures") private[this] val tagName = Def.setting{ s"v${if (releaseUseGlobalVersion.value) (version in ThisBuild).value else version.value}" } private[this] val tagOrHash = Def.setting{ if(isSnapshot.value) gitHash() else tagName.value } val scalajsProjectSettings = Seq[Sett]( isJSProject := true, scalacOptions += { val a = (baseDirectory in LocalRootProject).value.toURI.toString val g = "https://raw.githubusercontent.com/scalaz/scalaz/" + tagOrHash.value s"-P:scalajs:mapSourceURI:$a->$g/" } ) lazy val notPublish = Seq( publishArtifact := false, publish := {}, publishLocal := {}, publishSigned := {}, publishLocalSigned := {} ) // avoid move files // https://github.com/scala-js/scala-js/blob/v0.6.7/sbt-plugin/src/main/scala/scala/scalajs/sbtplugin/cross/CrossProject.scala#L193-L206 object ScalazCrossType extends CrossType { override def projectDir(crossBase: File, projectType: String) = crossBase / projectType def shared(projectBase: File, conf: String) = projectBase.getParentFile / "src" / conf / "scala" override def sharedSrcDir(projectBase: File, conf: String) = Some(shared(projectBase, conf)) } lazy val standardSettings: Seq[Sett] = Seq[Sett]( organization := "org.scalaz", scalaVersion := "2.10.6", crossScalaVersions := Seq("2.10.6", "2.11.8", "2.12.0-M4"), resolvers ++= (if (scalaVersion.value.endsWith("-SNAPSHOT")) List(Opts.resolver.sonatypeSnapshots) else Nil), fullResolvers ~= {_.filterNot(_.name == "jcenter")}, // https://github.com/sbt/sbt/issues/2217 scalaCheckVersion := "1.12.5", scalacOptions ++= Seq( // contains -language:postfixOps (because 1+ as a parameter to a higher-order function is treated as a postfix op) "-deprecation", "-encoding", "UTF-8", "-feature", "-language:implicitConversions", "-language:higherKinds", "-language:existentials", "-language:postfixOps", "-unchecked" ) ++ (CrossVersion.partialVersion(scalaVersion.value) match { case Some((2,10)) => scalac210Options case Some((2,11)) => Seq( "-Ybackend:GenBCode", "-Ydelambdafy:method", "-target:jvm-1.8" ) case _ => Nil }), scalacOptions in (Compile, doc) ++= { val base = (baseDirectory in LocalRootProject).value.getAbsolutePath Seq("-sourcepath", base, "-doc-source-url", "https://github.com/scalaz/scalaz/tree/" + tagOrHash.value + "€{FILE_PATH}.scala") }, // retronym: I was seeing intermittent heap exhaustion in scalacheck based tests, so opting for determinism. parallelExecution in Test := false, testOptions in Test += { val scalacheckOptions = Seq("-maxSize", "5", "-workers", "1", "-maxDiscardRatio", "50") ++ { if(isJSProject.value) Seq("-minSuccessfulTests", "10") else Seq("-minSuccessfulTests", "33") } Tests.Argument(TestFrameworks.ScalaCheck, scalacheckOptions: _*) }, isJSProject := isJSProject.?.value.getOrElse(false), genTypeClasses := { typeClasses.value.flatMap { tc => val dir = name.value match { case ConcurrentName => (scalaSource in Compile).value case _ => ScalazCrossType.shared(baseDirectory.value, "main") } typeclassSource(tc).sources.map(_.createOrUpdate(dir, streams.value.log)) } }, checkGenTypeClasses <<= genTypeClasses.map{ classes => if(classes.exists(_._1 != FileStatus.NoChange)) sys.error(classes.groupBy(_._1).filterKeys(_ != FileStatus.NoChange).mapValues(_.map(_._2)).toString) }, typeClasses := Seq(), genToSyntax <<= typeClasses map { (tcs: Seq[TypeClass]) => val objects = tcs.map(tc => "object %s extends To%sSyntax".format(Util.initLower(tc.name), tc.name)).mkString("\n") val all = "object all extends " + tcs.map(tc => "To%sSyntax".format(tc.name)).mkString(" with ") objects + "\n\n" + all }, typeClassTree <<= typeClasses map { tcs => tcs.map(_.doc).mkString("\n") }, showDoc in Compile <<= (doc in Compile, target in doc in Compile) map { (_, out) => val index = out / "index.html" if (index.exists()) Desktop.getDesktop.open(out / "index.html") }, credentialsSetting, publishSetting, publishArtifact in Test := false, // adapted from sbt-release defaults // (performs `publish-signed` instead of `publish`) releaseProcess := Seq[ReleaseStep]( checkSnapshotDependencies, inquireVersions, runTest, setReleaseVersion, commitReleaseVersion, tagRelease, publishSignedArtifacts, setNextVersion, commitNextVersion, pushChanges ), releaseTagName := tagName.value, pomIncludeRepository := { x => false }, pomExtra := ( <url>http://scalaz.org <licenses> <license> <name>BSD-style <url>http://opensource.org/licenses/BSD-3-Clause <distribution>repo </license> </licenses> <scm> <url>git@github.com:scalaz/scalaz.git <connection>scm:git:git@github.com:scalaz/scalaz.git </scm> <developers> { Seq( ("runarorama", "Runar Bjarnason"), ("pchiusano", "Paul Chiusano"), ("tonymorris", "Tony Morris"), ("retronym", "Jason Zaugg"), ("ekmett", "Edward Kmett"), ("alexeyr", "Alexey Romanov"), ("copumpkin", "Daniel Peebles"), ("rwallace", "Richard Wallace"), ("nuttycom", "Kris Nuttycombe"), ("larsrh", "Lars Hupel") ).map { case (id, name) => <developer> <id>{id} <name>{name} <url>http://github.com/{id} </developer> } } </developers> ), // kind-projector plugin resolvers += Resolver.sonatypeRepo("releases"), kindProjectorVersion := "0.8.0", libraryDependencies += compilerPlugin("org.spire-math" % "kind-projector" % kindProjectorVersion.value cross CrossVersion.binary) ) ++ osgiSettings ++ Seq[Sett]( OsgiKeys.additionalHeaders := Map("-removeheaders" -> "Include-Resource,Private-Package") ) private[this] lazy val jsProjects = Seq[ProjectReference]( coreJS, effectJS, iterateeJS, scalacheckBindingJS, testsJS ) private[this] lazy val jvmProjects = Seq[ProjectReference]( coreJVM, effectJVM, iterateeJVM, scalacheckBindingJVM, testsJVM, concurrent, example ) lazy val scalaz = Project( id = "scalaz", base = file("."), settings = standardSettings ++ unidocSettings ++ Seq[Sett]( artifacts <<= Classpaths.artifactDefs(Seq(packageDoc in Compile)), packagedArtifacts <<= Classpaths.packaged(Seq(packageDoc in Compile)), unidocProjectFilter in (ScalaUnidoc, unidoc) := { jsProjects.foldLeft(inAnyProject)((acc, a) => acc -- inProjects(a)) } ) ++ Defaults.packageTaskSettings(packageDoc in Compile, (unidoc in Compile).map(_.flatMap(Path.allSubpaths))), aggregate = jvmProjects ++ jsProjects ) lazy val rootJS = Project( "rootJS", file("rootJS") ).settings( standardSettings, notPublish ).aggregate(jsProjects: _*) lazy val rootJVM = Project( "rootJVM", file("rootJVM") ).settings( standardSettings, notPublish ).aggregate(jvmProjects: _*) lazy val core = crossProject.crossType(ScalazCrossType) .settings(standardSettings: _*) .settings( name := "scalaz-core", sourceGenerators in Compile <+= (sourceManaged in Compile) map { dir => Seq(GenerateTupleW(dir), TupleNInstances(dir)) }, buildInfoKeys := Seq[BuildInfoKey](version, scalaVersion), buildInfoPackage := "scalaz", buildInfoObject := "ScalazBuildInfo", osgiExport("scalaz"), OsgiKeys.importPackage := Seq("javax.swing;resolution:=optional", "*")) .enablePlugins(sbtbuildinfo.BuildInfoPlugin) .jsSettings( scalajsProjectSettings ++ Seq( libraryDependencies += "org.scala-js" %%% "scalajs-java-time" % "0.1.0" ) : _* ) .jvmSettings( libraryDependencies ++= PartialFunction.condOpt(CrossVersion.partialVersion(scalaVersion.value)){ case Some((2, 11)) => "org.scala-lang.modules" %% "scala-java8-compat" % "0.7.0" }.toList, typeClasses := TypeClass.core ) lazy val coreJVM = core.jvm lazy val coreJS = core.js private final val ConcurrentName = "scalaz-concurrent" lazy val concurrent = Project( id = "concurrent", base = file("concurrent"), settings = standardSettings ++ Seq( name := ConcurrentName, typeClasses := TypeClass.concurrent, osgiExport("scalaz.concurrent"), OsgiKeys.importPackage := Seq("javax.swing;resolution:=optional", "*") ), dependencies = Seq(coreJVM, effectJVM) ) lazy val effect = crossProject.crossType(ScalazCrossType) .settings(standardSettings: _*) .settings( name := "scalaz-effect", osgiExport("scalaz.effect", "scalaz.std.effect", "scalaz.syntax.effect")) .dependsOn(core) .jsSettings(scalajsProjectSettings : _*) .jvmSettings( typeClasses := TypeClass.effect ) lazy val effectJVM = effect.jvm lazy val effectJS = effect.js lazy val iteratee = crossProject.crossType(ScalazCrossType) .settings(standardSettings: _*) .settings( name := "scalaz-iteratee", osgiExport("scalaz.iteratee")) .dependsOn(core, effect) .jsSettings(scalajsProjectSettings : _*) lazy val iterateeJVM = iteratee.jvm lazy val iterateeJS = iteratee.js lazy val example = Project( id = "example", base = file("example"), dependencies = Seq(coreJVM, iterateeJVM, concurrent), settings = standardSettings ++ Seq[Sett]( name := "scalaz-example", publishArtifact := false ) ) lazy val scalacheckBinding = CrossProject("scalacheck-binding", file("scalacheck-binding"), ScalazCrossType) .settings(standardSettings: _*) .settings( name := "scalaz-scalacheck-binding", libraryDependencies += "org.scalacheck" %%% "scalacheck" % scalaCheckVersion.value, osgiExport("scalaz.scalacheck")) .dependsOn(core, iteratee) .jvmConfigure(_ dependsOn concurrent) .jsSettings(scalajsProjectSettings : _*) lazy val scalacheckBindingJVM = scalacheckBinding.jvm lazy val scalacheckBindingJS = scalacheckBinding.js lazy val tests = crossProject.crossType(ScalazCrossType) .settings(standardSettings: _*) .settings( name := "scalaz-tests", publishArtifact := false, libraryDependencies += "org.scalacheck" %%% "scalacheck" % scalaCheckVersion.value % "test") .dependsOn(core, effect, iteratee, scalacheckBinding) .jvmConfigure(_ dependsOn concurrent) .jsSettings(scalajsProjectSettings : _*) .jsSettings( jsEnv := NodeJSEnv().value, scalaJSUseRhino in Global := false ) lazy val testsJVM = tests.jvm lazy val testsJS = tests.js lazy val publishSetting = publishTo <<= (version).apply{ v => val nexus = "https://oss.sonatype.org/" if (v.trim.endsWith("SNAPSHOT")) Some("snapshots" at nexus + "content/repositories/snapshots") else Some("releases" at nexus + "service/local/staging/deploy/maven2") } lazy val credentialsSetting = credentials += { Seq("build.publish.user", "build.publish.password") map sys.props.get match { case Seq(Some(user), Some(pass)) => Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", user, pass) case _ => Credentials(Path.userHome / ".ivy2" / ".credentials") } } lazy val genTypeClasses = TaskKey[Seq[(FileStatus, File)]]("gen-type-classes") lazy val typeClasses = TaskKey[Seq[TypeClass]]("type-classes") lazy val genToSyntax = TaskKey[String]("gen-to-syntax") lazy val showDoc = TaskKey[Unit]("show-doc") lazy val typeClassTree = TaskKey[String]("type-class-tree", "Generates scaladoc formatted tree of type classes.") lazy val checkGenTypeClasses = TaskKey[Unit]("check-gen-type-classes") def osgiExport(packs: String*) = OsgiKeys.exportPackage := packs.map(_ + ".*;version=${Bundle-Version}") } // vim: expandtab:ts=2:sw=2 Other Scala examples (source code examples)Here is a short list of links related to this Scala build.scala source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.