Bir Gradle komut dosyasını diğerine nasıl aktarabilirim?


99

Bir dizi netbeans projesi oluşturmak ve bir dizi ortama dağıtmak için bir dizi işlevselliği tamamlayan karmaşık bir gradle komut dosyam var.

Komut dosyası çok iyi çalışıyor, ancak özünde hepsi proje ve çevre bilgilerini tutan yarım düzine harita aracılığıyla yapılandırılıyor.

Görevleri başka bir dosyaya soyutlamak istiyorum, böylece haritalarımı basit bir yapı dosyasında tanımlayabilir ve görevleri diğer dosyadan içe aktarabilirim. Bu şekilde, bir dizi proje için aynı temel görevleri kullanabilir ve bu projeleri basit bir harita seti ile yapılandırabilirim.

Biri bana bir gradle dosyasını diğerine Ant'ın görevine benzer şekilde nasıl aktarabileceğimi söyleyebilir mi? Şimdiye kadar Gradle'ın belgelerini boşuna taradım.

İlave bilgi

Tom'un aşağıdaki cevabından sonra, tam olarak ne demek istediğimi açıklamaya çalışacağımı düşündüm.

Temel olarak birkaç alt proje çalıştıran bir gradle betiğim var. Bununla birlikte, alt projelerin tümü Netbeans projeleridir ve kendi karınca derleme komut dosyalarıyla birlikte gelir, bu yüzden bunların her birini çağırmak için aşamalı görevlerim var.

Benim sorunum, dosyanın en üstünde aşağıdaki gibi bazı yapılandırmalarım olması.

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

Daha sonra aşağıdaki gibi görevler oluşturuyorum:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

Bu tür görev oluşturma parçacıklarının çoğuna sahibim ve hepsi geneldir - tamamen projeler listesindeki yapılandırmaya bağlıdırlar.

Yani istediğim, bunu ayrı bir komut dosyasına koymanın ve aşağıdaki şekilde içe aktarmanın bir yolu:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

Dolayısıyla bu örnekte, tasks.gradle tüm genel görev oluşturma koduna sahip olacak ve ana build.gradle dosyasında tanımlanan projeler için çalıştırılacaktır. Bu şekilde, tasks.gradle, Netbeans ant build dosyaları ile bir dizi alt projeden oluşan tüm büyük projeler tarafından kullanılabilen bir dosyadır.


3
Dış bildirimleri içe aktarmak için "başvurudan: 'other.gradle'" yapısını düşünün. ( Gradle.org/0.9-preview-1/docs/userguide/… buradaki "12.4. Projeyi harici bir yapı komut dosyası kullanarak yapılandırma" bölümüne bakın )
Petr Gladkikh

@PetrGladkikh apply from, harici görevleri anında yürütür. Bu, yürütme mantığında tercih edilmeyebilir (yani görevleri hemen değil, istediğim zaman yürütmek isterim).
IgorGanapolsky

Yukarıdaki açıklamadaki bu ifade doğru değildir : apply fromharici görevleri anında yürütür. Yanlış yönlendirmeyin. Harici görevler yapılandırılır, yürütülmez.
Jarekczek

Yanıtlar:



17

Sorunun cevabının, dizinde yer alan harika dosyalar olabilecek bir dizi eklentiye istenen işlevselliği ekleyebileceğiniz Eklentiler sisteminde olduğu ortaya çıktı buildSrc/src/main/groovy. Bunu denememiş olsam da eklentiler bir Jar olarak da paketlenebilir.

Ayrıntılar burada: Özel Eklentiler


Bağlantının koptuğunu bilmeniz için - işte bir güncelleme gradle.org/docs/current/userguide/…
JARC


4

Aslında, derleme dosyanızı görmeden size en çok neyin hizmet ettiğini söylemek zor.

Ortamınızı çok projeli bir yapı olarak hazırlamanın size aradığınız soyutlamayı sağlayacağını varsayabilirim.

Proje kökünüzde build.gradle, tüm etki alanına özgü öğelerinizin yanı sıra tüm alt projeleriniz için geçerli olanları tanımlarsınız :

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

Proje kök dizini gradle.properties, projeleriniz tarafından kullanılan özellikleri tanımladığınız bir dosya da içerebilir :

buildDirName=staging
repo.dest.dir=/var/repo
...

Ardından, proje kökünüzden ek bir dosyada, settings.gradleaslında alt projelerinize işaret edersiniz:

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

Her bir alt proje dizini build.gradleyalnızca alt projeye özgü şeyleri içeren bir dosya içerir .

Olursa olsun çağırmak durumunda gradleproje kök veya alt proje dizinden, gradle otomatik olarak çeşitli dosyalarda yapılan tüm tanımları dikkate alacaktır.

Ayrıca, kök seviyesinde varsayılan eklentinin ötesinde herhangi bir eklenti yüklemediğiniz sürece proje kökünüz için hiçbir derleme görevinin yürütülmeyeceğini unutmayın.


1
cevaplamak için zaman ayırdığınız için teşekkür ederiz. Sorun yaşadığım alt projeler değil, daha çok ortak görevlerden oluşan bir 'kitaplık' oluşturmak. İşleri daha net hale getirmek için orijinal sorumu daha fazla bilgi ve kod parçacıklarıyla düzenledim.
Anthony Roy

1
Dolayısıyla, örneğinizden içe aktarma ("tasks.gradle") yapmak yerine, tüm alt projeleriniz tarafından kullanılan genel görev oluşturma kodunu belirten alt projeler {} bölümüne sahip olursunuz. Bu, aradığınız soyutlamayı sağlamalıdır !?
Tom

Ivy eklentisi burada gerçekten gerekli mi? Gradle tek başına kullanılamaz mı?
IgorGanapolsky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.