-
-
Notifications
You must be signed in to change notification settings - Fork 364
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support mill init
from an existing SBT project (2000USD Bounty)
#3450
Comments
mill init
from an SBT project (1500USD Bounty)mill init
from an existing SBT project (1500USD Bounty)
hello, I am having a look at this. I haven't used java much (just a bit of clojure and kotlin) so might take a couple days for PR. If I don't have anything in 48 hours happy for anyone else to take this. |
I'll take a crack at this. |
@steinybot go for it |
Hi, I have been looking at this. I am using scala-meta to parse the SBT files, can I confirm some test examples? Test 1 - basic sbt from sbt documentation ThisBuild / scalaVersion := "2.13.12"
ThisBuild / organization := "com.example"
lazy val hello = project
.in(file("."))
.settings(
name := "Hello",
libraryDependencies ++= Seq(
"org.scala-lang" %% "toolkit" % "0.1.7",
"org.scala-lang" %% "toolkit-test" % "0.1.7" % Test
)
) produces import mill._, scalalib._
object Hello extends MavenModule {
def scalaVersion = "2.13.12"
def organization = "com.example"
def ivyDeps = Agg(
ivy"org.scala-lang::toolkit:0.1.7"
)
object test extends ScalaTests with TestModule.Munit {
def ivyDeps = Agg(
ivy"org.scala-lang::toolkit-test:0.1.7"
)
}
} test 2 - more complex realworld sbt with publishing import Dependencies._
ThisBuild / scalaVersion := "2.12.19"
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.example"
ThisBuild / organizationName := "example"
lazy val root = (project in file("."))
.settings(
name := "Hello",
libraryDependencies += scalaTest % Test
)
libraryDependencies += "org.scalameta" %% "scalameta" % "4.9.9"
// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.2" produces this mill build.sc import mill._, scalalib._, publish._
import Dependencies._
object Hello extends MavenModule with PublishModule {
def scalaVersion = "2.12.19"
def publishVersion = "0.1.0-SNAPSHOT"
def ivyDeps = Agg(
ivy"org.scala-lang::toolkit:0.1.7"
)
def pomSettings = PomSettings(
name = "example",
organization = "com.example",
)
object test extends ScalaTests with TestModule.Munit {
def ivyDeps = Agg(
ivy"org.scala-lang::toolkit-test:0.1.7"
)
}
} test 3 - build.sbt with subprojects ThisBuild / version := "0.1.0"
ThisBuild / scalaVersion := "2.13.6"
ThisBuild / organization := "com.example"
val scalaTest = "org.scalatest" %% "scalatest" % "3.2.7"
val gigahorse = "com.eed3si9n" %% "gigahorse-okhttp" % "0.5.0"
val playJson = "com.typesafe.play" %% "play-json" % "2.9.2"
lazy val hello = (project in file("."))
.aggregate(helloCore)
.dependsOn(helloCore)
.enablePlugins(JavaAppPackaging)
.settings(
name := "Hello",
libraryDependencies += scalaTest % Test,
)
lazy val helloCore = (project in file("core"))
.settings(
name := "Hello Core",
libraryDependencies ++= Seq(gigahorse, playJson),
libraryDependencies += scalaTest % Test,
) Produces the following build.sc import mill._, scalalib._
object Hello extends MavenModule with PublishModule {
def scalaVersion = "2.13.6"
def publishVersion = "0.1.0"
def ivyDeps = Agg(
ivy"com.eed3si9n::gigahorse-okhttp:0.5.0",
ivy"com.typesafe.play::play-json:2.9.2",
ivy"org.scala-lang::toolkit-test:0.1.7"
)
def pomSettings = PomSettings(
name = "Hello",
organization = "com.example",
)
object test extends ScalaTests with TestModule.Munit {
def ivyDeps = Agg(
ivy"org.scala-lang::toolkit-test:0.1.7"
)
}
} with the following in package build.core
import mill._, scalalib._
object `package` extends MavenModule with ScalaModule {
def name = "Hello Core"
def ivyDeps = Agg(
ivy"com.eed3si9n::gigahorse-okhttp:0.5.0",
ivy"com.typesafe.play::play-json:2.9.2",
ivy"org.scala-lang::toolkit-test:0.1.7"
)
object test extends ScalaTests with TestModule.Munit {
def ivyDeps = Agg(
ivy"org.scala-lang::toolkit-test:0.1.7"
)
} |
Those examples look reasonable. One issue is that Scala-Meta parsing has a pretty low ceiling of how sophisticated builds it can handle. e.g. once people start having variables or helper methods, which is very common, it no longer works. I'd say that to do this well, we want to actually run SBT to evaluate the SBT build files, and export the metadata that results from this evaluation. That way you don't care how much indirection exists in the SBT build: SBT has to be able to handle it, and in the end convert it to a "dumb metadata" format that will be much easier for Mill to process |
Sounds reasonable, I checked sbt for meta data output and https://github.com/sbt/sbt-buildinfo but it seemed too limited. I will take a closer look. |
There's an SBT -> Bazel converter that I think goes through SBT to dump its metadata https://github.com/stripe-archive/sbt-bazel |
This may be relevant as well https://stackoverflow.com/a/62767456/871202 |
@Dylanb-dev https://github.com/oyvindberg/bleep can import sbt builds too. AFAIK it works by exporting sbt build to BSP (the |
@Dylanb-dev Did you complete this? If not please let me know in the next 24 hours as I am interested in potentially attempting this. |
@Dylanb-dev Thank you for mentioning that, I will review #3449. |
@ajaychandran's PR #3449 has landed, in case anyone wants to take a crack at this. We should be able to re-use all the rendering logic, and the only issue them becomes how to extract the relevant metadata from an SBT build to feed into the renderer |
mill init
from an existing SBT project (1500USD Bounty)mill init
from an existing SBT project (2000USD Bounty)
Bumping the bounty on this from 1500 -> 2000USD |
I am currently working on this bounty. I have a concrete plan (use sbt-structure to parse the sbt settings & use #3449 to transpile the parsed settings), however I have other commitments in my life so my progress is slow. I am down teaming up with others. I do not aim to take a monetary cut (I plan to ask Haoyi for information as reward, instead of monetary reward). If you would like to team up with me, feel free to join Mill's discord channel and ping me. |
Haha if you want information just email me and ask, no need to wait for completing the ticket. Can answer whatever questions you have today to the best of my abilities |
From the maintainer Li Haoyi: I'm putting a 2000USD bounty on this issue, payable by bank transfer on a merged PR implementing this.
We should be able to run
./mill init
to do a best effort conversion of an existing SBT project to Mill:build.mill
containing aMavenModule
for the rootbuild.sbt
, thepackage.mill
for any subfolderbuild.sbt
s or SBT subprojects in the rootbuild.sbt
ivyDeps
moduleDeps
javacOptions
PublishModule
with relevant metadataSuch a conversion will never be 100%, but if we can automate 80% of the conversion that will already be a huge help for people migrating to Mill or even just trying it out
The text was updated successfully, but these errors were encountered: