Gradle ile çalışmak için oldukça yeni ve sürüm numaralandırmayı yönetmeye yardımcı olan bir eklenti geliştirmeye çalışıyorum. Bu eklenti, uygulandığı projenin project.version
özelliğini ayarlayan bir görevi tanımlar.Not uzantıları, görevler tarafından dinamik olarak ayarlanan özellikleri nasıl değerlendirir?
Yapmaya çalıştığım şey, bu özellik her Gradle derlemesinin başlangıcında ayarlanmasıdır. Peter's answer to another Gradle question'u kullanarak, benim eklentimin apply
yöntemimde gradle.startParameter.taskNames = [":setProjectVersionNumber"] + gradle.startParameter.taskNames
ekleyerek diğerlerinden önce yürütme görevimi almayı başardım.
Ancak, diğer eklentileri (özellikle 'Maven yayınlansın') yapılandırma aşamasında belirtilen ediliyor sürümü dayanmaktadır: Ben yapabilir bir yolu var mı, bilmek istiyorum ne
publishing {
publications {
somePublication(MavenPublication) {
version = project.version
}
}
}
olduğunu Bu uzantılar içinde version
gibi özelliklerin değerlendirilmesi, mümkün olduğu kadar tembeldir - bunlar, onlara bağlı bir göreve çağrılmadan değerlendirilmez, böylece bu durumda :publishToMavenLocal
olabilir. Aşağıda
// 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"
}
yukarıdaki örnekte ext.version
eşit 1.2.3
yapmak için bir yol sağlayabilir varsa, benim, sorunu çözdükten inanıyoruz.
Eğer bu çok fazla soru soruyorsa, eklentim sürüm süresinden önce yürütme zamanı yerine sürüm dizesini oluşturmamı sağlayabilir. Yine de bunu yapıp yapamayacağımı bilmek güzel olurdu. Deneysel dalda DÜZENLEME
, ben (hepsi değil görev yürütülürken daha uygulamayı eklentisi sırasında meydana yaparak) yapılandırması-fazına tüm sürümü dizesi atama mantığı hareketli çalıştı ama don' Bu eklenti uzantısı henüz işlenmemiş ve içinde tanımlanan özelliklerine başvurmaya çalışırken başarısız olacağına inanıyorum. Bir project.afterEvaluate
kapanması sürüm dizesi atama mantığı tamamlayan
DÜZENLEME 2
çalışmış gibi görünüyor şu şekildedir:
@Override
public void apply(Project project) {
logger = project.logger
project.extensions.create(EXTENSION_NAME, SemVerPluginExtension)
project.afterEvaluate {
setVersionProjectNumber(project)
addTasks(project)
}
}
sahte projede, build.gradle
uygulamak:
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"
}
}
}
Bazı nedenlerden dolayı bu işe yarıyor gibi görünüyor. Sürüm dizesi atama mantığı bir 'afterEvaluate' kapatılması sarılmış ve test yayın sürüm atama değildir olmasına rağmen, eski ve halen bu önce gerçekleşir:
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.
I 'olmuş açık ve çözümlenmemiş bu soruyu terk ediyorum Orijinal olarak tasarladığım şekilde yapılıp yapılamayacağını bilmek istiyorum. Ayrıca, proje sürümü ayarlandıktan sonra yayın sürümünün neden atandığına dair herhangi bir açıklamayı ve her zaman bu duruma bağlı olup olmadığımı veya şimdi yalnızca kaza ile olup olmadığına bağlı olup olmadığımı takdir ediyorum.Eğer tırnak işareti değil kesme işareti kullanmak zorunda
project.tasks.create("example_task", Exec.class, {
commandLine 'echo', "${-> project.someproperty}"
})
Not - "${...}"
eser, ama '${...}'
yapmaz:
Şerefe. Bunu çok uzun zaman önce dilimin yarısını unutmuş olsam bile bu projeyi test etmek için hala bu projede çalışıyorum, ama işe yarayacak gibi görünüyor. – Tagc