##// END OF EJS Templates
Rework variant artifacts materialization model...
Rework variant artifacts materialization model Refactor VariantArtifactsPlugin around a live outgoing artifacts context and split artifact publication into explicit internal services: outgoing variant registry, assembly binding, materialization policy hooks, primary-slot convention, and slot assembly handling. Introduce variant artifact slots as identity-first public API and expose materialized assembly handles through ArtifactAssemblies. Add replayable configuration hooks for outgoing configurations, outgoing slots, outgoing variants, and registered assemblies. Create consumable outgoing configurations per variant, bind the primary slot to the root outgoing artifact set, and publish non-primary slots as Gradle outgoing configuration variants. Add deterministic injective task names for slot assembly tasks, use Sync for directory assembly, and configure the default assembly output location under build/variant-assemblies. Make primary-slot selection finalize-on-read and provide a single-slot convention that fails when no unique default can be inferred. Mark artifact internal implementation package as non-public API.

File last commit:

r38:87d6128f0bc8 default
r51:9db7822cd26c default
Show More
variant-sources-plugin.md
159 lines | 4.6 KiB | text/x-minidsrc | MarkdownLexer
/ common / variant-sources-plugin.md

Variant Sources Plugin

NAME

VariantsSourcesPlugin и extension variantSources.

SYNOPSIS

plugins {
    id 'org.implab.gradle-variants-sources'
}

variants {
    layer('main')

    variant('browser') {
        role('main') { layers('main') }
    }

    variant('node') {
        role('main') { layers('main') }
    }
}

variantSources {
    bind('main').sourceSetNamePattern = '{layer}'

    bind('main') {
        configureSourceSet {
            declareOutputs('compiled')
        }
    }

    whenRegistered { sourceSetName() }
    whenBound('browser') { roleName() }
}

DESCRIPTION

VariantsSourcesPlugin применяет VariantsPlugin и SourcesPlugin, затем регистрирует source sets из модели variants.

Точка запуска registration:

  • variants.whenFinalized(model -> registerSourceSets(...))

registration

Для каждой usage-связки variant/role/layer вычисляется имя source set, регистрируется GenericSourceSet (если он еще не существует), затем вызываются callbacks.

binding

bind('<layer>') возвращает LayerBindingSpec и задает policy для этого слоя:

  • как именовать source set;
  • как конфигурировать source set;
  • какие callbacks вызвать на registration/binding.

sourceSetNamePattern

sourceSetNamePattern определяет naming policy зарегистрированного source set.

Default:

  • {variant}{layerCap}

Tokens:

  • {variant}, {variantCap}
  • {role}, {roleCap}
  • {layer}, {layerCap}

Имя санитизируется ([^A-Za-z0-9_.-] -> _).

Ограничение:

  • один sourceSetName не может быть порожден разными слоями.

EVENTS

whenRegistered

  • callback на новый уникальный source set;
  • replayable;
  • при shared source set срабатывает один раз.

whenBound

  • callback на каждую usage-связку variant/role/layer;
  • replayable;
  • подходит для per-usage логики.

variant filter

Фильтр по варианту поддерживает только usage-binding:

  • whenBound(String variantName, ...)

PAYLOAD TYPES

SourceSetRegistration содержит:

  • layerName, sourceSetName;
  • sourceSet (NamedDomainObjectProvider<GenericSourceSet>).

Sugar:

  • configureSourceSet(Action|Closure).

SourceSetUsageBinding содержит:

  • variantName, roleName, layerName, sourceSetName;
  • sourceSet (NamedDomainObjectProvider<GenericSourceSet>).

Sugar:

  • configureSourceSet(Action|Closure).

API

VariantSourcesExtension

  • bind(BuildLayer) — получить/создать binding для canonical layer identity.
  • bind(String) — получить/создать binding по имени слоя.
  • bind(String, Action|Closure) — сконфигурировать binding.
  • bind(BuildLayer, Action|Closure) — сконфигурировать binding по BuildLayer.
  • getBindings() — read-only snapshot текущих bindings.
  • whenRegistered(...) — глобальные callbacks регистрации source set.
  • whenBound(...) — глобальные callbacks usage-binding.
  • whenBound(String variantName, ...) — usage-binding callbacks с variant-filter.

LayerBindingSpec

  • sourceSetNamePattern — naming policy для source set слоя.
  • configureSourceSet(...) — слойная конфигурация GenericSourceSet.
  • whenRegistered(...) — callbacks регистрации в рамках слоя.
  • whenBound(...) — callbacks usage-binding в рамках слоя.

KEY CLASSES

  • VariantsSourcesPlugin — точка входа plugin adapter.
  • VariantSourcesExtension — глобальный DSL bind/events.
  • LayerBindingSpec — публичный DSL-contract layer-local policy/callbacks.
  • SourceSetRegistration — payload регистрации source set.
  • SourceSetUsageBinding — payload usage-binding.

NOTES

  • sourceSetNamePattern фиксируется при первом чтении в registration (finalizeValueOnRead).
  • runtime state bindings скрыт внутри adapter implementation (LayerBinding).
  • name-based bindings резолвятся к canonical BuildLayer через registry variants.
  • Closure callbacks используют delegate-first.
  • Для вложенных closure лучше явный параметр (ctx -> ...).