mill icon indicating copy to clipboard operation
mill copied to clipboard

[Feature Request] Build mill totally offline

Open Avimitin opened this issue 8 months ago • 9 comments

There is no prepareOffline target for dist and dist.assembly task, which make it hard to prefetch dependencies for mill and run dist.assembly in an offline environment. And allPublishModules is a lazy value that can't be access from command line. I wonder if it is possible to provide a new target that expose prepareOffline for all the publish module.

Avimitin avatar Apr 25 '25 12:04 Avimitin

prepareOffline comes from mill.scalalib.OfflineSupportModule. It is inherited by all JavaModules and PublishModules.

dist should have a prepareOffline command as it is defined like this: https://github.com/com-lihaoyi/mill/blob/9b5e8194054184f167741a3c1f7d4870750c537c/dist/package.mill#L64

and InstallModule is a PublishModule: https://github.com/com-lihaoyi/mill/blob/9b5e8194054184f167741a3c1f7d4870750c537c/dist/package.mill#L9

I guess we pull some extra deps that are not covered by the default setup.

lefou avatar Apr 25 '25 15:04 lefou

Have you also tried to use the --all flag?

> mill dist.prepareOffline --all
> #or
> mill __.prepareOffline --all

lefou avatar Apr 25 '25 15:04 lefou

@Avimitin You might want to show your error message you get when building offline or join our chat (https://mill-build.org/mill/index.html#_contributing_and_community) so we can figure out more interactively what's missing.

Details

> mill resolve __:PublishModule.prepareOffline
[1/1] resolve
contrib.artifactory.prepareOffline
contrib.bintray.prepareOffline
contrib.buildinfo.prepareOffline
contrib.codeartifact.prepareOffline
contrib.docker.prepareOffline
contrib.flyway.prepareOffline
contrib.gitlab.prepareOffline
contrib.jmh.prepareOffline
contrib.playlib.api.prepareOffline
contrib.playlib.prepareOffline
contrib.playlib.worker[2.6].prepareOffline
contrib.playlib.worker[2.7].prepareOffline
contrib.playlib.worker[2.8].prepareOffline
contrib.playlib.worker[2.9].prepareOffline
contrib.playlib.worker[3.0].prepareOffline
contrib.proguard.prepareOffline
contrib.scalapblib.prepareOffline
contrib.scoverage.api.prepareOffline
contrib.scoverage.prepareOffline
contrib.scoverage.worker2.prepareOffline
contrib.sonatypecentral.prepareOffline
contrib.testng.prepareOffline
contrib.twirllib.prepareOffline
contrib.versionfile.prepareOffline
core.api.prepareOffline
core.constants.prepareOffline
core.define.prepareOffline
core.eval.prepareOffline
core.exec.prepareOffline
core.internal.prepareOffline
core.resolve.prepareOffline
core.util.prepareOffline
dist.dist0.prepareOffline
dist.native.prepareOffline
dist.prepareOffline
libs.androidlib.hilt.prepareOffline
libs.androidlib.prepareOffline
libs.graphviz.prepareOffline
libs.idea.prepareOffline
libs.init.buildgen.prepareOffline
libs.init.gradle.prepareOffline
libs.init.maven.prepareOffline
libs.init.prepareOffline
libs.init.sbt.models[2.12.20].prepareOffline
libs.init.sbt.models[3.6.4].prepareOffline
libs.init.sbt.prepareOffline
libs.javascriptlib.prepareOffline
libs.kotlinlib.prepareOffline
libs.kotlinlib.worker.impl.prepareOffline
libs.kotlinlib.worker.prepareOffline
libs.main.prepareOffline
libs.prepareOffline
libs.pythonlib.prepareOffline
libs.scalajslib.prepareOffline
libs.scalajslib.worker-api.prepareOffline
libs.scalajslib.worker[1].prepareOffline
libs.scalalib.api.prepareOffline
libs.scalalib.backgroundwrapper.prepareOffline
libs.scalalib.classgraph-worker.prepareOffline
libs.scalalib.prepareOffline
libs.scalalib.worker.prepareOffline
libs.scalanativelib.prepareOffline
libs.scalanativelib.worker-api.prepareOffline
libs.scalanativelib.worker[0.5].prepareOffline
libs.testrunner.entrypoint.prepareOffline
libs.testrunner.prepareOffline
runner.bsp.prepareOffline
runner.bsp.worker.prepareOffline
runner.client.prepareOffline
runner.codesig.prepareOffline
runner.meta.prepareOffline
runner.prepareOffline
runner.server.client.prepareOffline
runner.server.prepareOffline
runner.worker-api.prepareOffline
runner.worker.prepareOffline
testkit.prepareOffline
[1/1] ============================== resolve __:PublishModule.prepareOffline ============================== 2s

> mill resolve __:OfflineSupportModule.prepareOffline
[1/1] resolve
contrib.artifactory.prepareOffline
contrib.artifactory.test.prepareOffline
contrib.bintray.prepareOffline
contrib.bintray.test.prepareOffline
contrib.buildinfo.prepareOffline
contrib.buildinfo.test.prepareOffline
contrib.codeartifact.prepareOffline
contrib.codeartifact.test.prepareOffline
contrib.docker.prepareOffline
contrib.docker.test.prepareOffline
contrib.flyway.prepareOffline
contrib.flyway.test.prepareOffline
contrib.gitlab.prepareOffline
contrib.gitlab.test.prepareOffline
contrib.jmh.prepareOffline
contrib.jmh.test.prepareOffline
contrib.playlib.api.prepareOffline
contrib.playlib.prepareOffline
contrib.playlib.test.prepareOffline
contrib.playlib.worker[2.6].prepareOffline
contrib.playlib.worker[2.6].test.prepareOffline
contrib.playlib.worker[2.7].prepareOffline
contrib.playlib.worker[2.7].test.prepareOffline
contrib.playlib.worker[2.8].prepareOffline
contrib.playlib.worker[2.8].test.prepareOffline
contrib.playlib.worker[2.9].prepareOffline
contrib.playlib.worker[2.9].test.prepareOffline
contrib.playlib.worker[3.0].prepareOffline
contrib.playlib.worker[3.0].test.prepareOffline
contrib.proguard.prepareOffline
contrib.proguard.test.prepareOffline
contrib.scalapblib.prepareOffline
contrib.scalapblib.test.prepareOffline
contrib.scoverage.api.prepareOffline
contrib.scoverage.prepareOffline
contrib.scoverage.test.prepareOffline
contrib.scoverage.worker2.prepareOffline
contrib.scoverage.worker2.test.prepareOffline
contrib.sonatypecentral.prepareOffline
contrib.sonatypecentral.test.prepareOffline
contrib.testng.prepareOffline
contrib.testng.test.prepareOffline
contrib.twirllib.prepareOffline
contrib.twirllib.test.prepareOffline
contrib.versionfile.prepareOffline
contrib.versionfile.test.prepareOffline
core.api.prepareOffline
core.api.test.prepareOffline
core.constants.prepareOffline
core.constants.test.prepareOffline
core.define.prepareOffline
core.define.test.prepareOffline
core.eval.prepareOffline
core.eval.test.prepareOffline
core.exec.prepareOffline
core.exec.test.prepareOffline
core.internal.prepareOffline
core.internal.test.prepareOffline
core.resolve.prepareOffline
core.resolve.test.prepareOffline
core.util.prepareOffline
core.util.test.prepareOffline
dist.dist0.prepareOffline
dist.native.JvmWorkerGraalvm.prepareOffline
dist.native.prepareOffline
dist.prepareOffline
dummy[com.facebook_ktfmt_0.53].prepareOffline
dummy[com.github.sbt.junit_jupiter-interface_0.13.3].prepareOffline
dummy[com.github.sbt_junit-interface_0.13.2].prepareOffline
dummy[com.google.code.gson_gson_2.11.0].prepareOffline
dummy[com.google.errorprone_error_prone_core_2.31.0].prepareOffline
dummy[com.google.guava_guava_33.4.0-jre].prepareOffline
dummy[com.google.protobuf_protobuf-java_4.29.3].prepareOffline
dummy[com.guardsquare_proguard-base_7.7.0].prepareOffline
dummy[com.lihaoyi_acyclic_3.6.4_0.3.18].prepareOffline
dummy[com.lihaoyi_ammonite_3.6.4_3.0.2].prepareOffline
dummy[com.palantir.javaformat_palantir-java-format_2.51.0].prepareOffline
dummy[com.pinterest.ktlint_ktlint-core_0.49.1].prepareOffline
dummy[com.sourcegraph_semanticdb-java_0.10.3].prepareOffline
dummy[commons-io_commons-io_2.18.0].prepareOffline
dummy[dev.zio_zio-test_3_2.1.14].prepareOffline
dummy[io.chris-kipp_mill-scip_mill0.11_3_0.3.7].prepareOffline
dummy[io.gitlab.arturbosch.detekt_detekt-cli_1.23.7].prepareOffline
dummy[io.kotest_kotest-framework-multiplatform-plugin-embeddable-compiler-jvm_5.9.1].prepareOffline
dummy[org.apache.ant_ant_1.10.15].prepareOffline
dummy[org.apache.commons_commons-compress_1.27.1].prepareOffline
dummy[org.freemarker_freemarker_2.3.34].prepareOffline
dummy[org.jetbrains.dokka_analysis-kotlin-descriptors_2.0.0].prepareOffline
dummy[org.jetbrains.dokka_dokka-base_2.0.0].prepareOffline
dummy[org.jetbrains.dokka_dokka-cli_2.0.0].prepareOffline
dummy[org.jetbrains.kotlinx_kotlinx-html-jvm_0.11.0].prepareOffline
dummy[org.jetbrains.kotlinx_kover-cli_0.8.3].prepareOffline
dummy[org.jetbrains.kotlinx_kover-jvm-agent_0.8.3].prepareOffline
dummy[org.revapi_revapi-standalone_0.12.0].prepareOffline
dummy[org.scalameta_semanticdb-scalac_3.6.4_4.13.4].prepareOffline
dummy[org.scalatest_scalatest_3_3.2.19].prepareOffline
dummy[org.scoverage_scalac-scoverage-plugin_3.6.4_2.3.0].prepareOffline
dummy[org.yaml_snakeyaml_2.3].prepareOffline
integration.bootstrap[no-java-bootstrap].prepareOffline
integration.bootstrap[no-java-bootstrap].test.prepareOffline
integration.failure[compile-error].prepareOffline
integration.failure[compile-error].test.prepareOffline
integration.failure[cross-collisions].prepareOffline
integration.failure[cross-collisions].test.prepareOffline
integration.failure[fatal-error].prepareOffline
integration.failure[fatal-error].test.prepareOffline
integration.failure[invalid-meta-module].prepareOffline
integration.failure[invalid-meta-module].test.prepareOffline
integration.failure[invalid-package-declaration].prepareOffline
integration.failure[invalid-package-declaration].test.prepareOffline
integration.failure[invalid-root-module].prepareOffline
integration.failure[invalid-root-module].test.prepareOffline
integration.failure[invalid-subfolder-root-module].prepareOffline
integration.failure[invalid-subfolder-root-module].test.prepareOffline
integration.failure[misnamed-root-module].prepareOffline
integration.failure[misnamed-root-module].test.prepareOffline
integration.failure[missing-build-file].prepareOffline
integration.failure[missing-build-file].test.prepareOffline
integration.failure[module-init-error].prepareOffline
integration.failure[module-init-error].test.prepareOffline
integration.failure[module-outside-top-level-module].prepareOffline
integration.failure[module-outside-top-level-module].test.prepareOffline
integration.failure[no-modules-in-helper-file].prepareOffline
integration.failure[no-modules-in-helper-file].test.prepareOffline
integration.failure[non-exclusive-command-evaluator].prepareOffline
integration.failure[non-exclusive-command-evaluator].test.prepareOffline
integration.failure[non-exclusive-depends-on-exclusive].prepareOffline
integration.failure[non-exclusive-depends-on-exclusive].test.prepareOffline
integration.failure[os-checker].prepareOffline
integration.failure[os-checker].test.prepareOffline
integration.failure[parse-error].prepareOffline
integration.failure[parse-error].test.prepareOffline
integration.failure[root-module-compile-error].prepareOffline
integration.failure[root-module-compile-error].test.prepareOffline
integration.failure[root-subfolder-module-collision].prepareOffline
integration.failure[root-subfolder-module-collision].test.prepareOffline
integration.feature[auxiliary-class-files].prepareOffline
integration.feature[auxiliary-class-files].test.prepareOffline
integration.feature[cross-file-references].prepareOffline
integration.feature[cross-file-references].test.prepareOffline
integration.feature[full-run-logs].prepareOffline
integration.feature[full-run-logs].test.prepareOffline
integration.feature[header-mvn-deps-worker-invalidation].prepareOffline
integration.feature[header-mvn-deps-worker-invalidation].test.prepareOffline
integration.feature[header-repo-config].prepareOffline
integration.feature[header-repo-config].test.prepareOffline
integration.feature[hygiene].prepareOffline
integration.feature[hygiene].test.prepareOffline
integration.feature[inspect].prepareOffline
integration.feature[inspect].test.prepareOffline
integration.feature[keyword-module].prepareOffline
integration.feature[keyword-module].test.prepareOffline
integration.feature[large-project].prepareOffline
integration.feature[large-project].test.prepareOffline
integration.feature[launcher-old-versions].prepareOffline
integration.feature[launcher-old-versions].test.prepareOffline
integration.feature[meta-skip-compile].prepareOffline
integration.feature[meta-skip-compile].test.prepareOffline
integration.feature[mill-jvm-opts-env].prepareOffline
integration.feature[mill-jvm-opts-env].test.prepareOffline
integration.feature[mill-jvm-opts-header].prepareOffline
integration.feature[mill-jvm-opts-header].test.prepareOffline
integration.feature[mill-jvm-opts].prepareOffline
integration.feature[mill-jvm-opts].test.prepareOffline
integration.feature[non-identifier-import].prepareOffline
integration.feature[non-identifier-import].test.prepareOffline
integration.feature[output-directory].prepareOffline
integration.feature[output-directory].test.prepareOffline
integration.feature[private-methods].prepareOffline
integration.feature[private-methods].test.prepareOffline
integration.feature[root-cross-module].prepareOffline
integration.feature[root-cross-module].test.prepareOffline
integration.feature[run-background].prepareOffline
integration.feature[run-background].test.prepareOffline
integration.feature[scala-3-syntax].prepareOffline
integration.feature[scala-3-syntax].test.prepareOffline
integration.feature[scoverage].prepareOffline
integration.feature[scoverage].test.prepareOffline
integration.feature[shutdown-exit-code].prepareOffline
integration.feature[shutdown-exit-code].test.prepareOffline
integration.feature[subprocess-stdout].prepareOffline
integration.feature[subprocess-stdout].test.prepareOffline
integration.ide[bloop].prepareOffline
integration.ide[bloop].test.prepareOffline
integration.ide[bsp-modules].prepareOffline
integration.ide[bsp-modules].test.prepareOffline
integration.ide[bsp-server].prepareOffline
integration.ide[bsp-server].test.prepareOffline
integration.ide[build-classpath-contents].prepareOffline
integration.ide[build-classpath-contents].test.prepareOffline
integration.ide[gen-idea].prepareOffline
integration.ide[gen-idea].test.prepareOffline
integration.invalidation[codesig-hello].prepareOffline
integration.invalidation[codesig-hello].test.prepareOffline
integration.invalidation[codesig-nested].prepareOffline
integration.invalidation[codesig-nested].test.prepareOffline
integration.invalidation[codesig-scalamodule].prepareOffline
integration.invalidation[codesig-scalamodule].test.prepareOffline
integration.invalidation[codesig-subfolder].prepareOffline
integration.invalidation[codesig-subfolder].test.prepareOffline
integration.invalidation[invalidation].prepareOffline
integration.invalidation[invalidation].test.prepareOffline
integration.invalidation[multi-level-editing].prepareOffline
integration.invalidation[multi-level-editing].test.prepareOffline
integration.invalidation[process-file-deleted-exit].prepareOffline
integration.invalidation[process-file-deleted-exit].test.prepareOffline
integration.invalidation[run-background].prepareOffline
integration.invalidation[run-background].test.prepareOffline
integration.invalidation[selective-execution].prepareOffline
integration.invalidation[selective-execution].test.prepareOffline
integration.invalidation[version-change].prepareOffline
integration.invalidation[version-change].test.prepareOffline
integration.invalidation[watch-source-input].prepareOffline
integration.invalidation[watch-source-input].test.prepareOffline
integration.invalidation[zinc-build-compilation].prepareOffline
integration.invalidation[zinc-build-compilation].test.prepareOffline
integration.invalidation[zinc-incremental-compilation].prepareOffline
integration.invalidation[zinc-incremental-compilation].test.prepareOffline
integration.migrating[init].prepareOffline
integration.migrating[init].test.prepareOffline
libs.androidlib.hilt.prepareOffline
libs.androidlib.hilt.test.prepareOffline
libs.androidlib.prepareOffline
libs.androidlib.test.prepareOffline
libs.graphviz.prepareOffline
libs.graphviz.test.prepareOffline
libs.idea.prepareOffline
libs.idea.test.prepareOffline
libs.init.buildgen.prepareOffline
libs.init.buildgen.test.prepareOffline
libs.init.gradle.prepareOffline
libs.init.gradle.test.prepareOffline
libs.init.maven.prepareOffline
libs.init.maven.test.prepareOffline
libs.init.prepareOffline
libs.init.sbt.exportplugin.prepareOffline
libs.init.sbt.models[2.12.20].prepareOffline
libs.init.sbt.models[3.6.4].prepareOffline
libs.init.sbt.prepareOffline
libs.init.sbt.test.prepareOffline
libs.init.test.prepareOffline
libs.javascriptlib.prepareOffline
libs.javascriptlib.test.prepareOffline
libs.kotlinlib.prepareOffline
libs.kotlinlib.test.prepareOffline
libs.kotlinlib.worker.impl.prepareOffline
libs.kotlinlib.worker.impl.test.prepareOffline
libs.kotlinlib.worker.prepareOffline
libs.kotlinlib.worker.test.prepareOffline
libs.main.prepareOffline
libs.main.test.prepareOffline
libs.prepareOffline
libs.pythonlib.prepareOffline
libs.pythonlib.test.prepareOffline
libs.scalajslib.prepareOffline
libs.scalajslib.test.prepareOffline
libs.scalajslib.worker-api.prepareOffline
libs.scalajslib.worker-api.test.prepareOffline
libs.scalajslib.worker[1].prepareOffline
libs.scalajslib.worker[1].test.prepareOffline
libs.scalalib.api.prepareOffline
libs.scalalib.api.test.prepareOffline
libs.scalalib.backgroundwrapper.prepareOffline
libs.scalalib.classgraph-worker.prepareOffline
libs.scalalib.classgraph-worker.test.prepareOffline
libs.scalalib.prepareOffline
libs.scalalib.test.prepareOffline
libs.scalalib.worker.prepareOffline
libs.scalalib.worker.test.prepareOffline
libs.scalanativelib.prepareOffline
libs.scalanativelib.test.prepareOffline
libs.scalanativelib.worker-api.prepareOffline
libs.scalanativelib.worker-api.test.prepareOffline
libs.scalanativelib.worker[0.5].prepareOffline
libs.scalanativelib.worker[0.5].test.prepareOffline
libs.test.prepareOffline
libs.testrunner.entrypoint.prepareOffline
libs.testrunner.prepareOffline
libs.testrunner.test.prepareOffline
runner.bsp.prepareOffline
runner.bsp.test.prepareOffline
runner.bsp.worker.prepareOffline
runner.bsp.worker.test.prepareOffline
runner.client.prepareOffline
runner.client.test.prepareOffline
runner.codesig.prepareOffline
runner.codesig.test.cases[callgraph-basic-1-static-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-1-static-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-10-overridden-static-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-10-overridden-static-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-11-peer-inherited-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-11-peer-inherited-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-12-java-lambda].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-12-java-lambda].prepareOffline
runner.codesig.test.cases[callgraph-basic-13-java-anon-class-lambda].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-13-java-anon-class-lambda].prepareOffline
runner.codesig.test.cases[callgraph-basic-14-clinit].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-14-clinit].prepareOffline
runner.codesig.test.cases[callgraph-basic-15-private-method-not-inherited].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-15-private-method-not-inherited].prepareOffline
runner.codesig.test.cases[callgraph-basic-16-scala-static-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-16-scala-static-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-17-scala-lambda].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-17-scala-lambda].prepareOffline
runner.codesig.test.cases[callgraph-basic-18-scala-anon-class-lambda].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-18-scala-anon-class-lambda].prepareOffline
runner.codesig.test.cases[callgraph-basic-19-scala-trait-constructor].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-19-scala-trait-constructor].prepareOffline
runner.codesig.test.cases[callgraph-basic-2-instance-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-2-instance-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-20-array-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-20-array-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-3-sam-interface-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-3-sam-interface-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-4-multi-interface-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-4-multi-interface-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-5-inherited-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-5-inherited-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-6-inherited-interface-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-6-inherited-interface-method].prepareOffline
runner.codesig.test.cases[callgraph-basic-7-transitive-static-methods].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-7-transitive-static-methods].prepareOffline
runner.codesig.test.cases[callgraph-basic-8-transitive-virtual-methods].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-8-transitive-virtual-methods].prepareOffline
runner.codesig.test.cases[callgraph-basic-9-overridden-virtual-method].external.prepareOffline
runner.codesig.test.cases[callgraph-basic-9-overridden-virtual-method].prepareOffline
runner.codesig.test.cases[callgraph-complicated-1-statics].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-1-statics].prepareOffline
runner.codesig.test.cases[callgraph-complicated-10-iterator-foreach-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-10-iterator-foreach-scala].prepareOffline
runner.codesig.test.cases[callgraph-complicated-11-iterator-callback-class-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-11-iterator-callback-class-scala].prepareOffline
runner.codesig.test.cases[callgraph-complicated-12-iterator-inherit-external-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-12-iterator-inherit-external-scala].prepareOffline
runner.codesig.test.cases[callgraph-complicated-13-iterator-inherit-external-filter-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-13-iterator-inherit-external-filter-scala].prepareOffline
runner.codesig.test.cases[callgraph-complicated-14-singleton-objects-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-14-singleton-objects-scala].prepareOffline
runner.codesig.test.cases[callgraph-complicated-2-sudoku].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-2-sudoku].prepareOffline
runner.codesig.test.cases[callgraph-complicated-3-classes-cars].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-3-classes-cars].prepareOffline
runner.codesig.test.cases[callgraph-complicated-4-classes-parent].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-4-classes-parent].prepareOffline
runner.codesig.test.cases[callgraph-complicated-5-classes-sheep].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-5-classes-sheep].prepareOffline
runner.codesig.test.cases[callgraph-complicated-6-classes-misc-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-6-classes-misc-scala].prepareOffline
runner.codesig.test.cases[callgraph-complicated-7-manifest-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-7-manifest-scala].prepareOffline
runner.codesig.test.cases[callgraph-complicated-8-linked-list-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-8-linked-list-scala].prepareOffline
runner.codesig.test.cases[callgraph-complicated-9-array-seq-scala].external.prepareOffline
runner.codesig.test.cases[callgraph-complicated-9-array-seq-scala].prepareOffline
runner.codesig.test.cases[callgraph-external-1-sam-interface-method].external.prepareOffline
runner.codesig.test.cases[callgraph-external-1-sam-interface-method].prepareOffline
runner.codesig.test.cases[callgraph-external-10-abstract-class-indirect-inheritance-not-called].external.prepareOffline
runner.codesig.test.cases[callgraph-external-10-abstract-class-indirect-inheritance-not-called].prepareOffline
runner.codesig.test.cases[callgraph-external-11-abstract-class-indirect-delegation-called].external.prepareOffline
runner.codesig.test.cases[callgraph-external-11-abstract-class-indirect-delegation-called].prepareOffline
runner.codesig.test.cases[callgraph-external-12-abstract-class-indirect-delegation-uncalled].external.prepareOffline
runner.codesig.test.cases[callgraph-external-12-abstract-class-indirect-delegation-uncalled].prepareOffline
runner.codesig.test.cases[callgraph-external-13-interface-two-implementations-interface-call].external.prepareOffline
runner.codesig.test.cases[callgraph-external-13-interface-two-implementations-interface-call].prepareOffline
runner.codesig.test.cases[callgraph-external-14-interface-two-implementations-direct-call].external.prepareOffline
runner.codesig.test.cases[callgraph-external-14-interface-two-implementations-direct-call].prepareOffline
runner.codesig.test.cases[callgraph-external-15-static-method].external.prepareOffline
runner.codesig.test.cases[callgraph-external-15-static-method].prepareOffline
runner.codesig.test.cases[callgraph-external-16-external-method-edge-to-inherited-method-override].external.prepareOffline
runner.codesig.test.cases[callgraph-external-16-external-method-edge-to-inherited-method-override].prepareOffline
runner.codesig.test.cases[callgraph-external-17-jcanvas].external.prepareOffline
runner.codesig.test.cases[callgraph-external-17-jcanvas].prepareOffline
runner.codesig.test.cases[callgraph-external-18-external-method-calls-parent-method].external.prepareOffline
runner.codesig.test.cases[callgraph-external-18-external-method-calls-parent-method].prepareOffline
runner.codesig.test.cases[callgraph-external-2-multi-interface-method].external.prepareOffline
runner.codesig.test.cases[callgraph-external-2-multi-interface-method].prepareOffline
runner.codesig.test.cases[callgraph-external-3-sam-interface-never-instantiated].external.prepareOffline
runner.codesig.test.cases[callgraph-external-3-sam-interface-never-instantiated].prepareOffline
runner.codesig.test.cases[callgraph-external-4-multi-interface-never-instantiated].external.prepareOffline
runner.codesig.test.cases[callgraph-external-4-multi-interface-never-instantiated].prepareOffline
runner.codesig.test.cases[callgraph-external-5-sam-interface-never-called].external.prepareOffline
runner.codesig.test.cases[callgraph-external-5-sam-interface-never-called].prepareOffline
runner.codesig.test.cases[callgraph-external-6-multi-interface-never-called].external.prepareOffline
runner.codesig.test.cases[callgraph-external-6-multi-interface-never-called].prepareOffline
runner.codesig.test.cases[callgraph-external-7-sam-abstract-class-maybe-called].external.prepareOffline
runner.codesig.test.cases[callgraph-external-7-sam-abstract-class-maybe-called].prepareOffline
runner.codesig.test.cases[callgraph-external-8-multi-abstract-class-maybe-called].external.prepareOffline
runner.codesig.test.cases[callgraph-external-8-multi-abstract-class-maybe-called].prepareOffline
runner.codesig.test.cases[callgraph-external-9-abstract-class-indirect-inheritance-called].external.prepareOffline
runner.codesig.test.cases[callgraph-external-9-abstract-class-indirect-inheritance-called].prepareOffline
runner.codesig.test.cases[callgraph-realistic-1-tetris].external.prepareOffline
runner.codesig.test.cases[callgraph-realistic-1-tetris].prepareOffline
runner.codesig.test.cases[callgraph-realistic-2-ribbon].external.prepareOffline
runner.codesig.test.cases[callgraph-realistic-2-ribbon].prepareOffline
runner.codesig.test.cases[callgraph-realistic-3-par-merge-sort].external.prepareOffline
runner.codesig.test.cases[callgraph-realistic-3-par-merge-sort].prepareOffline
runner.codesig.test.cases[callgraph-realistic-4-actors].external.prepareOffline
runner.codesig.test.cases[callgraph-realistic-4-actors].prepareOffline
runner.codesig.test.cases[callgraph-realistic-5-parser].external.prepareOffline
runner.codesig.test.cases[callgraph-realistic-5-parser].prepareOffline
runner.codesig.test.cases[methodhash-changed-basic].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-basic].prepareOffline
runner.codesig.test.cases[methodhash-changed-constant-large].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-constant-large].prepareOffline
runner.codesig.test.cases[methodhash-changed-constant-small].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-constant-small].prepareOffline
runner.codesig.test.cases[methodhash-changed-constant-string].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-constant-string].prepareOffline
runner.codesig.test.cases[methodhash-changed-different-field-read].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-different-field-read].prepareOffline
runner.codesig.test.cases[methodhash-changed-if-else-biased].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-if-else-biased].prepareOffline
runner.codesig.test.cases[methodhash-changed-if-else-reverse-conditional].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-if-else-reverse-conditional].prepareOffline
runner.codesig.test.cases[methodhash-changed-if-else].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-if-else].prepareOffline
runner.codesig.test.cases[methodhash-changed-if].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-if].prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call-instance].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call-instance].prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call-parameter].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call-parameter].prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call-renamed].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call-renamed].prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call-transitive-change].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call-transitive-change].prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-local-call].prepareOffline
runner.codesig.test.cases[methodhash-changed-switch-keys].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-switch-keys].prepareOffline
runner.codesig.test.cases[methodhash-changed-switch-remove-break].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-switch-remove-break].prepareOffline
runner.codesig.test.cases[methodhash-changed-switch].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-switch].prepareOffline
runner.codesig.test.cases[methodhash-changed-two-calls].external.prepareOffline
runner.codesig.test.cases[methodhash-changed-two-calls].prepareOffline
runner.codesig.test.cases[methodhash-unchanged-simple-java-2].external.prepareOffline
runner.codesig.test.cases[methodhash-unchanged-simple-java-2].prepareOffline
runner.codesig.test.cases[methodhash-unchanged-simple-java].external.prepareOffline
runner.codesig.test.cases[methodhash-unchanged-simple-java].prepareOffline
runner.codesig.test.cases[methodhash-unchanged-simple-scala-2].external.prepareOffline
runner.codesig.test.cases[methodhash-unchanged-simple-scala-2].prepareOffline
runner.codesig.test.cases[methodhash-unchanged-simple-scala].external.prepareOffline
runner.codesig.test.cases[methodhash-unchanged-simple-scala].prepareOffline
runner.codesig.test.cases[methodhash-unchanged-sourcecode-line-2].external.prepareOffline
runner.codesig.test.cases[methodhash-unchanged-sourcecode-line-2].prepareOffline
runner.codesig.test.cases[methodhash-unchanged-sourcecode-line].external.prepareOffline
runner.codesig.test.cases[methodhash-unchanged-sourcecode-line].prepareOffline
runner.codesig.test.prepareOffline
runner.meta.prepareOffline
runner.meta.test.prepareOffline
runner.prepareOffline
runner.server.client.prepareOffline
runner.server.client.test.prepareOffline
runner.server.prepareOffline
runner.server.test.prepareOffline
runner.test.prepareOffline
runner.worker-api.prepareOffline
runner.worker-api.test.prepareOffline
runner.worker.prepareOffline
runner.worker.test.prepareOffline
testkit.prepareOffline
testkit.test.prepareOffline
website.site.prepareOffline
[1/1] ============================== resolve __:OfflineSupportModule.prepareOffline ============================== 2s

lefou avatar Apr 25 '25 16:04 lefou

prepareOffline comes from mill.scalalib.OfflineSupportModule. It is inherited by all JavaModules and PublishModules.

dist should have a prepareOffline command as it is defined like this:

Sorry I have a totally wrong description. The actual behavior is that running dist.prepareOffline target will not download some dependencies, and thus can't find JAR under my cache when running offline:

Log
[1617/1617] ============================== dist.assembly ============================== 17s
6 tasks failed
runner.linenumbers.enablePluginScalacOptions.super.ScalaModule
Resolution failed for 1 modules:
--------------------------------------------
  com.lihaoyi:acyclic_2.13.15:0.3.15
        No test override found at jdk.internal.loader.ClassLoaders$AppClassLoader@639fee48/mill/local-test-overrides/com.lihaoyi-acyclic_2.13.15
        Not an internal Mill module: com.lihaoyi:acyclic_2.13.15:0.3.15
        not found: /build/.coursier/local/com.lihaoyi/acyclic_2.13.15/0.3.15/ivys/ivy.xml
        download error: Caught java.net.UnknownHostException (repo1.maven.org) while downloading https://repo1.maven.org/maven2/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom
        download error: Caught java.net.UnknownHostException (oss.sonatype.org) while downloading https://oss.sonatype.org/content/repositories/releases/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom

--------------------------------------------

For additional information on library dependencies, see the docs at
https://mill-build.org/mill/Library_Dependencies.html

runner.linenumbers.scalacPluginClasspath
Resolution failed for 1 modules:
--------------------------------------------
  com.lihaoyi:acyclic_2.13.15:0.3.15
        No test override found at jdk.internal.loader.ClassLoaders$AppClassLoader@639fee48/mill/local-test-overrides/com.lihaoyi-acyclic_2.13.15
        Not an internal Mill module: com.lihaoyi:acyclic_2.13.15:0.3.15
        not found: /build/.coursier/local/com.lihaoyi/acyclic_2.13.15/0.3.15/ivys/ivy.xml
        download error: Caught java.net.UnknownHostException (repo1.maven.org) while downloading https://repo1.maven.org/maven2/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom
        download error: Caught java.net.UnknownHostException (oss.sonatype.org) while downloading https://oss.sonatype.org/content/repositories/releases/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom

--------------------------------------------

For additional information on library dependencies, see the docs at
https://mill-build.org/mill/Library_Dependencies.html

scalanativelib.worker-api.enablePluginScalacOptions.super.ScalaModule
Resolution failed for 1 modules:
--------------------------------------------
  com.lihaoyi:acyclic_2.13.15:0.3.15
        No test override found at jdk.internal.loader.ClassLoaders$AppClassLoader@639fee48/mill/local-test-overrides/com.lihaoyi-acyclic_2.13.15
        Not an internal Mill module: com.lihaoyi:acyclic_2.13.15:0.3.15
        not found: /build/.coursier/local/com.lihaoyi/acyclic_2.13.15/0.3.15/ivys/ivy.xml
        download error: Caught java.net.UnknownHostException (repo1.maven.org) while downloading https://repo1.maven.org/maven2/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom
        download error: Caught java.net.UnknownHostException (oss.sonatype.org) while downloading https://oss.sonatype.org/content/repositories/releases/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom

--------------------------------------------

For additional information on library dependencies, see the docs at
https://mill-build.org/mill/Library_Dependencies.html

scalanativelib.worker-api.scalacPluginClasspath
Resolution failed for 1 modules:
--------------------------------------------
  com.lihaoyi:acyclic_2.13.15:0.3.15
        No test override found at jdk.internal.loader.ClassLoaders$AppClassLoader@639fee48/mill/local-test-overrides/com.lihaoyi-acyclic_2.13.15
        Not an internal Mill module: com.lihaoyi:acyclic_2.13.15:0.3.15
        not found: /build/.coursier/local/com.lihaoyi/acyclic_2.13.15/0.3.15/ivys/ivy.xml
        download error: Caught java.net.UnknownHostException (repo1.maven.org) while downloading https://repo1.maven.org/maven2/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom
        download error: Caught java.net.UnknownHostException (oss.sonatype.org) while downloading https://oss.sonatype.org/content/repositories/releases/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom

--------------------------------------------

For additional information on library dependencies, see the docs at
https://mill-build.org/mill/Library_Dependencies.html

scalajslib.worker-api.enablePluginScalacOptions.super.ScalaModule
Resolution failed for 1 modules:
--------------------------------------------
  com.lihaoyi:acyclic_2.13.15:0.3.15
        No test override found at jdk.internal.loader.ClassLoaders$AppClassLoader@639fee48/mill/local-test-overrides/com.lihaoyi-acyclic_2.13.15
        Not an internal Mill module: com.lihaoyi:acyclic_2.13.15:0.3.15
        not found: /build/.coursier/local/com.lihaoyi/acyclic_2.13.15/0.3.15/ivys/ivy.xml
        download error: Caught java.net.UnknownHostException (repo1.maven.org) while downloading https://repo1.maven.org/maven2/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom
        download error: Caught java.net.UnknownHostException (oss.sonatype.org) while downloading https://oss.sonatype.org/content/repositories/releases/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom

--------------------------------------------

For additional information on library dependencies, see the docs at
https://mill-build.org/mill/Library_Dependencies.html

scalajslib.worker-api.scalacPluginClasspath
Resolution failed for 1 modules:
--------------------------------------------
  com.lihaoyi:acyclic_2.13.15:0.3.15
        No test override found at jdk.internal.loader.ClassLoaders$AppClassLoader@639fee48/mill/local-test-overrides/com.lihaoyi-acyclic_2.13.15
        Not an internal Mill module: com.lihaoyi:acyclic_2.13.15:0.3.15
        not found: /build/.coursier/local/com.lihaoyi/acyclic_2.13.15/0.3.15/ivys/ivy.xml
        download error: Caught java.net.UnknownHostException (repo1.maven.org) while downloading https://repo1.maven.org/maven2/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom
        download error: Caught java.net.UnknownHostException (oss.sonatype.org) while downloading https://oss.sonatype.org/content/repositories/releases/com/lihaoyi/acyclic_2.13.15/0.3.15/acyclic_2.13.15-0.3.15.pom

--------------------------------------------

For additional information on library dependencies, see the docs at
https://mill-build.org/mill/Library_Dependencies.html

These missing dependencies doesn't seem like related to the dist module but more like internal compiler dependencies. And applying the --all flag doesn't fix this issue. So I think maybe the dist module need an overrided prepareOffline task to call each publish module's prepareOffline task.

Avimitin avatar Apr 25 '25 18:04 Avimitin

I think the prepareOffline task doesn't traverse module dependencies in general. I'm a bit undecided, if we should make it follow module deps. In the end, we assume to only work offline on the dist module (as we don't prepare the others for offline work). If we add module traversal, there might be some other user complaining it does too much. We could add module dependency traversal under --all. In the end, partial preparing a project to work offline can never work for all setups. A user is supposed to run either __.prepareOffline or mill.scalalib.OfflineSupport/prepareOffline.

lefou avatar Apr 25 '25 18:04 lefou

I think using __.prepareOffline should work. But I should also mention that this will create a huge cache directory with unnecessary dependencies, like some in unused cross-version modules. I really believe that as partial preparing utilizing the lazy evaluation feature, it is a great practice.

I would really appreciate it if dist.prepareOffline could download all the dependencies for the modules. Because the dist module is used so often for traversing internal modules, and I'm sure it would be really helpful to have that capability. I totally understand, and I'm totally cool with using additional flags to do that.

Avimitin avatar Apr 26 '25 02:04 Avimitin

I was loud thinking about the general behavior of stock Mill. But I guess we always can override and customize, if the use case warrants it.

And in this particular case, building Mill itself, without fetching all (integration) test dependencies, it makes sense. Ideally, we also add some notes to our readme, since this might be what package maintainers of Gentoo/NIX might be interested in.

lefou avatar Apr 26 '25 07:04 lefou

@Avimitin Do you already have some test setup? Or how did you find out that something is missing? I'd rather avoid to delete my local repo caches to test this.

lefou avatar Apr 26 '25 07:04 lefou

No, I don’t have any setup. I just ran mill -i dist.assembly on mill sources and it will try to find those dependencies.

I guess not fetching test dependencies here is correct. The undesired behavior would be why it evaluates test dependencies when running the above command.

Avimitin avatar Apr 26 '25 08:04 Avimitin