Selama pengembangan saya menggunakan fungsi standar installDist (dari plugin application) di build.gradle:

installDist{}

Tetapi sekarang saya ingin memiliki tugas lain yang menginstal/mendistribusikan/menyebarkan versi "produksi" ke lokasi produksi, yang juga memasukkan versi tersebut ke dalam struktur direktori. Saya mencoba ini:

task deployOperativeVersion( type: installDist ) {
    destinationDir = file( "$productionDir/$version" )
}

Output kegagalan build:

Build file '/home/mike/IdeaProjects/JavaFXExp2/Organiser/build.gradle' line: 98

* What went wrong:
A problem occurred evaluating root project 'Organiser'.
> class org.gradle.api.tasks.Sync_Decorated cannot be cast to class java.lang.Class 
    (org.gradle.api.tasks.Sync_Decorated is in unnamed module of loader org.gradle.
    internal.classloader.VisitableURLClassLoader @aec6354; java.lang.Class is in module
    java.base of loader 'bootstrap')

Tampaknya installDist bukan "tipe" seperti pada Test.

Bagaimana saya bisa mencapai ini? Kebetulan saya akan sangat tertarik untuk memiliki dua tugas terpisah: untuk menjalankan installDist Saya menemukan bahwa Anda hanya perlu mengetik ./gradlew inst ... dengan tugas yang disebut deployXXX itu akan cukup untuk mengetik ./gradlew depl.

Saya juga mencoba ini:

task deployOperativeVersion{
    installDist{
        destinationDir = file( "$operativeDir/$version" )
    }
}

... yang tampaknya tidak melakukan apa-apa. Juga ini:

task deployOperativeVersion{
    doFirst {
        installDist {
            destinationDir = file("$operativeDir/$version")
        }
    }
}

Beberapa saat kemudian saya pikir saya memang telah menemukan jawabannya:

task deployOperativeVersion{
    dependsOn installDist{ destinationDir=file("$productionDir/$version")
}

... tetapi yang membuat saya takjub (apakah saya akan pernah mendapatkan pemahaman yang masuk akal tentang Gradle sebelum Neraka membeku?), termasuk ini sebenarnya tampaknya memengaruhi tugas "rutin" installDist: secara khusus, ini menghentikan yang terakhir dari operasi biasanya, dan berarti bahwa bahkan ketika saya menjalankan installDist penyebaran/distribusi/pemasangan masih menuju productionDir/version, bukan lokasi default.

Jadi saya bertanya-tanya tentang dua tugas yang keduanya bergantung pada installDist:

task deployOperativeVersion{
    dependsOn installDist{ destinationDir=file("$productionDir/$version") }
}

task stdInstall{
    dependsOn installDist{ destinationDir=file("build/install") }
}

... haha, tidak menyenangkan: Saya menjalankan satu dan itu menyebar dengan baik. Saya kemudian menjalankan yang lain ... dan mendapatkan kesalahan:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':installDist'.
> The specified installation directory '/home/mike/IdeaProjects/JavaFXExp2/Organiser/build/install' is neither empty nor does it contain an installation for 'Organiser'.
  If you really want to install to this directory, delete it and run the install task again.
  Alternatively, choose a different installation directory.

... tidak perlu dikatakan, ini BUKAN kasusnya: di bawah ...Organiser/build/install hanya ada satu direktori, Organizer, dengan direktori /bin dan /lib di bawahnya.

1
mike rodent 9 April 2020, 16:32

1 menjawab

Jawaban Terbaik

Tugas Anda harus dideklarasikan sebagai tugas Sync, yang merupakan jenis sebenarnya dari tugas installDist. Plugin application menggunakan plugin distribution. Anda dapat mengambil konfigurasi konten dari distribusi main, yang merupakan sumbernya, atau dari tugas installDist.

task deployOperativeVersion(type: Sync) {
    destinationDir = file("${productionDir}/${version}")
    with distributions.main.content
}

Atau

task deployOperativeVersion(type: Sync) {
    destinationDir = file("${productionDir}/${version}")
    with installDist
}
1
James Justinic 13 April 2020, 01:11