lundi 9 novembre 2020

Design Question - Gradle plugin for release packaging?

gradle newbie here,

I have began to implement a small gradle plugin. The goal of the plugin is to create a release zip for projects, with the intention of using across a couple of different projects.

Each project has a yaml file with a zipping structure loosely as such;

---
zip:
task:
  - name:
    zip:
     task:
          - name:
          - name:
          - name:
  • zip denotes that a given working directory should be zipped at this point

  • task denotes the name of a gradle task that should be executed preparing a particular directory in preparation of being zipped

The best pro that comes to mind is, with this approach I can reuse gradle tasks between projects and if needed include custom gradle tasks at a per project level and reference them here in the yml. Using a yaml also assists with creating release zips making them easy to build and read..

I have a manager gradle task that is called at runtime from cli ./gradlew myReleaseZipTask ( I think I achieve this by making it an exec task and putting the logic into the exec action). This manager task is responsible for parsing the yaml file into DTOs. Traversing from the lowest task I traverse up the graph executing each gradle task as defined preparing files into a specified directory and then once all tasks are completed zip the current workspace. Continue up the graph

Im halfway through my implementation and Im a little bit worried im abusing gradle in a way that its not intended. Some of my main concerns are;

I have one task that is orchestrating many other gradle tasks, I either find or create a task on the fly, then retrieve its actions and execute them from inside my manager task, this isnt something I see often in gradle examples. Everyone seems to have very static linear task dependencies and dont "reflectively" create or find tasks to execute..

When dealing with a task entry from the yml my manager task tries to lookup the gradle task by name, if it doesnt exist, it tries to create the task. Given a task is created/found I set the properties from the YmlTaskDTO onto the task and then call the task to execute. Will I run into issues with reusing the same tasks with different properties? For example if I have something like;

zip:
     task:
          - name: taskA
            argA: A
            argB: B
          - name: taskA
            argA: A
            argB: C

Could anyone give me some feedback on my design and if its inline with correct standards of gradle use? Please raise any concerns you may have!

Aucun commentaire:

Enregistrer un commentaire