elide.pkl — манифест проекта: в нём объявляются сборки, зависимости, тесты и артефакты. Каждый файл начинается так:
amends "elide:project.pkl"elide: указывает на схему, встроенную в запущенный Elide, для этого и всех остальных модулей (elide:Jvm.pkl).
Чтобы закрепить версию схемы, расширяйте схему по опубликованному URL:
pkl.elide.dev/1.6.0/project.pkl.
Версия в разработке следует за main до стабильного выпуска. Выпущенные версии схемы неизменяемы.
Патч-выпуски в пределах линии MAJOR.MINOR только добавляют свойства. Минорный выпуск может удалять, переименовывать
свойства, менять их тип и значения по умолчанию.
| Закреплённая версия | Результат |
|---|---|
| Старше запущенного Elide | Используется эта версия; свойство, удалённое позже, вызывает ошибку с указанием версии. |
| Новее запущенного Elide | Допускается; свойство, которого нет в запущенном Elide, вызывает ошибку с указанием нужного обновления. |
| Другая мажорная версия | Отклоняется. |
elide project export выводит вычисленный манифест в JSON; elide build --inspect перечисляет его задачи.
Метаданные проекта
| Свойство | Назначение |
|---|---|
name, version, description | Идентификация проекта; version также входит в имена архивов приложений. |
entrypoint | Файл(ы), которые elide run использует, если ничего не передано. |
scripts | Именованные shell-команды для elide run NAME. |
sources | Наборы исходников; см. Исходники. |
dependencies | Пакеты Maven, npm и PyPI; см. Зависимости. |
jvm, kotlin, javascript | Настройки языков и компиляторов. |
nativeImage | Принимается, но не применяется; задавайте options каждого артефакта. |
engine | Контексты для обслуживания запросов; см. Контексты движка. |
toolchain | Допустимые версии Elide; см. Инструментарий. |
dev | Сведения об исходниках, MCP, сервер разработки; см. Разработка. |
web | Настройки веб-ресурсов; см. Веб. |
artifacts | Результаты сборки; см. Артефакты. |
testing | Отчёты о тестах; см. Тестирование. |
coverage | Покрытие; см. Тестирование › Покрытие. |
workspace | Проекты-участники; см. Рабочие пространства. |
build.flags содержит значения -f/--flag; см. Флаги сборки.
Контексты движка
engine {
topology = "prespawn"
contexts { spawn = "auto"; reserve = 2; min = 1; max = 16 }
}| Свойство | Описание | По умолчанию |
|---|---|---|
topology | "prespawn", единственное значение. | "prespawn" |
contexts.spawn | Число контекстов: положительное целое или "auto" (физические ядра минус reserve, в пределах границ). | 1 |
contexts.reserve | Ядра, вычитаемые для "auto"; к процессорам не привязывает. | 2 |
contexts.min, contexts.max | Границы для любого числа. | 1, нет |
maxContexts | Устаревшее фиксированное число; нельзя сочетать с contexts. | — |
Каждый контекст один раз вычисляет входной модуль со своими глобальными объектами, прежде чем сервер станет готов.
--contexts=N|auto у run, serve и dev переопределяет spawn. Больше одного контекста — только в Linux.
Блок OpenTelemetry
opentelemetry {
service { name = "checkout"; version = "1.4.2"; environment = "production" }
resource { ["cloud.region"] = "us-east-1" }
destinations {
["collector"] { endpoint = "http://localhost:4317"; protocol = "grpc" }
["datadog"] { provider = "datadog"; site = "us5" }
["sentry"] { provider = "sentry" }
}
traces { sampler = "parentbased_traceidratio"; ratio = 0.25 }
metrics { interval = 30.s }
logs { level = "info" }
runtime { logs = "warn" }
}Телеметрия выключена, пока не задано место назначения: здесь, в переменных OTEL_*/ELIDE_OTEL_* или во флагах
--otel-*. Они переопределяют этот блок, причём флаги важнее всего; см.
Переменные окружения среды выполнения.
elide run, elide serve, elide test, elide build и elide install в проекте читают этот блок;
elide run file.js внутри проекта читает его, если elide.pkl содержит слово opentelemetry.
См. Конфигурация. Учётные данные здесь не записываются: укажите переменную окружения,
в которой они хранятся.
| Свойство | Описание | По умолчанию |
|---|---|---|
enabled | false выключает телеметрию независимо от окружения. | — |
service.name, .version, .namespace, .environment | Атрибуты ресурса service.* и deployment.. | unknown_service:elide |
resource | Дополнительные атрибуты ресурса. | — |
destinations | Именованные места назначения телеметрии. | нет |
traces.enabled, .sampler, .ratio, .propagators | Спаны приложения. Сэмплеры — как в OTEL_TRACES_SAMPLER. | вкл., parentbased_always_on, tracecontext + baggage |
metrics.enabled, .interval, .temporality | Метрики приложения. | вкл., 60.s, cumulative |
logs.enabled, .level, .console | Логи приложения; console экспортирует вывод console.*, Python logging и подобный. | вкл., info, вкл. |
profiles.enabled, .frequency | Профили CPU гостевого кода (экспериментально). | выкл., 100 в секунду |
runtime.traces, .metrics, .logs | Собственные спаны и метрики Elide и порог его логов. | вкл., вкл., warn |
propagation.baggage | W3C baggage в HTTP-сервере и клиентах Elide; см. Baggage. | выкл. |
shutdownTimeout | Крайний срок последнего экспорта при завершении. | 5.s |
Каждое место назначения:
| Свойство | Описание | По умолчанию |
|---|---|---|
provider | otlp, sentry, datadog, posthog, honeycomb или grafana. | otlp |
endpoint | Базовый URL; заменяет хост провайдера. Для HTTP добавляется /v1/<signal>. | http://localhost:4318 (4317 для gRPC) |
protocol | grpc, http/protobuf или http/json. | http/protobuf |
headers, headerEnv | Заголовки в явном виде и заголовки из указанных переменных. | — |
credential | Переменная с ключом провайдера: DD_API_KEY, POSTHOG_PROJECT_TOKEN, HONEYCOMB_API_KEY, GRAFANA_. | как указано |
dsn | Переменная с DSN Sentry. | SENTRY_DSN |
site | Сайт Datadog: us1, us3, us5, eu, ap1, ap2, gov или домен. | DD_SITE, затем us1 |
region | us/eu (PostHog, Honeycomb) или зона Grafana Cloud, например prod-us-east-0. | us |
signals | traces, metrics, logs, profiles. | то, что принимает провайдер |
compression, timeout | Сжатие и крайний срок запроса. | gzip, 10.s |
perSignal | endpoint, protocol, headers, headerEnv, compression, timeout для отдельных сигналов. | — |
| Провайдер | Сигналы по умолчанию | Также принимаются | Протоколы |
|---|---|---|---|
otlp | трассировки, метрики, логи | профили | все |
sentry | трассировки, логи | — | http/protobuf |
datadog | метрики (delta), логи | трассировки (предварительная версия agentless intake) | http/protobuf; http/json, кроме логов |
posthog | логи | трассировки | http/protobuf |
honeycomb | трассировки, метрики, логи | — | все |
grafana | трассировки, метрики, логи | — | http/protobuf |
Ошибки отправляются как записи логов exception и события спанов, а также как метрика elide.errors, поэтому их
получает любой провайдер, который принимает логи, трассировки или метрики. Об использовании см.
Обзор OpenTelemetry, о каждом провайдере — Провайдеры. Запросить у
провайдера сигнал или протокол, который он не принимает, — ошибка.
Baggage
HTTP-сервер и клиенты Elide передают traceparent и tracestate. W3C baggage они передают, только если вы включите
соответствующее направление, потому что baggage от клиента — недоверенные входные данные:
opentelemetry {
propagation {
baggage {
inbound = true
outbound = true
allow { "tenant"; "region" }
spanAttributes { "tenant" }
}
}
}| Свойство | Описание | По умолчанию |
|---|---|---|
inbound | Заголовки baggage обслуживаемых запросов становятся baggage обработчика. | false |
outbound | Исходящие запросы fetch и HTTP-клиента несут текущий baggage, если запрос сам не задаёт baggage. | false |
allow | Ключи, разрешённые в обоих направлениях. | все ключи |
spanAttributes | Входящие ключи, записываемые в серверный спан как baggage.<key>; каждый должен быть в allow. | нет |
Заголовок больше 8192 байт или 180 элементов либо с любым некорректным элементом отбрасывается целиком. Baggage от
клиента попадает в исходящие запросы, только если включены оба направления. Код приложения всегда может читать,
задавать и отправлять baggage через API OpenTelemetry; OTEL_PROPAGATORS влияет только на этот API.
Исходники
sources {
["main"] = "lib/**/*.kt"
["integrationTest"] {
type = "test"
dependsOn { "main" }
paths { "it/**/*.kt" }
resources { "it/fixtures"; new { from = "it/config"; into = "META-INF" } }
}
}| Свойство | Описание | Если пусто или не задано |
|---|---|---|
type | "source", "test", "example" или "other". | Определяется по имени. |
paths | Glob-шаблоны или каталоги. | src/<name>/<language>. |
resources | Пути или корни new { from; into }. | src/<name>/resources. |
dependsOn | Наборы исходников, видимые этому набору. | Не задано: наборы тестов и примеров видят main. Пусто: ничего. |
См. Наборы исходников.
Зависимости
dependencies {
maven {
packages { "com.google.guava:guava:33.5.0-jre" }
testPackages { "org.junit.jupiter:junit-jupiter:5.13.4" }
substitutions { ["com.google.guava:guava"] = "libs/guava-patched.jar" }
}
npm { packages { "react@19.0.0" }; devPackages { "typescript@5.6.2" } }
pypi { packages { "requests>=2" }; optionalPackages { ["dev"] { "pytest>=8" } } }
spring { version = "4.0.0"; starter { "web" }; testStarter { "test" } }
}| Блок | Свойства |
|---|---|
maven | packages, devPackages, modules, compileOnly, runtimeOnly, processors, testPackages, kotlinPlugins, exclusions, substitutions, repositories, enableDefaultRepositories, localRepository |
npm | packages, devPackages |
pypi | packages, optionalPackages (именованные группы); elide install их не устанавливает. |
spring | version, starter, testStarter; разворачивается в maven. |
| Значение | Форма |
|---|---|
| Запись Maven | "group:artifact:version[:classifier]", MavenPackageSpec (group, name, version, classifier или coordinate), путь к локальному JAR или ссылка на проект. |
| Репозиторий | URL или описание с url, name, description, credentials (username, password, ntlmDomain, ntlmWorkstation). |
Ключ substitutions | group:artifact (любая версия) или group:artifact:version; значение — путь к файлу. |
Подстановка сохраняет транзитивные зависимости координаты и ставит файл вместо неё в каждый classpath. Пути разрешаются относительно объявившего их манифеста; участники наследуют подстановки корня. Задача, которая генерирует файл, должна выполняться раньше. Группы и репозитории: Зависимости.
JVM
jvm {
main = "example.Main"
target = 25
flags { "--add-opens=java.base/java.lang=ALL-UNNAMED" }
defs { ["app.env"] = "dev" }
java { release = 25; compiler { flags { "-Xlint:all" } } }
}| Свойство | Описание | По умолчанию |
|---|---|---|
main | Класс точки входа для elide run, JAR, приложений и нативных образов. | — |
target | Целевой байт-код: 8 … 29, 1.8, "latest", "stable" или "auto". | "auto" (21) |
javaHome | Каталог Java для внешней компиляции и отдельных процессов JVM. | собственный Elide |
preferBali | Внешние запуски JVM вызывают bali из PATH вместо java, а без него выводят предупреждение и используют java. | false |
features.testing | Зависимости JUnit в наборах тестов. | true |
features.automodules | Автоматические модули для JAR без дескриптора. | true |
features.graalvm | API SDK org.graalvm в classpath компиляции. | false |
java.source, java.release | Уровни исходного кода и --release; см. Компилятор Java. | "auto" |
java.compiler.mode | "embedded" или "external". | "embedded" |
java.compiler.flags | Дополнительные флаги javac. | нет |
java.sourceSets | release и flags для отдельных наборов исходников; см. Компилятор Java. | нет |
flags | Флаги JVM для elide run, тестовой JVM и стартовых скриптов. | нет |
defs | Системные свойства (-D), применяются везде, где и flags. | нет |
debug | Компилировать с -g. | true |
Kotlin
kotlin {
apiLevel = "auto"
languageLevel = "auto"
compilerOptions { allWarningsAsErrors = true; optIn { "kotlin.time.ExperimentalTime" } }
features { serialization = true; metro = false }
toolchain = "embedded"
plugins { ["org.jetbrains.kotlinx.serialization"] { ["mode"] = "json" } }
}| Свойство | Описание |
|---|---|
apiLevel, languageLevel | "auto", "latest", "stable" или "1.9" … "2.5". |
compilerOptions | optIn, progressiveMode, extraWarnings, allWarningsAsErrors, suppressWarnings, verbose, freeCompilerArgs, apiVersion, languageVersion, includeRuntime, noStdlib, javaParameters, jvmTarget, noJdk, jvmTargetValidationMode, incremental |
features | testing, kotlinx, defaultPlugins, serialization, coroutines, atomicfu, powerAssert, metro, reflection |
toolchain | "embedded", new Kotlin. или new Kotlin.. |
plugins | Параметры для каждого id плагина компилятора, передаются как -P plugin:<id>:<key>=. |
Значения по умолчанию: Компилятор Kotlin.
JavaScript
| Свойство | Описание | По умолчанию |
|---|---|---|
javascript.ecma | Объявленная редакция ECMAScript: год 2015 … 2025, "stable" или "latest". Её показывает elide project info; она не меняет ни выполняемый синтаксис, ни способ сборки кода (Язык JavaScript). | "stable" |
Инструментарий
toolchain { engines { ["elide"] = ">=1.6.0" } }| Свойство | Описание |
|---|---|
engines["elide"] | Версия или диапазон semver либо new { version = "…" }; запущенный Elide вне этого диапазона не проходит проверку. |
engines[<other>] | Принимается, но не проверяется. |
Разработка
dev {
source { platform = "github"; project = "example/app" }
mcp {
registerElide = true
advice = true
resources { new { path = "docs/ARCHITECTURE.md"; name = "architecture" } }
}
}| Свойство | Описание | По умолчанию |
|---|---|---|
source.platform, source.project, source.subpath | Хостинг исходников: "github", "gitlab", "bitbucket", "git" или другое имя. | — |
mcp.registerElide | Зарегистрировать Elide как инструмент MCP. | true |
mcp.advice | Предоставлять elide project advice как ресурс MCP. | true |
mcp.resources | Дополнительные ресурсы MCP: path, name, description, mimeType (определяется, если не указан). | нет |
server.host, server.port | Не используются в elide dev, который принимает --host/--port (по умолчанию 127.0.0.1:3000). | "0.0.0.0", 8080 |
Веб
| Свойство | Описание | По умолчанию |
|---|---|---|
web.css.minify | Минифицировать собранный CSS. | true |
web.css.targets | Целевые браузеры: new { browser = "chrome"; version = "120" }. | нет |
web.minifyHtml | Минифицировать отрендеренный HTML. | true |
web.browsers | Целевые браузеры для всех результатов; для CSS его переопределяет css.targets. | нет |
См. Веб-инструментарий.
Артефакты
import "elide:Jvm.pkl" as Jvm
artifacts {
["app"] = new Jvm.Jar {
name = "app.jar"
options { entrypoint = "example.Main" }
sources { "main" } // optional; empty packages every non-test source set
}
}Ключ задаёт имя задачи сборки. Результаты попадают в .dev/artifacts/<kind>/.
| Тип | Модуль | Поля |
|---|---|---|
Jar, SourceJar, JavadocJar, JvmApplication | elide:Jvm.pkl | Сборка JAR |
NativeImage | elide:NativeImage.pkl | Native Image |
WebImage | elide:NativeImage.pkl | WebImage |
ContainerImage | elide:Container.pkl | JVM-контейнеры |
StaticSite | elide:Web.pkl | Статические сайты |
| Общее поле | Описание |
|---|---|
dependsOn | Имена артефактов, которые нужно собрать раньше. |
name (JAR) | И "app", и "app.jar" дают app.jar; SourceJar даёт app-sources.jar. |
WebImage
WebImage принимает поля NativeImage from, name, entrypoint,
moduleName, dependsOn и options, не имеет type и добавляет:
| Свойство | Значения | По умолчанию |
|---|---|---|
backend | "wasm-gc" (GC хоста) или "wasm-lm" (линейная память). | "wasm-gc" |
runtime | "generic", "browser" или "node". | "generic" |
autoRun | Запускать программу, когда загрузчик загружен. | true |
sourceMap | Создавать source map JavaScript. | false |
entrypoint (или jvm.main) обязателен даже при autoRun = false. Не передавайте сырые флаги для этих четырёх
настроек. Руководство: WebImage; артефакты на флагах:
миграция.
Публикация
publishing {
maven {
groupId = "dev.example"
artifactId = "example" // default: the project name
localRepository = "~/.m2/repository" // the default
artifacts { "lib"; "lib-sources" } // default: every Jar, SourceJar and JavadocJar
pom {
name = "Example"
description = "An example library." // default: the project description
url = "https://example.dev"
licenses { new { name = "Apache-2.0"; url = "https://www.apache.org/licenses/LICENSE-2.0" } }
developers { new { id = "jdoe"; name = "J. Doe" } }
scm { url = "https://github.com/example/example" }
}
repositories {
["internal"] = "https://repo.example.dev/releases" // or new Jvm.MavenRepositorySpec { url = … }
["central"] = new Publishing.CentralPortal {} // Maven Central; import "elide:Publishing.pkl" as Publishing
}
signing { gpg { keyName = "0123ABCD" } } // optional; omit keyName for gpg's default key
}
}elide publish собирает выбранные JAR и устанавливает их вместе с POM в локальный репозиторий Maven. Версия берётся
из version проекта. Публикации нужны groupId, version и ровно один Jar. SourceJar публикуется со своим
classifier (по умолчанию sources), JavadocJar — с javadoc. Относительный localRepository разрешается
относительно манифеста, в котором он объявлен.
| Манифест | Опубликованный POM |
|---|---|
packages, modules | Зависимости compile |
runtimeOnly | Зависимости runtime |
compileOnly, devPackages, processors, kotlinPlugins, testPackages | Не включаются |
exclusions без версии | <exclusion> у каждой зависимости |
| Соседний проект | Собственные координаты публикации этого проекта |
Соседний проект в Jar.from | Его packages, modules и runtimeOnly, если они ещё не перечислены |
| Путь к локальному JAR | Ошибка: потребители не могут его разрешить |
POM также перечисляет как зависимости compile библиотеки, которые Elide без объявления добавляет в classpath проекта
Kotlin, потому что они нужны потребителям во время выполнения: kotlin-stdlib и kotlin-reflect версии Kotlin
проекта, а также библиотеки времени выполнения, которые включает kotlin.features (kotlinx-coroutines-core,
kotlinx-serialization, библиотека времени выполнения Metro). Они попадают в опубликованный POM, хотя elide.pkl их
не называет. Отключите такую библиотеку там, откуда она берётся (kotlin.features или
kotlin.compilerOptions.noStdlib), или объявите её сами, чтобы закрепить другую версию. jvm.features.graalvm
добавляет GraalVM SDK с областью runtime.
elide publish --to <name> вместо этого публикует в репозиторий из repositories, с контрольными суммами .md5,
.sha1, .sha256 и .sha512 для каждого файла. Учётные данные берутся из ELIDE_MAVEN_<NAME>_USERNAME и
ELIDE_MAVEN_<NAME>_PASSWORD, где <NAME> — имя репозитория в верхнем регистре, в котором каждый символ, кроме букв
и цифр, заменён на _ (internal → ELIDE_MAVEN_INTERNAL_USERNAME, my-repo → ELIDE_MAVEN_MY_REPO_…), а если их
нет — из credentials репозитория. Два имени, которые дают одни и те же переменные (my-repo и my_repo),
отклоняются. Репозитории с простым http://, кроме localhost, отклоняются без --allow-http-repositories.
Если задан signing, удалённая публикация подписывает каждый файл программой gpg (<file>.asc); signing {}
подписывает ключом gpg по умолчанию, а signing { gpg { keyName = "…" } } выбирает ключ. Локальная публикация
подписывает только с --sign, а --no-sign отключает подпись. Парольную фразу запрашивает gpg-agent. Для CI задайте
ELIDE_GPG_PASSPHRASE, и Elide передаст её gpg через loopback pinentry. Сам ключ Elide никогда не читает.
Репозиторий CentralPortal публикует в Maven Central через Central Publisher Portal. Создайте в Portal
пользовательский токен и передайте его как ELIDE_MAVEN_<NAME>_USERNAME и ELIDE_MAVEN_<NAME>_PASSWORD. Все проекты
запуска попадают в один подписанный пакет с контрольными суммами и одно развёртывание, которое Portal проверяет и
выпускает целиком. Elide ждёт, пока Portal проверит его, и завершается с ошибками Portal, если проверка не пройдена.
--no-wait вместо этого возвращает управление сразу после загрузки.
Свойство CentralPortal | Описание | По умолчанию |
|---|---|---|
publishingType | USER_MANAGED: проверенное развёртывание вы выпускаете в Portal сами. AUTOMATIC: выпуск сразу после проверки. | USER_MANAGED |
url | Portal, в который выполняется загрузка. | https:/ |
Перед сборкой Elide проверяет требования Central и сразу сообщает обо всём, чего не хватает: в pom — name,
description, url, licenses, developers и scm.url; артефакты SourceJar и JavadocJar; подпись (поэтому
--no-sign отклоняется); версия, которая не является -SNAPSHOT.
В рабочем пространстве участники наследуют блок publishing корня, кроме artifactId и artifacts, а собственные
настройки участника имеют приоритет по каждому полю. Репозитории наследуются по имени. Проект, который не собирает
JAR, ничего унаследованного не публикует.
Чтобы опубликовать только часть проектов рабочего пространства, перечислите их (elide publish core util), а не
меняйте их блоки publishing, или передайте --skip-existing, чтобы пропустить все версии, которые уже есть в целевом
репозитории; см. elide publish.
Тестирование
import "elide:Testing.pkl" as Testing
testing { reports { Testing.xmlReport() } }| Свойство | Описание |
|---|---|
testing.reports | Форматы отчётов для всех средств запуска тестов, записываются в .; то же, что --reporter=junit. |
Покрытие
import "elide:Coverage.pkl" as Coverage
coverage {
enabled = true
scope = "tests"
jvm {
excludes { "org.example.generated.*" }
reports { Coverage.xmlReport(); Coverage.htmlReport() }
}
js { paths { "src" } }
}| Свойство | Описание | По умолчанию |
|---|---|---|
coverage.enabled | Собирать покрытие без --coverage. | false |
coverage.scope | Задачи, которые собирают покрытие: "tests", "runs" или "all". --coverage всегда покрывает задачу, которой он передан. | "tests" |
coverage.jvm.reports | Форматы отчётов JVM: Coverage.htmlReport(), xmlReport(), csvReport(), записываются в .. | нет |
coverage.jvm.excludes | Шаблоны имён классов (*, ?), которые не инструментируются, например сгенерированный код. | нет |
coverage.js.paths | Корни исходников JavaScript и TypeScript для отчёта в формате LCOV в .. Пустое значение — отчёт по всему проекту. | нет |
Рабочие пространства
workspace { members { "core"; "app" } }Каждый участник — это каталог со своим elide.pkl; у участников не может быть своих участников.
elide init --template workspace создаёт корень с библиотекой core и приложением app, которое от неё зависит.
| Поведение | Правило |
|---|---|
| Область сборки | Из корня elide build/elide test охватывают все проекты; из участника — только его. |
| Задачи других проектов | elide build core:compile-kotlin-main или elide build core для его задач по умолчанию. |
| Общее состояние | Разрешённые зависимости и состояние сборки хранятся в .dev корня; результаты остаются в .dev каждого проекта. |
| Закрепление версий | Участник может не указывать версию Maven и брать её из корня; конфликтующая версия — ошибка. |
// core/elide.pkl
import "elide:Jvm.pkl" as Jvm
dependencies {
maven {
packages { "com.google.guava:guava" } // version from the root
}
}
artifacts {
["jar"] = new Jvm.Jar { name = "core" }
}// app/elide.pkl
local core = project("core")
dependencies { maven { packages { core } } }| Ссылка | Описание |
|---|---|
project("core") | Артефакт Jvm.Jar проекта и его classpath компиляции; собирается при необходимости. Одни лишь исходники JVM не считаются. |
project("core"). | Выбрать один JAR, если проект объявляет несколько. |
project("core"). | Дополнительно видеть объявления Kotlin internal из core, но не из его зависимостей. Только в packages, modules, compileOnly, testPackages. |
new Jvm. | Распаковать JAR core в этот JAR, предварительно собрав его; зависимость не нужна. |
module.project("core") | Используйте эту форму внутри тела объекта: простой project(…) там не разрешается. |
new Artifacts. | Явная форма; import "elide:Artifacts.. |
Ссылка на проект без JAR или friend() не на своём месте вызывает ошибку на этапе конфигурации сборки.