ฉันจะนำเข้าสคริปต์ Gradle หนึ่งไปยังอีกสคริปต์หนึ่งได้อย่างไร


101

ฉันมีสคริปต์ gradle ที่ซับซ้อนซึ่งรวบรวมฟังก์ชันการทำงานรอบ ๆ การสร้างและปรับใช้โครงการ netbeans จำนวนมากกับสภาพแวดล้อมต่างๆ

สคริปต์ทำงานได้ดีมาก แต่โดยพื้นฐานแล้วมันถูกกำหนดค่าผ่านแผนที่ครึ่งโหลที่มีข้อมูลโครงการและสภาพแวดล้อม

ฉันต้องการแยกงานออกเป็นไฟล์อื่นเพื่อที่ฉันจะได้กำหนดแผนที่ของฉันในไฟล์บิลด์ธรรมดาและนำเข้างานจากไฟล์อื่นได้ ด้วยวิธีนี้ฉันสามารถใช้งานหลักเดียวกันกับโครงการต่างๆและกำหนดค่าโครงการเหล่านั้นด้วยชุดแผนที่ง่ายๆ

ใครช่วยบอกฉันหน่อยได้ไหมว่าฉันจะนำเข้าไฟล์ gradle หนึ่งไฟล์ไปยังอีกไฟล์หนึ่งในลักษณะเดียวกับงานของ Ant ฉันลากเส้นเอกสารของ Gradle จนไม่มีประโยชน์

ข้อมูลเพิ่มเติม

หลังจากคำตอบของทอมด้านล่างฉันคิดว่าฉันจะพยายามชี้แจงว่าฉันหมายถึงอะไร

โดยทั่วไปฉันมีสคริปต์ gradle ซึ่งรันโปรเจ็กต์ย่อยจำนวนมาก อย่างไรก็ตามโครงการย่อยเป็นโครงการ Netbeans ทั้งหมดและมาพร้อมกับสคริปต์สร้างมดของตัวเองดังนั้นฉันจึงมีงานที่ต้องทำอย่างค่อยเป็นค่อยไปเพื่อเรียกสิ่งเหล่านี้

ปัญหาของฉันคือฉันมีการกำหนดค่าบางอย่างที่ด้านบนของไฟล์เช่น:

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

จากนั้นฉันสร้างงานต่างๆเช่น:

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

ฉันมีตัวอย่างข้อมูลการสร้างงานประเภทนี้มากมายและทั้งหมดเป็นแบบทั่วไป - ทั้งหมดขึ้นอยู่กับการกำหนดค่าในรายการโครงการ

ดังนั้นสิ่งที่ฉันต้องการคือวิธีใส่สิ่งนี้ในสคริปต์แยกต่างหากและนำเข้าด้วยวิธีต่อไปนี้:

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.

ดังนั้นในตัวอย่างนี้ task.gradle จะมีโค้ดการสร้างงานทั่วไปทั้งหมดและจะรันสำหรับโปรเจ็กต์ที่กำหนดไว้ในไฟล์ build.gradle หลัก ด้วยวิธีนี้ task.gradle คือไฟล์ที่สามารถใช้ได้กับโปรเจ็กต์ขนาดใหญ่ทั้งหมดที่ประกอบด้วยโปรเจ็กต์ย่อยจำนวนมากที่มีไฟล์บิวด์มด Netbeans


3
พิจารณา "ใช้จาก: 'other.gradle'" เพื่อนำเข้าการประกาศภายนอก (ดู "12.4. การกำหนดค่าโครงการโดยใช้สคริปต์สร้างภายนอก" ที่นี่gradle.org/0.9-preview-1/docs/userguide/… )
Petr Gladkikh

@PetrGladkikh apply fromดำเนินการงานภายนอกทันที สิ่งนี้อาจไม่เป็นที่นิยมในตรรกะการดำเนินการ (เช่นฉันต้องการดำเนินงานเมื่อต้องการไม่ใช่ในทันที)
IgorGanapolsky

