Gradle:从根项目获取所有sourceSet

hkmswyz6  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(170)

我正在写一个插件来做一些自定义的文件索引的内部用例,我们有我目前的工作。
做了一些修改后,我发现我可以在rootProject的buildSrc中创建我的任务/插件,并通过

subprojects {
    apply plugin: MyCustomIndexerPlugin
}

我的插件的实现看起来像这样,并且在这个单一模块的上下文中工作得很好:

@Override
public void apply(Project project) {
    Convention convention = project.getConvention();
    System.out.println("Working: " + project.getName());
    JavaPluginConvention javaPluginConvention = convention.getPlugin(JavaPluginConvention.class);
    SourceSetContainer sourceSets = javaPluginConvention.getSourceSets();

    TaskContainer taskContainer = project.getTasks();
    MyCustomIndexerTask myCustomIndexerTask = taskContainer.create("myCustomIndexerTask", MyCustomIndexerTask.class, task -> task.setSourceSetContainer(sourceSets));

    Task build = taskContainer.getByName("build");
    build.dependsOn(myCustomIndexerTask);
}

我的任务是:

@TaskAction
public void taskAction() {
    SortedMap<String, SourceSet> asMap = getSourceSetContainer().getAsMap();
    for (String sourceSetName : asMap.keySet()) {
        SourceSet sourceSet = asMap.get(sourceSetName);
        Set<File> files = sourceSet.getAllJava().getFiles();
        for (File file : files) {
            System.out.println(sourceSetName + " -> " + file);
        }
    }
}

作为一个概念的证明,这是可以的,但是我想让我的自定义任务在rootProject级别执行。所以在所有模块成功构建之后,我对所有的sourceSet运行我的代码。这是可能的吗?或者我需要在我的项目构建时以某种方式将这些数据从一个模块传递到另一个模块吗?
我很难找到正确的文档来做我需要执行的正确的元编码。

wz1wpwve

wz1wpwve1#

您可以在rootProject的build.gradle文件中应用该插件。然后,您可以执行以下操作:

@Override
def apply(Project project) {
  if (project != project.rootProject) { throw new IllegalStateException("Can only be applied to rootProject") }
  def myCustomIndexerTask = taskContainer.create("myCustomIndexerTask", MyCustomIndexerTask.class)
  project.tasks.getByName("build").dependsOn myCustomIndexerTask

  project.subprojects.each { sp ->
    sp.whenPluginAdded(JavaPlugin) { jp ->
      def javaPluginConvention = sp.getConvention().getPlugin(JavaPluginConvention)
      def sourceSets = javaPluginConvention.getSourceSets()
      myCustomIndexerTask.addSourceSetContainer(sourceSets)
    }
  }
}

在您的自定义任务中,您需要迭代所有添加的SourceSetContainers

0lvr5msh

0lvr5msh2#

自7.5.1起,Gradle中不再支持约定 (在since 2017前后已采取了这样的措施)
您可以通过使用扩展来实现相同的结果:

rootProject.getSubprojects().forEach(subProject -> {
    JavaPluginExtension javaExtension = subProject.getExtensions().getByType(JavaPluginExtension.class);
    javaExtension.getSourceSets().forEach(set -> {
        // do things with source-set
    });
});

相关问题