Jestem całkiem nowy w pracy z Gradle i staram się opracować wtyczkę, która pomaga zarządzać numerowaniem wersji. Ta wtyczka definiuje zadanie, które ustawia właściwość projektu, do którego jest stosowane.Jak mogę tworzyć rozszerzenia Gradle leniwie oceniać właściwości, które są ustawione dynamicznie według zadań?
Próbuję to zrobić, aby ta własność została ustawiona na początku każdej kompilacji Gradle. Korzystając z Peter's answer to another Gradle question, udało mi się wykonać to zadanie przed innymi, dodając gradle.startParameter.taskNames = [":setProjectVersionNumber"] + gradle.startParameter.taskNames
w mojej metodzie wtyczki apply
.
Jednak inne wtyczki (zwłaszcza „Maven publikuje”) opierają się na wersji jest określona w fazie konfiguracji:
publishing {
publications {
somePublication(MavenPublication) {
version = project.version
}
}
}
Co chciałbym wiedzieć, czy istnieje sposób, że mogę zrobić ocena właściwości, takich jak version
w tych rozszerzeniach, tak leniwych, jak to możliwe - tak, że nie są one oceniane, dopóki nie zostanie wywołane zadanie od nich zależne, które w tym przypadku może być :publishToMavenLocal
.
Poniżej znajduje się SSCCE który pokazuje, co mam nadzieję osiągnąć:
// This would be included within the plugin
class SetProjectVersionNumber extends DefaultTask {
@TaskAction
void start() {
// This will set project.version during execution phase
project.version = "1.2.3"
logger.info "Set project version number: $project.version"
}
}
task setProjectVersionNumber(type: SetProjectVersionNumber)
// Imagine this block being replaced by a maven 'publishing' block (or something similar)
ext {
version = project.version
// This will print 'unspecified', as it's evaluated during configuration phase
println "In extension, setting version=$project.version"
}
Jeśli można podać sposób, aby ext.version
równe 1.2.3
w przykładzie powyżej, uważam, że udało Ci się rozwiązać mój problem.
Jeśli to zbyt wiele, może się zdarzyć, że moja wtyczka wygeneruje ciąg wersji w czasie konfiguracji zamiast w czasie wykonywania. Byłoby miło wiedzieć, czy mógłbym to zrobić w ten sposób.
EDIT
W gałęzi eksperymentalnej, próbowałem przesuwając całą logikę zadanie wersja ciąg konfiguracji fazy (poprzez to wszystko się stało podczas plugin aplikacji niż podczas wykonywania zadań), ale don” Sądzimy, że to zadziała, ponieważ rozszerzenie wtyczki nie zostało jeszcze przetworzone i próba odwołania do zdefiniowanych w nim właściwości kończy się niepowodzeniem.
EDIT 2
Owijanie logiki przydziału wersja ciąg w zamknięciu project.afterEvaluate
wydaje się, że pracował:
@Override
public void apply(Project project) {
logger = project.logger
project.extensions.create(EXTENSION_NAME, SemVerPluginExtension)
project.afterEvaluate {
setVersionProjectNumber(project)
addTasks(project)
}
}
W pozorowanej projektu wdrożyć build.gradle
następująco:
apply plugin: 'semver'
apply plugin: 'maven-publish'
group = 'temp'
buildscript {
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'com.github.tagc:semver-plugin:0.2.2'
}
}
semver {
versionFilePath = 'version.properties'
}
publishing {
publications {
testPublication(MavenPublication) {
version = project.version
assert version
println "Set publication version to $version"
}
}
}
Z jakiegoś powodu wydaje się, że to działa. Choć logika przypisanie wersja ciąg jest zapakowane w zamknięciu danej „afterEvaluate” i przypisanie publikacja wersja testowa nie jest, były nadal występuje przed ostatnia:
Compiling build file '/Users/davidfallah/Documents/semver/TestSemver2/build.gradle' using StatementExtractingScriptTransformer.
Compiling build file '/Users/davidfallah/Documents/semver/TestSemver2/build.gradle' using BuildScriptTransformer.
VERSION FILE PATH=version.properties
Current Git branch: develop
Set project version to 0.2.1-SNAPSHOT
Set publication version to 0.2.1-SNAPSHOT
All projects evaluated.
Zostawiam to pytanie otwarte i nierozwiązane od I Nadal chciałbym wiedzieć, czy można to zrobić tak, jak pierwotnie zamierzałem. Dodatkowo doceniłbym wszelkie wyjaśnienia, dlaczego wersja publikacji jest przypisana po ustawieniu wersji projektu i czy mogę na tym polegać, czy też dzieje się to teraz przez przypadek.
Pozdrawiam. Zapytałem to już dawno temu, że w połowie zapomniałem języka, nie mówiąc już o pracy nad tym projektem, aby to przetestować, ale wydaje się prawdopodobne, że to powinno zadziałać. – Tagc