diff --git a/build.sbt b/build.sbt index f72038ecd..2cffb3cd8 100644 --- a/build.sbt +++ b/build.sbt @@ -468,8 +468,7 @@ def otherRootSettings = Seq( Scripted.scriptedPrescripted := { f => val inj = f / "project" / "maven.sbt" if (!inj.exists) { - IO.write(inj, """libraryDependencies += Defaults.sbtPluginExtra("org.scala-sbt" % "sbt-maven-resolver" % sbtVersion.value, - |sbtBinaryVersion.value, scalaBinaryVersion.value)""".stripMargin) + IO.write(inj, "addMavenResolverPlugin") // sLog.value.info(s"""Injected project/maven.sbt to $f""") } } diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 1273301f0..968ef1960 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -1786,6 +1786,12 @@ trait BuildExtra extends BuildCommon with DefExtra { Seq(compose(onLoad, add), compose(onUnload, remove)) } + /** + * Adds Maven resolver plugin. + */ + def addMavenResolverPlugin: Setting[Seq[ModuleID]] = + libraryDependencies += sbtPluginExtra(ModuleID("org.scala-sbt", "sbt-maven-resolver", sbtVersion.value), sbtBinaryVersion.value, scalaBinaryVersion.value) + /** * Adds `dependency` as an sbt plugin for the specific sbt version `sbtVersion` and Scala version `scalaVersion`. * Typically, use the default values for these versions instead of specifying them explicitly. diff --git a/notes/0.13.8.markdown b/notes/0.13.8.markdown index 5b2566c2c..c85da9dd7 100644 --- a/notes/0.13.8.markdown +++ b/notes/0.13.8.markdown @@ -2,32 +2,58 @@ [@eed3si9n]: https://github.com/eed3si9n [@gkossakowski]: https://github.com/gkossakowski [@jsuereth]: https://github.com/jsuereth - + [@ajozwik]: https://github.com/ajozwik [@dwickern]: https://github.com/dwickern + [@Duhemm]: https://github.com/Duhemm [@kretes]: https://github.com/kretes + [@indrajitr]: https://github.com/indrajitr [@j-keck]: https://github.com/j-keck - + [@xuwei-k]: https://github.com/xuwei-k + [SI-9027]: https://issues.scala-lang.org/browse/SI-9027 + [Custom-Settings0]: http://www.scala-sbt.org/0.13/tutorial/Custom-Settings.html + [647]: https://github.com/sbt/sbt/issues/647 + [679]: https://github.com/sbt/sbt/issues/679 [875]: https://github.com/sbt/sbt/issues/875 + [1001]: https://github.com/sbt/sbt/issues/1001 [1180]: https://github.com/sbt/sbt/issues/1180 + [1322]: https://github.com/sbt/sbt/issues/1322 + [1340]: https://github.com/sbt/sbt/pull/1340 [1542]: https://github.com/sbt/sbt/issues/1542 + [1615]: https://github.com/sbt/sbt/issues/1615 + [1616]: https://github.com/sbt/sbt/issues/1616 + [1634]: https://github.com/sbt/sbt/pull/1634 + [1655]: https://github.com/sbt/sbt/issues/1655 + [1676]: https://github.com/sbt/sbt/issues/1676 [1702]: https://github.com/sbt/sbt/pull/1702 + [1714]: https://github.com/sbt/sbt/issues/1714 [1738]: https://github.com/sbt/sbt/issues/1738 [1741]: https://github.com/sbt/sbt/pull/1741 [1746]: https://github.com/sbt/sbt/pull/1746 [1748]: https://github.com/sbt/sbt/issues/1748 + [1752]: https://github.com/sbt/sbt/pull/1752 + [1754]: https://github.com/sbt/sbt/pull/1754 + [1766]: https://github.com/sbt/sbt/pull/1766 [1771]: https://github.com/sbt/sbt/pull/1771 - [SI-9027]: https://issues.scala-lang.org/browse/SI-9027 + [1787]: https://github.com/sbt/sbt/pull/1787 + [1793]: https://github.com/sbt/sbt/pull/1793 + [1817]: https://github.com/sbt/sbt/pull/1817 -### Fixes with compatibility implications +### Changes with compatibility implications - Rolls back XML parsing workaround. See below. +- Enables cross-version support for Scala sources. See below. ### Improvements +- Adds Maven resolver plugin. See below. +- Adds project-level dependency exclusions. See below. +- Adds sequential tasks. See below. - Discovered main classes will be sorted. [#1180][1180] by [@kretes][@kretes] - Implemented a new mechanism of forking javac, whereby errors are captured. Also more likely to run in-process. [#1702][1702] by [@jsuereth][@jsuereth] -- Adds project-level dependency exclusions. See below. +- `evicted` will display all evictions (including the ones not suspected of binary incompatibility). [#1615][1615] by [@eed3si9n][@eed3si9n] +- Better abstration to track new kinds of dependencies for incremental compiler. [#1340][1340] by [@Duhemm][@Duhemm] +- Source dependency uses `--depth 1` for git clone. [#1787][1787] by [@xuwei-k][@xuwei-k] ### Fixes @@ -36,6 +62,15 @@ - Ignores hidden build files from the build. [#1746][1746] by [@j-keck][@j-keck] - Fixes build.sbt parsing of multiple import. [#1741][1741] by [@ajozwik][@ajozwik] - Fixes ANSI escape code for overwriting lines on Windows. [#1771][1771] by [@dwickern][@dwickern] +- Adds null check in incremental compiler's type tree extraction. [#1754][1754]/[#1655][1655] by [@Duhemm][@Duhemm] +- sbt doesn't honor Maven's uniqueVersions (use sbt-maven-resolver to fix). [#1322][1322] by [@jsuereth][@jsuereth] +- sbt doesn't see new SNAPSHOT dependency versions in local maven repos (use withLatestSnapshots + sbt-maven-resolver to fix) [#321][321] by [@jsuereth][@jsuereth] +- Property in pom's version field results to wrong dependency resolution (use sbt-maven-resolver to fix). [#647][647] by [@jsuereth][@jsuereth] +- Maven local resolver with parent POM (use sbt-maven-resolver). [#1616][1616] by [@jsuereth][@jsuereth] +- Fixes cached resolution being too verbose. [#1752][1752] by [@eed3si9n][@eed3si9n] +- Fixes eviction warning being too noisy. [#1615][1615] by [@eed3si9n][@eed3si9n] +- Issues warning if multiple dependencies to a same library is found with different version. [#1634][1634] by [@eed3si9n][@eed3si9n] +- Removes "No main class detected" warning. [#1766][1766] by [@eed3si9n][@eed3si9n] ### Rolling back XML parsing workaround @@ -51,6 +86,37 @@ At the time, we thought adding parentheses around XML nodes could work around th [#1765][1765] by [@ajozwik][@ajozwik] +### Cross-version support for Scala sources + +When `crossPaths` setting is set to `true` (it is `true` by default), sbt 0.13.8 will include +`src/main/scala-/` to the `Compile` compilation in addition to +`src/main/scala`. For example, it will include `src/main/scala-2.11/` for Scala 2.11.5, and +`src/main/scala-2.9.3` for Scala 2.9.3. [#1799][1799] by [@indrajitr][@indrajitr] + +### Maven resolver plugin + +sbt 0.13.8 adds an extension point in the dependency resolution to customize Maven resolvers. +This allows us to write sbt-maven-resolver auto plugin, which internally uses Eclipse Aether +to resolve Maven dependencies instead of Apache Ivy. + +To enable this plugin, add the following to `project/maven.sbt` (or `project/plugin.sbt` the file name doesn't matter): + + addMavenResolverPlugin + +This will create a new `~/.ivy2/maven-cache` directory, which contains the Aether cache of files. +You may notice some file will be re-downloaded for the new cache layout. +Additionally, sbt will now be able to fully construct +`maven-metadata.xml` files when publishing to remote repositories or when publishing to the local `~/.m2/repository`. +This should help erase many of the deficiencies encountered when using Maven and sbt together. + +**Notes and known limitations**: + +- sbt-maven-resolver requires sbt 0.13.8 and above. +- The current implementation does not support Ivy-style dynamic revisions, such as "2.10.+" or "latest.snapshot". This + is a fixable situation, but the version range query and Ivy -> Maven version range translation code has not been migrated. + +[#1793][1793] by [@jsuereth][@jsuereth] + ### Project-level dependency exclusions sbt 0.13.8 adds project-level dependency exclusions: @@ -60,3 +126,57 @@ sbt 0.13.8 adds project-level dependency exclusions: In the first example, all artifacts from the organization `"org.apache.logging.log4j"` are excluded from the managed dependency. In the second example, artifacts with the organization `"com.example"` and the name `"foo"` cross versioned to the current `scalaVersion` are excluded. [#1748][1748] by [@eed3si9n][@eed3si9n] + +### Sequential tasks + +sbt 0.13.8 adds a new `Def.sequential` function to run tasks under semi-sequential semantics. +Here's an example usage: + + lazy val root = project. + settings( + testFile := target.value / "test.txt", + sideEffect0 := { + val t = testFile.value + IO.append(t, "0") + t + }, + sideEffect1 := { + val t = testFile.value + IO.append(t, "1") + t + }, + foo := Def.sequential(compile in Compile, sideEffect0, sideEffect1, test in Test).value + ) + +Normally sbt's task engine will reorder tasks based on the dependencies among the tasks, +and run as many tasks in parallel (See [Custom settings and tasks][Custom-Settings0] for more details on this). +`Def.sequential` instead tries to run the tasks in the specified order. +However, the task engine will still deduplicate tasks. For instance, when `foo` is executed, it will only compile once, +even though `test in Test` depends on compile. [#1817][1817]/[#1001][1001] by [@eed3si9n][@eed3si9n] + +### Bytecode Enhancers + +sbt 0.13.8 adds an extension point whereby users can effectively manipulate java bytecode (.class files) *before* the +incremental compiler attempts to cache the classfile hashes. This allows libraries like ebean to function with sbt +without corrupting the compiler cache and rerunning compile every few seconds. + +This splits the compile task into several subTasks: + +1. `previousCompile`: This task returns the previously persisted `Analysis` object for this project. +2. `compileIncremental`: This is the core logic of compiling Scala/Java files together. This task actually does the + work of compiling a project incrementally, including ensuring a minimum number of source files are compiled. + After this method, all .class files that would be generated by scalac + javac will be available. +3. `manipulateByteCode`: This is a stub task which takes the `compileIncremental` result and returns it. + Plugins which need to manipulate bytecode are expected to override this task with their own implementation, ensuring + to call the previous behavior. +4. `compile`: This task depends on `manipulateBytecode` and then persists the `Analysis` object containing all + incremental compiler information. + +Here's an example of how to hook the new `manipulateBytecode` key in your own plugin: + + manipulateBytecode in Compile := { + val previous = (manipulateBytecode in Compile).value + doManipulateBytecode(previous) // Note: This must return a new Compiler.CompileResult with our changes. + } + +See [#1714][1714] for the full details of the implementation. diff --git a/notes/0.13.8/aether-resolvers.markdown b/notes/0.13.8/aether-resolvers.markdown deleted file mode 100644 index 9d58d7db6..000000000 --- a/notes/0.13.8/aether-resolvers.markdown +++ /dev/null @@ -1,44 +0,0 @@ - [@jsuereth]: https://github.com/jsuereth - [1676]: https://github.com/sbt/sbt/issues/1676 - [1322]: https://github.com/sbt/sbt/issues/1322 - [679]: https://github.com/sbt/sbt/issues/679 - [647]: https://github.com/sbt/sbt/issues/647 - [1616]: https://github.com/sbt/sbt/issues/1616 - -### Fixes with compatibility implications - -### Improvements - -### Maven resolver plugin - -sbt 0.13.8 adds an extension point in the dependency resolution to customize Maven resolvers. -This allows us to write sbt-maven-resolver auto plugin, which internally uses Eclipse Aether -to resolve Maven dependencies instead of Apache Ivy. - -To enable this plugin, add the following to `project/maven.sbt` (or `project/plugin.sbt` the file name doesn't matter): - - libraryDependencies += Defaults.sbtPluginExtra("org.scala-sbt" % "sbt-maven-resolver" % sbtVersion.value, - sbtBinaryVersion.value, scalaBinaryVersion.value) - -This will create a new `~/.ivy2/maven-cache` directory, which contains the Aether cache of files. -You may notice some file will be re-downloaded for the new cache layout. -Additionally, sbt will now be able to fully construct -`maven-metadata.xml` files when publishing to remote repositories or when publishing to the local `~/.m2/repository`. -This should help erase many of the deficiencies encountered when using Maven and sbt together. - -**Notes and known limitations**: - -- sbt-maven-resolver requires sbt 0.13.8 and above. -- The current implementation does not support Ivy-style dynamic revisions, such as "2.10.+" or "latest.snapshot". This - is a fixable situation, but the version range query and Ivy -> Maven version range translation code has not been migrated. - -### Bug fixes - -- sbt doesn't honor Maven's uniqueVersions (use sbt-maven-resolver to fix). [#1322][1322] by [@jsuereth][@jsuereth] -- sbt doesn't see new SNAPSHOT dependency versions in local maven repos (use withLatestSnapshots + sbt-maven-resolver to fix) [#321][321] by [@jsuereth][@jsuereth] -- Property in pom's version field results to wrong dependency resolution (use sbt-maven-resolver to fix). [#647][647] by [@jsuereth][@jsuereth] -- Maven local resolver with parent POM (use sbt-maven-resolver). [#1616][1616] by [@jsuereth][@jsuereth] - -// Possibly fixed, need verification. -- 1676 - SNAPSHOT dependency not updated ??? -- 679 - Incorrect Maven Snapshot file resolution ???? diff --git a/notes/0.13.8/cached-resolution-fixes.markdown b/notes/0.13.8/cached-resolution-fixes.markdown deleted file mode 100644 index 730f2ec75..000000000 --- a/notes/0.13.8/cached-resolution-fixes.markdown +++ /dev/null @@ -1,13 +0,0 @@ - [@cunei]: https://github.com/cunei - [@eed3si9n]: https://github.com/eed3si9n - [@gkossakowski]: https://github.com/gkossakowski - [@jsuereth]: https://github.com/jsuereth - [1752]: https://github.com/sbt/sbt/pull/1752 - -### Fixes with compatibility implications - -### Improvements - -### Bug fixes - -- Fixes cached resolution being too verbose. [#1752][1752] diff --git a/notes/0.13.8/enhance-bytecode-feature.markdown b/notes/0.13.8/enhance-bytecode-feature.markdown deleted file mode 100644 index 3525f1638..000000000 --- a/notes/0.13.8/enhance-bytecode-feature.markdown +++ /dev/null @@ -1,35 +0,0 @@ - [1714]: https://github.com/sbt/sbt/issues/1714 - - -### Fixes with compatibility implications - -### Improvements - -### Bytecode Enhancers - -sbt 0.13.8 adds an extension point whereby users can effectively manipulate java bytecode (.class files) *before* the -incremental compiler attempts to cache the classfile hashes. This allows libraries like ebean to function with sbt -without corrupting the compiler cache and rerunning compile every few seconds. - -This splits the compile task into several subTasks: - -1. `previousCompile`: This task returns the previously persisted `Analysis` object for this project. -2. `compileIncremental`: This is the core logic of compiling Scala/Java files together. This task actually does the - work of compiling a project incrementally, including ensuring a minimum number of source files are compiled. - After this method, all .class files that would be generated by scalac + javac will be available. -3. `manipulateByteCode`: This is a stub task which takes the `compileIncremental` result and returns it. - Plugins which need to manipulate bytecode are expected to override this task with their own implementation, ensuring - to call the previous behavior. -4. `compile`: This task depends on `manipulateBytecode` and then persists the `Analysis` object containing all - incremental compiler information. - -Here's an example of how to hook the new `manipulateBytecode` key in your own plugin: - - manipulateBytecode in Compile := { - val previous = (manipulateBytecode in Compile).value - doManipulateBytecode(previous) // Note: This must return a new Compiler.CompileResult with our changes. - } - -See [#1714][1714] for the full details of the implementation. - -### Bug fixes diff --git a/notes/0.13.8/eviction-warning-fix.markdown b/notes/0.13.8/eviction-warning-fix.markdown deleted file mode 100644 index a0c2b2818..000000000 --- a/notes/0.13.8/eviction-warning-fix.markdown +++ /dev/null @@ -1,15 +0,0 @@ - [@cunei]: https://github.com/cunei - [@eed3si9n]: https://github.com/eed3si9n - [@gkossakowski]: https://github.com/gkossakowski - [@jsuereth]: https://github.com/jsuereth - [1615]: https://github.com/sbt/sbt/issues/1615 - -### Fixes with compatibility implications - -### Improvements - -- `evicted` will display all evictions (including the ones not suspected of binary incompatibility). [#1615][1615] by [@eed3si9n][@eed3si9n] - -### Bug fixes - -- Fixes eviction warning being too noisy. [#1615][1615] by [@eed3si9n][@eed3si9n] diff --git a/notes/0.13.8/inconsistent-duplicates.markdown b/notes/0.13.8/inconsistent-duplicates.markdown deleted file mode 100644 index f16deabfb..000000000 --- a/notes/0.13.8/inconsistent-duplicates.markdown +++ /dev/null @@ -1,13 +0,0 @@ - [@cunei]: https://github.com/cunei - [@eed3si9n]: https://github.com/eed3si9n - [@gkossakowski]: https://github.com/gkossakowski - [@jsuereth]: https://github.com/jsuereth - [1634]: https://github.com/sbt/sbt/pull/1634 - -### Fixes with compatibility implications - -### Improvements - -### Bug fixes - -- Issues warning if multiple dependencies to a same library is found with different version. [#1634][1634] by [@eed3si9n][@eed3si9n] diff --git a/notes/0.13.8/no-mainclass.markdown b/notes/0.13.8/no-mainclass.markdown deleted file mode 100644 index d38f70ff7..000000000 --- a/notes/0.13.8/no-mainclass.markdown +++ /dev/null @@ -1,13 +0,0 @@ - [@cunei]: https://github.com/cunei - [@eed3si9n]: https://github.com/eed3si9n - [@gkossakowski]: https://github.com/gkossakowski - [@jsuereth]: https://github.com/jsuereth - [1766]: https://github.com/sbt/sbt/pull/1766 - -### Fixes with compatibility implications - -### Improvements - -### Bug fixes - -- Removes "No main class detected" warning. [#1766][1766] by [@eed3si9n][@eed3si9n] diff --git a/notes/0.13.8/sequential-task.markdown b/notes/0.13.8/sequential-task.markdown deleted file mode 100644 index aeeecab91..000000000 --- a/notes/0.13.8/sequential-task.markdown +++ /dev/null @@ -1,40 +0,0 @@ - [@cunei]: https://github.com/cunei - [@eed3si9n]: https://github.com/eed3si9n - [@gkossakowski]: https://github.com/gkossakowski - [@jsuereth]: https://github.com/jsuereth - [1817]: https://github.com/sbt/sbt/pull/1817 - [1001]: https://github.com/sbt/sbt/issues/1001 - [Custom-Settings0]: http://www.scala-sbt.org/0.13/tutorial/Custom-Settings.html - -### Fixes with compatibility implications - -### Improvements - -### Bug fixes - -### Sequential tasks - -sbt 0.13.8 adds a new `Def.sequential` function to run tasks under semi-sequential semantics. -Here's an example usage: - - lazy val root = project. - settings( - testFile := target.value / "test.txt", - sideEffect0 := { - val t = testFile.value - IO.append(t, "0") - t - }, - sideEffect1 := { - val t = testFile.value - IO.append(t, "1") - t - }, - foo := Def.sequential(compile in Compile, sideEffect0, sideEffect1, test in Test).value - ) - -Normally sbt's task engine will reorder tasks based on the dependencies among the tasks, -and run as many tasks in parallel (See [Custom settings and tasks][Custom-Settings0] for more details on this). -`Def.sequential` instead tries to run the tasks in the specified order. -However, the task engine will still deduplicate tasks. For instance, when `foo` is executed, it will only compile once, -even though `test in Test` depends on compile. [#1817][1817]/[#1001][1001] by [@eed3si9n][@eed3si9n] diff --git a/util/collection/src/main/scala/sbt/Settings.scala b/util/collection/src/main/scala/sbt/Settings.scala index 326ebc9c5..38d2c2f5f 100644 --- a/util/collection/src/main/scala/sbt/Settings.scala +++ b/util/collection/src/main/scala/sbt/Settings.scala @@ -31,7 +31,7 @@ private final class Settings0[Scope](val data: Map[Scope, AttributeMap], val del def set[T](scope: Scope, key: AttributeKey[T], value: T): Settings[Scope] = { - val map = data getOrElse(scope, AttributeMap.empty) + val map = data getOrElse (scope, AttributeMap.empty) val newData = data.updated(scope, map.put(key, value)) new Settings0(newData, delegates) }