enso icon indicating copy to clipboard operation
enso copied to clipboard

Explore removal of cats dependency

Open Akirathan opened this issue 7 months ago • 3 comments

scala-libs-wrapper contains cats dependency. cats contains roughly 50 MB of classes. It is a big dependency. This task is about exploring if we can easily get rid of this dependency so that our scala-libs-wrapper-assembly-0.1.0-SNAPSHOT.jar is smaller.

The only place that I can see uses cats is from project-manager which depends on dev.zip:zio-interop-cats:23.0.0.6.

Remove the dependency by deleting this line: https://github.com/enso-org/enso/blob/f0cbf1a8ade9f48bd321a842ddb1075678842b96/build.sbt#L1304

Akirathan avatar May 23 '25 08:05 Akirathan

Quite a few places use cats explicitly:

grep -r "import cats" .
./engine/launcher/src/main/scala/org/enso/launcher/cli/LauncherApplication.scala:import cats.data.NonEmptyList
./engine/launcher/src/main/scala/org/enso/launcher/cli/LauncherApplication.scala:import cats.implicits._
./engine/launcher/src/main/scala/org/enso/launcher/cli/InternalOpts.scala:import cats.implicits._
./lib/scala/cli/src/test/scala/org/enso/cli/OptsSpec.scala:import cats.implicits._
./lib/scala/cli/src/test/scala/org/enso/cli/ApplicationSpec.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/test/scala/org/enso/cli/ApplicationSpec.scala:import cats.implicits._
./lib/scala/cli/src/main/scala/org/enso/cli/arguments/Application.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/arguments/OptsParseError.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/arguments/OptsParseError.scala:import cats.implicits._
./lib/scala/cli/src/main/scala/org/enso/cli/arguments/OptsParseError.scala:import cats.kernel.Semigroup
./lib/scala/cli/src/main/scala/org/enso/cli/arguments/Opts.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/arguments/Opts.scala:import cats.implicits._
./lib/scala/cli/src/main/scala/org/enso/cli/arguments/Opts.scala:import cats.{Functor, Semigroupal}
./lib/scala/cli/src/main/scala/org/enso/cli/internal/CLIOutputInternal.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/internal/opts/SubcommandOpt.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/internal/opts/OptsMap.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/internal/opts/BaseSubcommandOpt.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/internal/opts/OptsProduct.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/internal/opts/OptsMapWithErrors.scala:import cats.data.NonEmptyList
./lib/scala/cli/src/main/scala/org/enso/cli/internal/opts/TopLevelCommandsOpt.scala:import cats.Semigroupal
./lib/scala/cli/src/main/scala/org/enso/cli/internal/opts/TopLevelCommandsOpt.scala:import cats.data.NonEmptyList
./lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectService.scala:import cats.MonadError
./lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/validation/ModuleNameValidator.scala:import cats.MonadError
./lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/validation/ProjectNameValidator.scala:import cats.MonadError
./lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/MainModule.scala:import cats.MonadError
./lib/scala/json-rpc-server/src/main/scala/org/enso/jsonrpc/Protocol.scala:  import cats.syntax.functor._

hubertp avatar May 23 '25 13:05 hubertp

Building engine-runner/rebuildNativeImage with --emit=build-report on latest develop reveals that there is, indeed, no cats code in engine-runner NI.

Inside NI of project-manager, cats occupies just negligible 0.022 % (10.57 KB) code size.

Akirathan avatar Jun 16 '25 10:06 Akirathan

From the transitive dependencies that rely on cats there is only a set of circe libraries. We can replace them with com.github.plokhotnyuk.jsoniter-scala that is already used in the project.

That's not much. I believe we can start working on replacing circe with jsoniter in our subprojects one by one:

  • pkg
  • editions
  • edition-updater
  • semver
  • downloader
  • cli
  • json-rpc-server
  • ~polyglot-api~ #13300
  • language-server
  • project-manager

4e6 avatar Jun 17 '25 09:06 4e6