2014-12-29 24 views
7

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

elde etmek umduğum şey göstermesidir bir SSCCE geçerli:

// 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:

cevap

1

çalıştırma sırasında özelliklerini değerlendirmek için lazy instantiation of GStrings kullanabilirsiniz.

+0

Ş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

İlgili konular