คำสั่งนี้ในความคิดเห็นด้านบนไม่เป็นความจริง : apply fromดำเนินการงานภายนอกทันที อย่าเข้าใจผิด งานภายนอกได้รับการกำหนดค่าไม่ได้ดำเนินการ
Jarekczek

คำตอบ:



17

buildSrc/src/main/groovyคำตอบสำหรับคำถามที่เปิดออกมาเป็นในระบบปลั๊กอินที่คุณสามารถเพิ่มฟังก์ชันการทำงานที่ต้องการในชุดของปลั๊กอินที่สามารถนำไฟล์แรงอยู่ในไดเรกทอรี ปลั๊กอินสามารถรวมเป็น Jar ได้แม้ว่าฉันจะไม่ได้ลองใช้

รายละเอียดที่นี่: ปลั๊กอินที่กำหนดเอง


เพื่อให้ทราบว่าลิงก์เสีย - นี่คือการอัปเดตgradle.org/docs/current/userguide/…
JARC

ลิงค์ปลั๊กอิน: gradle.org/docs/current/userguide/…
JARC

4

เป็นการยากที่จะบอกว่าอะไรให้บริการคุณได้ดีที่สุดโดยที่ไม่เห็นไฟล์บิลด์ของคุณจริงๆ

ฉันสามารถสันนิษฐานได้ว่าการสร้างสภาพแวดล้อมของคุณเป็นโครงสร้างหลายโครงการควรให้สิ่งที่เป็นนามธรรมที่คุณกำลังมองหา

ในรูทโปรเจ็กต์ของbuild.gradleคุณคุณกำหนดสิ่งเฉพาะโดเมนของคุณทั้งหมดรวมทั้งสิ่งที่ใช้กับโปรเจ็กต์ ย่อยทั้งหมดของคุณ:

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()

ไดเร็กทอรี root ของโปรเจ็กต์อาจมีgradle.propertiesไฟล์ที่คุณกำหนดคุณสมบัติที่โปรเจ็กต์ของคุณใช้:

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

จากนั้นในไฟล์เพิ่มเติมจากรูทโปรเจ็กต์ของคุณชื่อsettings.gradleคุณชี้ไปที่โปรเจ็กต์ย่อยของคุณ:

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')
...

ไดเร็กทอรีย่อยแต่ละโครงการมีbuild.gradleไฟล์ที่มีเฉพาะรายการย่อยของโปรเจ็กต์เท่านั้น

ไม่ว่าคุณจะเรียกใช้gradleจากรูทโปรเจ็กต์หรือไดเร็กทอรีย่อยของโปรเจ็กต์ก็ตาม gradle จะพิจารณาคำจำกัดความทั้งหมดของคุณที่ทำในไฟล์ต่างๆโดยอัตโนมัติ

โปรดทราบว่าจะไม่มีการดำเนินการคอมไพล์สำหรับรูทโปรเจ็กต์ของคุณตราบใดที่คุณไม่โหลดปลั๊กอินใด ๆ เกินปลั๊กอินเริ่มต้นที่ระดับรูท


1
ขอขอบคุณที่สละเวลาตอบ ไม่ใช่โครงการย่อยที่ฉันมีปัญหา แต่เป็นการสร้าง 'ไลบรารี' ของงานทั่วไป ฉันได้แก้ไขคำถามเดิมของฉันด้วยข้อมูลเพิ่มเติมและตัวอย่างโค้ดเพื่อให้ชัดเจนขึ้น
Anthony Roy

1
ดังนั้นแทนที่จะทำการอิมพอร์ต ("task.gradle") จากตัวอย่างของคุณคุณจะมีส่วนโปรเจ็กต์ย่อย {} ที่ระบุรหัสการสร้างงานทั่วไปที่ใช้โดยโปรเจ็กต์ย่อยทั้งหมดของคุณ สิ่งนี้ควรให้เป็นนามธรรมแบบเดียวกับที่คุณกำลังมองหา!?
ทอม

ปลั๊กอิน Ivy จำเป็นจริงๆหรือไม่? ไม่สามารถใช้ Gradle เพียงอย่างเดียวได้หรือไม่?
IgorGanapolsky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.