Releases: VirtusLab/scala-cli
v0.1.16
This release consists mainly of updates, fixes, and various enhancements of existing features.
Enhancements
Specifying javac options via using directives
javac options can now be added via using directives, like
//> using javacOpt "source", "1.8", "target", "1.8"Pressing enter in watch mode proceeds to run / compile / test / … again
In watch mode (using the -w or --watch option), pressing Enter when Scala CLI is watching for changes makes it run again what it's supposed to be doing (compiling, running, running tests, or packaging, etc.) This is inspired by Mill's behaviour in watch mode, which supports the same feature.
Added by @alexarchambault in #1451
Installation via Scoop on Windows
Scala CLI can now be installed via Scoop on Windows, with a command such as
scoop install scala-cliAdded by @nightscape in #1416, thanks to him!
Actionable diagnostics in Metals
Scala CLI should now send text edit suggestions with some of its diagnostics, via BSP, so that editors
can suggest those edits to users. This should work in upcoming versions of Metals in particular.
Other
- Add
--scalapy-versionoption by @alexarchambault in #1397
Fixes
Fixes in Scala Native binaries caching
When running a sequence of commands such as
$ scala-cli run --native .
$ scala-cli package --native . -o my-appScala CLI should cache a Scala Native binary during the first command, so that the second command can just re-use it, rather than generating a binary again. This also fixes the re-use of compilation artifacts between both commands, so that the Scala CLI project isn't re-compiled during the second command either.
Fixed by @alexarchambault in #1406
Accept more scalac options without escaping
Scala CLI now accepts options such as -release, -encoding, -color, -feature, -deprecation and -nowarn, without requiring them to be escaped by -O. It also accepts --scalac-verbose, which is equivalent to -O -verbose (increases scalac verbosity). Lastly, it warns when -release and / or -target:<target> are inconsistent with --jvm.
Fix --java-option and --javac-option handling in package sub-command
--java-option and --javac-option should now be accepted and handled properly in the package sub-command.
Fix wrong file name when publising Scala.js artifacts locally
The publish local sub-command used to publish Scala.js artifacts with a malformed suffix. This is now fixed.
Fix spurious stack traces in the publish and publish local sub-commands
The publish and publish local commands could print spurious stack traces when run with non-default locales, using native Scala CLI binaries. This is now fixed.
Fixed by @romanowski in #1423
Make run --python --native work from Python virtualenv
Using both --native and --python in the run sub-command should work fine from Python virtualenv.
Fixed by @kiendang in #1399, thanks to him!
Documentation / help updates
- Dump scala 2 version in docs by @lwronski in #1408
- Ensure the the
repl& default sub-commands respect group help options by @Gedochao in #1417 - Remove stray
_typo by @armanbilge in #1385 - Add docs on how to install scala-cli for M1 by @lwronski in #1431
- Debugging cookbook by @wleczny in #1441
Updates / maintainance
- Update scala-cli.sh launcher for 0.1.15 by @github-actions in #1401
- Revert scalafmt fix by @lwronski in #1402
- Bump respective Scala versions to
2.12.17&2.13.9and Ammonite to2.5.4-33-0af04a5bby @Gedochao in #1405 - Turn off running tests in PR for M1 runner by @lwronski in #1403
- Bump VirtusLab/scala-cli-setup from 0.1.14.1 to 0.1.15 by @dependabot in #1414
- Bump coursier/setup-action from f883d08305acbc28e5e5363bf5ec086397627021 to 1.2.1 by @dependabot in #1415
- Tweak the release procedure by @Gedochao in #1426
- Update case-app_2.13 to 2.1.0-M17 & scala-cli-signing to v0.1.10 by @lwronski in #1427
- Automate choco package deploy by @wleczny in #1412
- Generate pkg package for m1 by @lwronski in #1410
- Re-enable gif tests by @alexarchambault in #1436
- Bump Scala 2.13.x to 2.13.10 & Ammonite to 2.5.5 by @Gedochao in #1437
- Remove mill-scala-cli stuff from build by @alexarchambault in #1433
- Add support for BSP's
buildTarget/outputPathsand update bsp4j to 2… by @lwronski in #1439 - Update bsp4j to 2.1.0-M3 by @lwronski in #1444
- Update scala-packager to 0.1.29 and hardcode upgradeCodeGuid by @lwronski in #1446
- Refactor
ScalaCommandto enforce respecting help options by @Gedochao in #1440 - Address compilation warnings by @alexarchambault in #1452
- Update coursier to 2.1.0-M7 by @alexarchambault in #1447
- Update bloop to 1.5.4-sc-3 by @alexarchambault in #1454
New Contributors
- @nightscape made their first contribution in #1416
- @kiendang made their first contribution in #1399
Full Changelog: v0.1.15...v0.1.16
v0.1.15
The M1 native launcher is here! (experimental)
We are happy to announce that there is a new dedicated launcher for M1 users. You can find it here.
Please note that the package sub-command is unstable for this launcher.
--python option for repl sub-command (experimental)
Passing the --python option allows using ScalaPy with the repl sub-command:
▶ scala-cli --python
Welcome to Scala 3.2.0 (17.0.2, Java OpenJDK 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.
scala> import me.shadaj.scalapy.py
scala> py.Dynamic.global.range(1, 4)
val res0: me.shadaj.scalapy.py.Dynamic = range(1, 4)
Added in #1336 by @alexarchambault
-d, -classpath and compile sub-command's --output options changes
To be backward compatible with the scala command, some changes have been made to the following options:
- The
compilesub-command's--outputoption has been renamed to--compilation-output. This option is now also available from therunandpackagesub-commands.
▶ scala-cli compile Hello.scala --compilation-output out
▶ scala-cli --main-class Hello -classpath out
Hello
- The
-doption is no longer an alias for--dependency, but for--compilation-output.-O -d -O path/to/compilation/outputnow defaults to-d path/to/compilation/output.
▶ scala-cli compile Hello.scala -d out
▶ scala-cli --main-class Hello -classpath out
Hello
- The old
--classpathoption has been renamed to--print-classpath.--classpath,--class-pathand-classpathoptions are now aliases for the--extra jarsoption.-O -classpath -O path/to/classpathnow defaults to--extra-jars path/to/classpath.
▶ scala-cli compile --print-classpath Hello.scala
# ~/Projects/debug-test/.scala-build/project_103be31561_103be31561-7a1ed8dde0/classes/main:~/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.2.0/scala3-library_3-3.2.0.jar:~/Library/Caches/ScalaCli/local-repo/v0.1.15/org.virtuslab.scala-cli/runner_3/0.1.15/jars/runner_3.jar:~/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.8/scala-library-2.13.8.jar
Make inputs optional when -classpath and --main-class are passed
The following changes have been made to improve backward compatibility with the scala command:
- Passing the
--main-classoption along with-classpathto the default command now defaults toruninstead ofrepl:
▶ scala-cli --main-class Hello -classpath out
Hello
- If the
runsub-command is passed explicitly, it's sufficient to have a main class on the classpath (inputs aren't necessary then):
▶ scala-cli compile Hello.scala -d out
▶ scala-cli run -classpath out
Hello
Debugging with the run and test sub-commands
It is now possible to debug code ran by run and test sub-commands:
▶ scala-cli Main.scala --debug
Listening for transport dt_socket at address: 5005
Hello
This addresses #1212
--platform option
This option can be used to choose the platform, which should be used to compile and run the application.
▶ scala-cli Main.scala --platform js
Hello
Note that --platform js is an alias for --js and --platform native is an alias for --native.
This addresses #1214
Other changes
Fixes
- Ensure directories are created recursively when the
packagesub-command is called by @Gedochao in #1371 - Fix calculation of Scala version and turn off the
-releaseflag for 2.12.x < 2.12.5 by @Gedochao in #1377 - Fix finding main classes in external jars by @Gedochao in #1380
- Fix Js split style SmallModulesFor in pure JVM by @lwronski in #1394
Build and internal changes
- Remove mill-scalafix customization by @alexarchambault in #1360
- Split config db stuff to a separate config module by @alexarchambault in #1367
- Detect sip when installed by coursier by @lwronski in #1368
- Create empty class to enforce resolving ivy deps by mill for dummy modules by @lwronski in #1374
- Use millw launcher instead of running mill by cs by @lwronski in #1375
- Add --debug option for integration tests by @wleczny in #1378
- NIT ScalaVersionUtil refactor by @Gedochao in #1384
- Make config module compatible with Java 8 by @alexarchambault in #1387
- Add HTTP proxy-related keys in config module by @alexarchambault in #1388
- Add repositories-related keys in config module by @alexarchambault in #1395
Updates
- Update scala-cli.sh launcher for 0.1.14 by @github-actions in #1362
- Update jsoniter-scala-core_2.13 to 2.17.3 by @scala-steward in #1364
- Update core_2.13 to 3.8.0 by @scala-steward in #1365
- Bump VirtusLab/scala-cli-setup from 0.1.13 to 0.1.14.1 by @dependabot in #1376
Full Changelog: v0.1.14...v0.1.15
v0.1.14
Hotfix printing stacktraces from Scala CLI runner for Scala 3.x < 3.2.0
We fixed a nasty bug breaking any Scala CLI run using any Scala 3 version earlier than 3.2.0 on printing stacktraces.
Only Scala CLI 0.1.13 was affected.
$ scala-cli about
Scala CLI version: 0.1.13
Scala version (default): 3.2.0
$ scala-cli -S 3.1.3 -e 'throw Exception("Broken")'
Compiling project (Scala 3.1.3, JVM)
Compiled project (Scala 3.1.3, JVM)
Exception in thread "main" java.lang.NoSuchMethodError: 'long scala.runtime.LazyVals$.getOffsetStatic(java.lang.reflect.Field)'
at scala.cli.runner.StackTracePrinter.<clinit>(StackTracePrinter.scala:101)
at scala.cli.runner.StackTracePrinter$.coloredStackTraces(StackTracePrinter.scala:104)
at scala.cli.runner.StackTracePrinter$.$lessinit$greater$default$4(StackTracePrinter.scala:11)
at scala.cli.runner.Runner$.main(Runner.scala:18)
at scala.cli.runner.Runner.main(Runner.scala)
Added in #1358 by @romanowski
Build and internal changes
- Disable mill-scala-cli for now by @alexarchambault in #1335
- Update scala-cli.sh launcher for 0.1.13 by @github-actions in #1351
- Remove backslash which skip execution of
mvcommand by @lwronski in #1353 - Fix import ordering by @alexarchambault in #1359
Updates
- Update scalafix stuff… by @alexarchambault in #1333
- Bump VirtusLab/scala-cli-setup from 0.1.12 to 0.1.13 by @dependabot in #1354
Full Changelog: v0.1.13...v0.1.14
v0.1.13
Change the default sub-command to repl when no args are passed
We no longer default to the help sub-command when no arguments are passed. Starting with 0.1.13 running Scala CLI with no args will launch the repl.
$ scala-cli -S 3
Welcome to Scala 3.1.3 (17.0.3, Java OpenJDK 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.
scala>
When inputs are provided, Scala CLI defaults to the run sub-command, as before.
$ cat hello.sc
println("Hello World")
$ scala-cli hello.sc
Hello World
This change was added by @Gedochao in #1268
Marking the project's workspace root with the project.settings.scala file
Scala CLI now supports marking the workspace root directory with an optional configuration file: project.settings.scala. The workspace root determines where the .bsp and .scala-build directories will be saved (which mostly affects what path should be opened in your IDE to import the Scala CLI project through BSP).
The settings file is also the recommended input for your project's using directives. Otherwise, it functions similarly to other .scala sources.
$ cat project.settings.scala
//> using scala "2.13.4"
$ cat hello.sc
println(util.Properties.versionString)
$ scala-cli hello.sc .
version 2.13.4
To see how exactly is the root directory resolved, see this document
Scala CLI is now built with Scala 3.2.0
We now rely on Scala 3.2.0 as the default internal Scala version used to build the project.
This change was added by @lwronski in #1314
Add resources support for Scala Native
Scala CLI now allows embedding resources (by default) in a Scala Native binary with the --native flag.
$ cat resources/scala-native/foo.c
int foo(int i) {
return i + 42;
}
$ cat hello.scala
//> using platform "native"
//> using resourceDir "resources"
import scalanative.unsafe.*
@extern
def foo(int: CInt): CInt = extern
@main def main =
println(foo(3))
$ scala-cli hello.scala --native
45
Default to the run sub-command instead of repl when the -e, --execute-script, --execute-scala or --execute-java options are passed.
Even though we default to the repl sub-command when no arguments are passed to Scala CLI, an exception to that rule is when a snippet is passed with one of the following options: -e, --execute-script, --execute-scala or --execute-java. In that case, the passed snippets are treated as inputs to be executed and switch the default to the run sub-command.
$ scala-cli -e 'println("Hello")'
Hello
If you still want to pass a snippet to the repl, you can either pass the repl sub-command explicitly or use one of the following options, as before: --script-snippet, --scala-snippet or --java-snippet.
$ scala-cli --script-snippet 'println("Hello")'
Welcome to Scala 3.1.3 (17.0.2, Java OpenJDK 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.
scala> snippet_sc.main(Array.empty)
Hello
This change was introduced to make the -e option backwards compatible with the scala command.
Work in progress
Support for Markdown (experimental)
Scala CLI can now accept .md inputs and run/compile a snippet of Scala code inside the markdown. Markdown sources are ignored by default unless passed explicitly as inputs. You can also enable including non-explicit .md inputs by passing the --enable-markdown option.
Plain scala snippets are treated similarly to .sc scripts which can be run by scala-cli:
$ cat Example.md
This is a simple example of an `.md` file with a Scala snippet.
```scala
val message = "Hello from Markdown"
println(message)
```scala-cli Example.md
Hello from Markdown
See this document for more details about the experimental Markdown support.
Add --python option for the run sub-command (experimental)
The run sub-command can now run ScalaPy when the --python option is passed.
$ cat helloscalapy.sc
import py.SeqConverters
val len = py.Dynamic.global.len(List(0, 2, 3).toPythonProxy)
println(s"Length is $len")
$ scala-cli helloscalapy.sc --python -S 2.13
Length is 3
Added in #1295 by @alexarchambault
Other changes
Documentation
- Correct using directives on configuration.md by @megri in #1278
- Improve dependencies doc by @Gedochao in #1287
Fixes
Build and internal changes
- Improve the error message for when a build's main class is ambiguous by @Gedochao in #1323
- Improve the error message for unsupported Scala version with Ammonite by @Gedochao in #1327
- Detect ARM64 macs when downloading coursier launcher by @keynmol in #1282
- Make test("...".only) work again in RunTestDefinitions by alexarchambault in #1294
- Use os-lib short-hand method trim when possible by alexarchambault in #1334
- Add missing repl tests by alexarchambault in #1332
- Scala CLI deb package - Priority and Section flag by @lwronski in #1338
Updates
- Update ammonite to 2.5.4-16-7317286d by @scala-steward in #1283
- Update mill-main to 0.10.7 by @scala-steward in #1284
- Update scalajs-env-nodejs_2.13 to 1.4.0 by @scala-steward in #1303
- Update jsoniter-scala-core_2.13 to 2.16.0 by @scala-steward in #1302
- Update core_2.13 to 3.7.6 by @scala-steward in #1299
- Update ammonite to 2.5.4-19-cd76521f by @scala-steward in #1298
- Update bsp4j to 2.1.0-M1 by @lwronski in #1277
- Bump VirtusLab/scala-cli-setup from 0.1.11 to 0.1.12 by @dependabot in #1306
- Update jsoniter-scala-core_2.13 to 2.17.0 by @scala-steward in #1311
- Update test-runner, tools to 0.4.7 by @scala-steward in #1317
- Update jsoniter-scala-core_2.13 to 2.17.1 by @scala-steward in #1320
- Update ammonite_3.1.3 to 2.5.4-22-4a9e6989 by @scala-steward in #1329
- Update jsoniter-scala-core_2.13 to 2.17.2 by @scala-steward in #1343
- Update python-native-libs to 0.2.4 by @scala-steward in #1341
- Update org.eclipse.jgit to 6.3.0.202209071007-r by @scala-steward in #1344
New Contributors
v0.1.12
Add --spark, --spark-standalone and --hadoop options for the run sub-command (experimental)
The run sub-command can now run Spark jobs when the --spark option is passed.
$ scala-cli run --spark SparkJob.scala
Similarly, it's possible to run Hadoop jobs by passing the --hadoop option.
scala-cli run --hadoop HadoopJob.java
It's also possible to run Spark jobs without a Spark distribution by passing the --spark-standalone option.
$ scala-cli run --spark-standalone SparkJob.scala
Added in #1129 by alexarchambault
Add the default Scala version to the output of the version sub-command
The version sub-command now includes both the Scala CLI version and the default Scala version.
$ scala-cli --version
Scala CLI version 0.1.12
Default Scala version: 3.1.3
$ scala-cli -version
Scala CLI version 0.1.12
Default Scala version: 3.1.3
$ scala-cli version
Scala CLI version 0.1.12
Default Scala version: 3.1.3
You can also pass the --cli-version option to only get the Scala CLI version or the --scala-version option
to only get the default Scala version.
$ scala-cli version --cli-version
0.1.12
$ scala-cli version --scala-version
3.1.3
This is potentially a breaking change if your automation relies on the output of the version sub-command.
Enable passing the scalafmt configuration with --scalafmt-conf and --scalafmt-conf-str
It is now possible to pass a custom location of the scalafmt configuration with the --scalafmt-conf option for the
fmt sub-command.
$ scala-cli fmt --scalafmt-conf path/to/the/conf/.scalafmt.conf
You can also pass the configuration straight from the terminal with --scalafmt-conf-str.
$ scala-cli fmt --scalafmt-conf-str "version=3.5.5
runner.dialect=scala213"
Enable turning the --interactive mode on permanently
It is now possible to set the --interactive mode on by default, so that passing it explicitly isn't necessary.
The next time when you run a command with the --interactive option set to on, Scala CLI will suggest to turn it on
permanently.
This is recommended for environments where scala-cli is used by a human user only (and not by any automation).
$ scala-cli . --interactive
You have run the current scala-cli command with the --interactive mode turned on.
Would you like to leave it on permanently?
[0] Yes
[1] No
0
--interactive is now set permanently. All future scala-cli commands will run with the flag set to true.
If you want to turn this setting off at any point, just run `scala-cli config interactive false`.
Found several main classes. Which would you like to run?
[0] ScalaMainClass2
[1] ScalaMainClass1
[2] scripts.ScalaScript_sc
You can also configure it manually with the config sub-command, by setting the interactive property to true.
$ scala-cli config interactive true
Other changes
Work in progress
SIP-46-related
- Restrict directives based on the command used by romanowski in #1259
Documentation
- NIT Improve some website docs by BlackAnubis7 in #1243
Build and internal changes
- Add 0.1.11 release notes to release_notes.md by BlackAnubis7 in #1228
- Temporary disable test gif by lwronski in #1261
- aarch64 fixes by alexarchambault in #1180
Updates
- Update mill launcher by alexarchambault in #1269
- Update scala-cli.sh launcher for 0.1.11 by github-actions in #1230
- Update jsoniter-scala-core_2.13 to 2.13.39 by scala-steward in #1239
- Update trees_2.13 to 4.5.12 by scala-steward in #1242
- Update jsoniter-scala-core_2.13 to 2.14.2 by scala-steward in #1241
- Update org name to VirtusLab for downloading scalafmt-native-image by lwronski in #1253
- Update core_2.13 to 3.7.4 by scala-steward in #1247
- Update case-app_2.13 to 2.1.0-M15 by scala-steward in #1245
- Update jsoniter-scala-core_2.13 to 2.15.0 by scala-steward in #1246
- Update cli-options_2.13, cli_2.13, ... to 0.1.8 by scala-steward in #1248
- Update metaconfig-typesafe-config to 0.11.1 by scala-steward in #1254
- Update ammonite to 2.5.4-14-dc4c47bc by scala-steward in #1255
- Update coursier-jvm_2.13, ... to 2.1.0-M6-53-gb4f448130 by scala-steward in #1256
- Update scala-packager-cli_2.13, ... to 0.1.27 by scala-steward in #1258
- Update bloop-config_2.13 to 1.5.3-sc-1 by scala-steward in #1257
- Update ammonite to 2.5.4-15-f4a8969b by scala-steward in #1264
- Update trees_2.13 to 4.5.13 by scala-steward in #1265
- Update slf4j-nop to 2.0.0 by scala-steward in #1273
- Update cli-options_2.13, cli_2.13, ... to 0.1.9 by scala-steward in #1272
- Bump VirtusLab/scala-cli-setup from 0.1.5 to 0.1.11 by dependabot in #1274
New Contributors
- BlackAnubis7 made their first contribution in #1228
Full Changelog: v0.1.11...v0.1.12
v0.1.11
Make .scalafmt.conf optional when running the fmt command
Scala CLI can now run the fmt command without a .scalafmt.conf file present. Previously, if such a file was absent, a Scalafmt requires explicitly specified version. error was raised while using the fmt command.
The Scala CLI fmt command now supports passing the scalafmt version and dialect directly from the command line, using the --scalafmt-dialect and --scalafmt-version options respectively:
scala-cli fmt --scalafmt-dialect scala3 --scalafmt-version 3.5.8
Either of those (or both) can be skipped, which will make Scala CLI infer a default value.
The configuration used can be saved in the workspace by passing the --save-scalafmt-conf option.
Define output option for package command with using directives
It is now possible to pass the output option of the package command with using directives instead of passing it directly from bash.
Add support for running multiple snippets of the same kind
Scala CLI now allows to pass multiple snippets of the same kind.
It was previously possible to mix different kinds (so to pass a Java snippet alongside a Scala one), but not for example 2 separate Scala snippets. That limitation no longer applies.
When passed this way, each snippet is then treated as a separate input by Scala CLI.
$ scala-cli --scala-snippet '@main def main() = println(Messages.hello)' --scala-snippet 'object Messages { def hello = "Hello" }'
Hello
Add bloop sub-command
Scala CLI now has a (hidden for now) bloop sub-command, that runs a command using the Scala CLI Bloop server (while the mainline Bloop bloop CLI uses its default Bloop server). This is handy when debugging things on Scala CLI for example, allowing one to manually run scala-cli bloop projects or scala-cli bloop compile.
Added in #1199 by alexarchambault
Make main class optional in preamble-less assemblies
It is now allowed to generate an assembly, even for code that has no main class, when --preamble=false is passed. This can be useful for libraries, if users want to pass the assembly to tools such as proguard. This also accepts a (hidden) --main-class-in-manifest=false option if users want not only no preamble, but also no mention of main class in the assembly manifest (META-INF/MANIFEST.MF in the assembly JAR). The latter option is useful for tools, such as the hadoop jar command, that behave differently depending on the presence or not of a main class in the manifest.
Added in #1200 by alexarchambault
Important fixes & enhancements
Prevent erroneous using directives from blocking the initial run of BSP
Up till now, running the setup-ide sub-command on sources containing using directives with syntax errors or pointing to dependencies which could not be fetched would create a BSP setup which could not be imported correctly by IDEs. This is no longer the case and such a BSP connection should now import correctly, so that it's possible to fix the faulty code within the comfort of one's IDE of choice.
This fixes #1097
Work in progress
Allow to globally turn actionable diagnostics on or off
It is now possible to globally enable or disable actionable diagnostics using the config sub-command.
The relevant configuration is under the actions key.
$ scala-cli config actions true
Publishing-related features
- Add "publish setup" command by alexarchambault in #926
Other changes
Documentation
- Put the release notes doc on the website by Gedochao in #1196
- Fix typo in Spark docs by alexarchambault in #1183
- Tweak issue templates & the release procedure by Gedochao in #1188
- Add install and uninstall completions documentation by wleczny in #1201
Build and internal changes
- ignore *.semanticdb files by mtk in #1187
- Update scala-cli.sh launcher for 0.1.10 by github-actions in #1185
- Force push updating scala-cli in scala-cli-setup by lwronski in #1189
- Fix running scala check in scala native by lwronski in #1190
- Use manifest JARs in "run" command if needed by alexarchambault in #1198
- Use more lightweight Spark distribs in spark tests by alexarchambault in #1207
- Update GraalVM to 22.2.0 by alexarchambault in #1208
- Split integration tests by alexarchambault in #1202
- Debug macOS CI issue on CI by alexarchambault in #1215
- Update docusaurus to 2.0.0-rc.1 by lwronski in #1224
Updates
- Update core_2.13 to 3.7.0 by scala-steward in #1186
- Update core_2.13 to 3.7.1 by scala-steward in #1194
- Update jsoniter-scala-core_2.13 to 2.13.37 by scala-steward in #1197
- Update jsoniter-scala-core_2.13 to 2.13.38 by scala-steward in #1217
- Update ammonite to 2.5.4-13-1ebd00a6 by scala-steward in #1218
- Update core_2.13 to 3.7.2 by scala-steward in #1219
- Update scala-collection-compat to 2.8.1 by scala-steward in #1221
- Update trees_2.13 to 4.5.11 by scala-steward in #1222
- Update coursier-jvm_2.13, ... to 2.1.0-M6-49-gff26f8e39 by scala-steward in #1223
Full Changelog: v0.1.10...v0.1.11
v0.1.10
Initial support for importing other sources via using directives
It is now possible to add sources to a Scala CLI project from a source file, with using file directives:
//> using file "Other.scala"
//> using file "extra/"Note that several sources can be specified in a single directive
//> using file "Other.scala" "extra/"Add dependency update sub-command
Scala CLI can now update dependencies in user projects, using the dependency-update sub-command, like
scala-cli dependency-update --all .
When updates are available, this sub-command asks whether to update each of those, right where these dependencies are defined.
Running snippets passed as arguments
Scala CLI can now run Scala or Java code passed on the command-line, via -e / --script-snippet / --scala-snippet / --java-snippet:
$ scala-cli -e 'println("Hello")'
Hello
$ scala-cli --script-snippet 'println("Hello")'
Hello
$ scala-cli --scala-snippet '@main def run() = println("Hello")'
Hello
$ scala-cli --java-snippet 'public class Main { public static void main(String[] args) { System.out.println("Hello"); } }'
Hello
These options are meant to be substitutes to the -e option of the scala script that ships in scalac archives.
Uninstall instructions and uninstall sub-command
Uninstalling Scala CLI is now documented in the main installation page, right after the installation instructions. In particular, when installed via the installation script, Scala CLI can be uninstalled via a newly added uninstall sub-command.
Added in #1122 and #1152 by @wleczny.
Important fixes & enhancements
ES modules
Scala CLI now supports the ES Scala.js module kind, that can be enabled via a //> using jsModuleKind "esmodule" directive, allowing to import other ES modules in particular.
Added in #1142 by @hugo-vrijswijk.
Putting Java options in assemblies, launchers, and docker images, in package sub-command
Passing --java-opt and --java-prop options to the package sub-command is now allowed. The passed options are
hard-coded in the generated assemblies or launchers, and in docker images.
--command and --scratch-dir options in run sub-command
The run sub-command can now print the command it would have run, rather than running it. This can be useful for debugging purposes, or if users want to manually tweak commands right before they are run. Pass --command to run to enable it. This prints one argument per line, for easier automated processing:
$ scala-cli run --command -e 'println("Hello")' --runner=false
~/Library/Caches/Coursier/arc/https/github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.2%252B8/OpenJDK17U-jdk_x64_mac_hotspot_17.0.2_8.tar.gz/jdk-17.0.2+8/Contents/Home/bin/java
-cp
~/Library/Caches/ScalaCli/virtual-projects/ee/project-3c6fdea1/.scala-build/project_ed4bea6d06_ed4bea6d06/classes/main:~/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala3-library_3/3.1.3/scala3-library_3-3.1.3.jar:~/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.8/scala-library-2.13.8.jar
snippet_sc
When run relies on temporary files (when Scala.js is used for example), one can pass a temporary directory via --scratch-dir, so that temporary files are kept even when scala-cli doesn't run anymore:
$ scala-cli run --command -e 'println("Hello")' --js --runner=false --scratch-dir ./tmp
node
./tmp/main1690571004533525773.js
Added in #1163 by by @alexarchambault.
Don't put Scala CLI internal modules in packages
Scala CLI doesn't put anymore its stubs module and its "runner" module in generated packages, in the package sub-command.
Fixed in #1161 by @alexarchambault.
Don't write preambles in generated assemblies in the package sub-command
Passing --preamble=false to scala-cli package --assembly makes it generate assemblies without a shell preamble. As a consequence, these assemblies cannot be made executable, but these look more like "standard" JARs, which is required in some contexts.
Fixed in #1161 by @alexarchambault.
Don't put some dependencies in generated assemblies in the package sub-command
Some dependencies, alongside all their transitive dependencies, can be excluded from the generated assemblies. Pass --provided org:name to scala-cli package --assembly to remove a dependency, like
$ scala-cli package SparkJob.scala --assembly --provided org.apache.spark::spark-sql
Note that unlike "provided" dependencies in sbt, and compile-time dependencies in Mill, all transitive dependencies are excluded from the assembly. In the Spark example above, for example, as spark-sql depends on scala-library (the Scala standard library), the latter gets excluded from the assembly too (which works fine in the context of Spark jobs).
Fixed in #1161 by @alexarchambault.
In progress
Experimental Spark capabilities
The package sub-command now accepts a --spark option, to generate assemblies for Spark jobs, ready to be passed to spark-submit. This option is hidden (not printed in scala-cli package --help, only in --help-full), and should be considered experimental.
See this document for more details about these experimental Spark features.
Added in #1086 by @alexarchambault.
Other changes
Documentation
- Add cookbooks for working with Scala CLI in IDEA IntelliJ by @Gedochao in #1149
- Fix VL branding by @lwronski in #1151
- Back port of documentation changes to main by @github-actions in #1154
- Update using directive syntax in scenarios by @lwronski in #1159
- Back port of documentation changes to main by @github-actions in #1165
- Add docs depedency-update by @lwronski in #1178
- Add docs how to install scala-cli via choco by @lwronski in #1179
Build and internal changes
- Update scala-cli.sh launcher for 0.1.9 by @github-actions in #1144
- Update release procedure by @wleczny in #1156
- chore(ci): add in mill-github-dependency-graph by @ckipp01 in #1164
- chore(ci): bump version of mill-github-dependency-graph by @ckipp01 in #1171
- Use Scala CLI 0.1.9 in build by @alexarchambault in #1173
- Stop compiling most stuff with Scala 2 by @alexarchambault in #1113
- Turn the sip mode also for
scala-cli-sipbinary by @romanowski in #1168 - chore(ci): use mill-dependency-submission action by @ckipp01 in #1174
- Fix snippet tests for Windows by @Gedochao in #1172
Updates
- Update mill-main to 0.10.5 by @scala-steward in #1148
- Update snailgun-core, snailgun-core_2.13 to 0.4.1-sc2 by @scala-steward in #1155
- Update jsoniter-scala-core_2.13 to 2.13.35 by @scala-steward in #1169
- Update scala-collection-compat to 2.8.0 by @scala-steward in #1170
- Update jsoniter-scala-core_2.13 to 2.13.36 by @scala-steward in #1175
New Contributors
- @hugo-vrijswijk made their first contribution in #1142
Full Changelog: v0.1.9...v0.1.10
v0.1.9
--list-main-classes for publish & package
publish and package sub-commands now support the --list-main-classes option, which allows to list all the available main classes. Previously it was only available in the run command.
Important fixes & enhancements
fmt options improvement
Added missing documentation on how to pass native scalafmt options in the fmt sub-command with the -F option.
$ scala-cli fmt -F --version
scalafmt 3.5.2
Additionally, a couple of scalafmt's native options received aliases in Scala CLI:
--respect-project-filters is an alias for -F --respect-project-filters. Because of the way sources are passed by Scala CLI to scalafmt under the hood, we now turn it on by default to respect any project.excludePaths settings in the user's .scalafmt.conf.
It can be disabled by passing --respect-project-filters=false to revert to previous behaviour.
This addresses #1121
--scalafmt-help is an alias for -F --help. It shows the --help output from scalafmt, which might prove as helpful reference when in need of using native scalafmt options with -F.
Include libsodium.dll on Windows
Static linking of libsodium in Windows launcher has been fixed.
This addresses #1114
Added in #1115 by @alexarchambault
Force interactive mode for update command
Interactive mode for update sub-command is now enabled by default.
In progress
Publishing-related features
- Publish tweaks + documentation by @alexarchambault in #1107
Better BSP support for Scala scripts
- Add scala-sc language to BSP supported languages by @alexarchambault in #1140
Other changes
Documentation PRs
- Update scala 2.12 to 2.12.16 in docs by @lwronski in #1108
- Back port of documentation changes to main by @github-actions in #1111
- Tweak release procedure by @Gedochao in #1112
Build and internal changes
- Add choco configuration files by @lwronski in #998
- Tweaking by @alexarchambault in #1105
- Add scala-cli-setup deploy key to ssh-agent by @lwronski in #1117
Updates
- Update scala-cli.sh launcher for 0.1.8 by @github-actions in #1106
- Update case-app to 2.1.0-M14 by @alexarchambault in #1120
- Update Scala to 3.1.3 by @alexarchambault in #1124
- Update jsoniter-scala-core_2.13 to 2.13.32 by @scala-steward in #1125
- Update coursier-jvm_2.13, ... to 2.1.0-M6-28-gbad85693f by @scala-steward in #1126
- Update libsodiumjni to 0.0.3 by @scala-steward in #1127
- Update org.eclipse.jgit to 6.2.0.202206071550-r by @scala-steward in #1128
- Update Scala.js to 1.10.1 by @scala-steward in #1130
- Update Scala Native to 0.4.5 by @alexarchambault in #1133
- Update scala-js-cli to 1.1.1-sc5 by @alexarchambault in #1134
- Update jsoniter-scala-core_2.13 to 2.13.33 by @scala-steward in #1136
- Update
scalafmtto 3.5.8 by @Gedochao in #1137 - Update cli-options_2.13, cli_2.13, ... to 0.1.7 by @scala-steward in #1138
Full Changelog: v0.1.8...v0.1.9
v0.1.8
--list-main-classes option for the run command
You can pass the option --list-main-classes to the run command to list all the available main classes, including
scripts.
$ scala-cli . --list-main-classes
Hello scripts.AnotherScript_sc scripts.Script_sc
Add config command
The config sub-command allows to get and set various configuration values, intended for use by
other Scala CLI sub-commands.
This feature has been added in preparation for the publish command, stay tuned for future announcements.
Added in #1056 by @alexarchambault
Prioritise non-script main classes
When trying to run a directory containing scripts and just a single non-script main class, the non-script main class
will now be prioritised and run by default.
$ scala-cli .
Running Hello. Also detected script main classes: scripts.AnotherScript_sc, scripts.Script_sc
You can run any one of them by passing option --main-class, i.e. --main-class scripts.AnotherScript_sc
All available main classes can always be listed by passing option --list-main-classes
Hello world
Important bugfixes
Accept latest Scala versions despite stale Scala version listings in cache
Scala CLI uses version listings from Maven Central to check if a Scala version is valid. When new Scala versions are
released, users could sometimes have stale version listings in their Coursier cache for a short period of time (the
Coursier cache TTL, which is 24 hours by default). This prevented these users to use new Scala versions during that
time.
To work around that, Scala CLI now tries to re-download version listings when they don't have the requested Scala
version.
This addresses #1090
Bloop now uses JAVA_HOME by default
Bloop should now pick up the JDK available in JAVA_HOME. It was formerly necessary to pass --bloop-jvm system
explicitly. This addresses #1102
The -coverage-out option now accepts relative paths
Scala CLI now correctly processes relative paths when passed to the -coverage-out option. Formerly,
the scoverage.coverage file would not be properly generated when a relative path was passed.
This addresses #1072
Other changes
Documentation PRs
- Improve scripts guide by @Gedochao in #1074
- Update installation instructions for Nix by @kubukoz in #1082
- Tweak docs by @alexarchambault in #1085
- Some typos & rewording on the single-module projects use case page by @Baccata
in #1089
Fixes
Build and internal changes
- Update scala-cli.sh launcher for 0.1.7 by @github-actions in #1076
- Tweaking by @alexarchambault in #1087
Full Changelog: v0.1.7...v0.1.8
v0.1.7
Support for printing help from scala compiler
Help from the scala compiler can now be printed without passing any sources:
$ scala-cli --scalac-help
Usage: scalac <options> <source files>
where possible standard options include:
-Dproperty=value Pass -Dproperty=value directly to the runtime system.
-J<flag> Pass <flag> directly to the runtime system.
...
Other scalac print help options (like -X, -Xshow-phases, -Vphases, etc.) are supported as well.
$ scala-cli -Xshow-phases
...
Possible advanced options include:
-Xcheck-macros Check some invariants of macro generated code while
...Scala CLI is built using mill-scala-cli Mill plugin
We now rely on mill-scala-cli Mill plugin, which allows compiling Scala modules with Scala CLI rather than with Mill's ZincWorker.
To see more go to mill-scala-cli and try it in your project.
Added in #1042 by @alexarchambault
Add default-file command
The default-file sub-command provides sensible default content for files such as .gitignore or for GitHub actions workflows, for Scala CLI projects.
$ scala-cli default-file --write .gitignore .github/workflows/ci.yml
Wrote .gitignore
Wrote .github/workflows/ci.yml
To see more go to default-file section in documentation.
Added in #1027 by @alexarchambault
Enhancements
Setup-ide use symlink if target is the same as current launcher
The path to Scala CLI points to the symlink if the launcher path is the same as the canonical path which targets the symlink.
Better messages in doctor
The doctor command now has a better suggestion to update scala-cli.
In progress
More publishing-related features
- Add pgp {push,pull,key-id} commands by @alexarchambault in #1020
Interactive mode
Other changes
Documentation PRs
- Add more docs for piping sources by @Gedochao in #1053
- Add cookbook - How to use scala-cli in GH actions by @lwronski in #1031
- Update/docusaurus by @lwronski in #1051
- Ensure the latest Scala / Scala.js versions are used in version listings in doc by @alexarchambault in #1034
- Add section about external projects in README by @alexarchambault #1075
Updates
- Update trees_2.13 to 4.5.8 by @scala-steward in #1046
- Update jsoniter-scala-core, ... to 2.13.26 by @scala-steward in #1045
- Use Scala CLI 0.1.6 from Mill to compile project by @alexarchambault in #1037
- Update scala-cli.sh launcher for 0.1.6 by @github-actions in #1035
Build and internal changes
- Use coursier support for ~/.m2/settings.xml for proxy auth by @alexarchambault in #1058
- Tweaking by @alexarchambault in #1057
- Tweak jsoniter-scala dependency by @alexarchambault in #1044
- Use closest previous version when looking for stable Scala versions by @alexarchambault in #1032
- Name target dir with a unique name by @lwronski in #1036
- Use external binary to extract class name from stdin Java sources by @alexarchambault #1068
Contributors
Thank you to all the contributors who made this release possible 🎉
According to git shortlog -sn --no-merges v0.1.6...v0.1.7 these are:
34 Alexandre Archambault
12 Piotr Chabelski
7 Łukasz Wroński
Full Changelog: v0.1.6...v0.1.7