##// END OF EJS Templates
variants: move source set layout conventions out of model...
variants: move source set layout conventions out of model Keep GenericSourceSet convention-free and apply layout defaults from SourcesPlugin and VariantSourcesPlugin. Add compile unit layout convention and cover standalone and variant source set layouts in functional tests.

File last commit:

r38:87d6128f0bc8 default
r59:780370baa54c default
Show More
variant-sources-plugin.md
159 lines | 4.6 KiB | text/x-minidsrc | MarkdownLexer
/ common / variant-sources-plugin.md
cin
implemented variants model, variants-sources adapter
r26 # Variant Sources Plugin
## NAME
`VariantsSourcesPlugin` и extension `variantSources`.
## SYNOPSIS
```groovy
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`, затем
cin
Variants mutation guard after finalize
r27 регистрирует source sets из модели `variants`.
cin
implemented variants model, variants-sources adapter
r26
cin
Variants mutation guard after finalize
r27 Точка запуска registration:
cin
implemented variants model, variants-sources adapter
r26
- `variants.whenFinalized(model -> registerSourceSets(...))`
cin
Variants mutation guard after finalize
r27 ### registration
cin
implemented variants model, variants-sources adapter
r26
Для каждой usage-связки `variant/role/layer` вычисляется имя source set,
регистрируется `GenericSourceSet` (если он еще не существует), затем
вызываются callbacks.
### binding
cin
Working on separating variants as standalone plugin
r38 `bind('<layer>')` возвращает `LayerBindingSpec` и задает policy для этого
cin
implemented variants model, variants-sources adapter
r26 слоя:
- как именовать source set;
- как конфигурировать source set;
- какие callbacks вызвать на registration/binding.
### sourceSetNamePattern
cin
Variants mutation guard after finalize
r27 `sourceSetNamePattern` определяет naming policy зарегистрированного source set.
cin
implemented variants model, variants-sources adapter
r26
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
cin
separated SourceSetRegistration, SourceSetUsageBinding
r31 Фильтр по варианту поддерживает только usage-binding:
cin
implemented variants model, variants-sources adapter
r26
- `whenBound(String variantName, ...)`
cin
separated SourceSetRegistration, SourceSetUsageBinding
r31 ## PAYLOAD TYPES
`SourceSetRegistration` содержит:
cin
implemented variants model, variants-sources adapter
r26
cin
separated SourceSetRegistration, SourceSetUsageBinding
r31 - `layerName`, `sourceSetName`;
- `sourceSet` (`NamedDomainObjectProvider<GenericSourceSet>`).
Sugar:
- `configureSourceSet(Action|Closure)`.
`SourceSetUsageBinding` содержит:
cin
implemented variants model, variants-sources adapter
r26
- `variantName`, `roleName`, `layerName`, `sourceSetName`;
- `sourceSet` (`NamedDomainObjectProvider<GenericSourceSet>`).
Sugar:
- `configureSourceSet(Action|Closure)`.
## API
### VariantSourcesExtension
cin
Working on separating variants as standalone plugin
r38 - `bind(BuildLayer)` — получить/создать binding для canonical layer identity.
cin
implemented variants model, variants-sources adapter
r26 - `bind(String)` — получить/создать binding по имени слоя.
- `bind(String, Action|Closure)` — сконфигурировать binding.
cin
Working on separating variants as standalone plugin
r38 - `bind(BuildLayer, Action|Closure)` — сконфигурировать binding по `BuildLayer`.
- `getBindings()` — read-only snapshot текущих bindings.
cin
implemented variants model, variants-sources adapter
r26 - `whenRegistered(...)` — глобальные callbacks регистрации source set.
- `whenBound(...)` — глобальные callbacks usage-binding.
cin
separated SourceSetRegistration, SourceSetUsageBinding
r31 - `whenBound(String variantName, ...)` — usage-binding callbacks с variant-filter.
cin
implemented variants model, variants-sources adapter
r26
cin
Working on separating variants as standalone plugin
r38 ### LayerBindingSpec
cin
implemented variants model, variants-sources adapter
r26
- `sourceSetNamePattern` — naming policy для source set слоя.
- `configureSourceSet(...)` — слойная конфигурация `GenericSourceSet`.
- `whenRegistered(...)` — callbacks регистрации в рамках слоя.
- `whenBound(...)` — callbacks usage-binding в рамках слоя.
## KEY CLASSES
- `VariantsSourcesPlugin` — точка входа plugin adapter.
- `VariantSourcesExtension` — глобальный DSL bind/events.
cin
Working on separating variants as standalone plugin
r38 - `LayerBindingSpec` — публичный DSL-contract layer-local policy/callbacks.
cin
separated SourceSetRegistration, SourceSetUsageBinding
r31 - `SourceSetRegistration` — payload регистрации source set.
- `SourceSetUsageBinding` — payload usage-binding.
cin
implemented variants model, variants-sources adapter
r26
## NOTES
cin
Variants mutation guard after finalize
r27 - `sourceSetNamePattern` фиксируется при первом чтении в registration
cin
implemented variants model, variants-sources adapter
r26 (`finalizeValueOnRead`).
cin
Working on separating variants as standalone plugin
r38 - runtime state bindings скрыт внутри adapter implementation (`LayerBinding`).
- name-based bindings резолвятся к canonical `BuildLayer` через registry `variants`.
cin
implemented variants model, variants-sources adapter
r26 - Closure callbacks используют delegate-first.
- Для вложенных closure лучше явный параметр (`ctx -> ...`).