-
Notifications
You must be signed in to change notification settings - Fork 1
/
build.sbt
164 lines (142 loc) · 5.9 KB
/
build.sbt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import com.jsuereth.sbtpgp.PgpKeys.signedArtifacts
ThisBuild / scalaVersion := "3.3.3"
ThisBuild / scalacOptions ++= Seq(
"-encoding",
"UTF-8",
"-deprecation",
"-feature",
// "-Xprint:typer",
// "-explain",
"-Xcheck-macros",
"-Ycheck:all", // also for checking macros
"-Ycheck-mods",
"-Ydebug-type-error",
"-Xprint-types", // Without this flag, we will not see error messages for exceptions during given-macro expansion!
"-Yshow-print-errors",
"-language:experimental.macros",
"-language:implicitConversions",
"-language:higherKinds",
"-language:namedTypeArguments",
"-language:saferExceptions",
"-language:dynamics",
"-language:numericLiterals",
// "-Ykind-projector:underscores",
"-unchecked",
// "-Ysafe-init", // Note: causes warnings when used with Shapeless 3 recursive derivation
// "-Yexplicit-nulls", // Make reference types non-nullable: String != String|Null
"-Wnonunit-statement",
"-Wvalue-discard"
/*
NOT YET IMPLEMENTED IN SCALA 3.3.1
"-Wself-implicit", // Warn when an implicit resolves to an enclosing self-definition
*/
// "-source",
// "future-migration" // needed for warnings about matching types that are not `Matchable`
)
lazy val root = (project in file("."))
.settings(
name := "hkd4s",
idePackagePrefix := Some("com.tschuchort.hkd"),
description := "Higher Kinded Data for Scala 3",
// Organization and developer info is mandatory in POM for Maven Central!
organization := "com.github.tschuchortdev" ,
organizationName := "tschuchortdev",
organizationHomepage := Some(url("https://github.com/tschuchortdev")),
homepage := scmInfo.value.map(_.browseUrl),
developers := List(Developer(
id = "tschuchortdev",
name = "Thilo Schuchort",
email = "t.schuchort@googlemail.com",
url = url("https://github.com/tschuchortdev")
)),
scmInfo := Some(ScmInfo(
url("https://github.com/tschuchortdev/hkd4s"),
"scm:git@github.com:tschuchortdev/hkd4s.git"
)),
pgpSigningKey := Some("98C8EE4707346CDA0EEDDD624ACC18C2ABB7F7CC"),
// PGP signing key password given either through env var PGP_PASSPHRASE or through input dialog
// The secret key must be present in the GPG keyring.
licenses := List("MIT" -> new URL("https://opensource.org/license/mit")),
pomIncludeRepository := { _ => false },
resolvers ++= Seq(
Resolver.sonatypeOssRepos("releases"),
Resolver.sonatypeOssRepos("snapshots")
).flatten,
publishMavenStyle := true,
versionScheme := Some("early-semver"),
// This will make it so that non-SNAPSHOT releases are published to a local folder, so that they can then
// be bulk-uploaded by sonatypeBundleRelease command, which is much faster than uploading every file separately
publishTo := sonatypePublishToBundle.value,
sonatypeProfileName := "com.github.tschuchortdev",
credentials +=
Credentials("Sonatype Nexus Repository Manager",
"oss.sonatype.org",
sys.env.getOrElse("SONATYPE_NEXUS_USERNAME", ""),
sys.env.getOrElse("SONATYPE_NEXUS_PASSWORD", "")
),
libraryDependencies ++= Seq(
"org.typelevel" %% "cats-core" % "2.12.0",
"org.typelevel" %% "alleycats-core" % "2.12.0", // Needed for Pure type class
"org.typelevel" %% "shapeless3-deriving" % "3.4.1",
"dev.zio" %% "izumi-reflect" % "2.3.10"
),
// Test dependencies
libraryDependencies ++= Seq(
"org.scalameta" %% "munit" % "1.0.0",
"org.typelevel" %% "mouse" % "1.3.1", // helper functions
"org.typelevel" %% "kittens" % "3.3.0", // type class derivation
"org.typelevel" %% "cats-collections-core" % "0.9.8",
).map(_ % Test),
Test / parallelExecution := true
)
Global / onChangedBuildSource := ReloadOnSourceChanges
Global / excludeLintKeys += idePackagePrefix
// Safety check that the version string is computed from git tags
// Will fail build import if there is no initial tag!
Global / onLoad := (Global / onLoad).value.andThen { s =>
dynverAssertTagVersion.value
s
}
inThisBuild(List(
version := makeVersionString(dynverGitDescribeOutput.value, dynverCurrentDate.value),
dynver := {
val date = new java.util.Date
makeVersionString(sbtdynver.DynVer.getGitDescribeOutput(date), date)
}
))
def makeVersionString(gitOutput: Option[sbtdynver.GitDescribeOutput], date: java.util.Date): String = {
gitOutput match {
// isTag == previous git tag was found, must not be exactly at this commit
case Some(gitOutput) if gitOutput.ref.isTag =>
if (gitOutput.isCleanAfterTag) // cleanAfterTag == no committed or uncommitted changes since last tag
gitOutput.ref.dropPrefix // ref is actually the tag that was found
else {
val semverPattern = "^(\\d+)\\.(\\d+)\\.(\\d+)$".r
gitOutput.ref.dropPrefix match {
case semverPattern (major, minor, patch) =>
val incPatch = patch.toInt + 1
s"$major.$minor.$incPatch-SNAPSHOT"
}
}
case _ => s"0.1.0-SNAPSHOT"
}
}
/** Executes the right release commands depending on if it is a snapshot version or not */
ThisProject / commands += Command.command("doRelease") { state =>
val extractedProject = Project.extract(state)
println(s"Publishing version: ${extractedProject.get(version)}")
if (extractedProject.get(isSnapshot)) {
println("Version is a snapshot. Uploading directly to Sonatype, no closing of staging repository necessary.")
"publishSigned" :: state // :: sequences commands/tasks
}
else {
println("Version is not a snapshot. Publishing to a local staging folder first to then " +
"do bundle upload, close and release sonatype staging repository.")
"publishSigned" :: "sonatypeBundleRelease" :: state
}
}
/** for convenient use in CI */
val signedArtifactPaths = taskKey[String]("Newline separated list of all published artifact paths")
signedArtifactPaths := {
signedArtifacts.value.values.mkString("\n")
}