gpt4 book ai didi

gradle - 如何在gradle插件中添加新的语言源目录?

转载 作者:行者123 更新时间:2023-12-04 07:50:29 25 4
gpt4 key购买 nike

我想要以下用于任意语言foo的gradle脚本:

sourceSets {
main {
java {
srcDir "${project.buildDir}/generated-sources/gen-java"
}
foo {
srcDir "${project.buildDir}/generated-sources/gen-foo"
}
}
test {
java {
srcDir "${project.buildDir}/generated-sources/gen-test-java"
}
foo {
srcDir "${project.buildDir}/generated-sources/gen-test-foo"
}
}
}

我还希望在 foosrc/main/foo中具有标准的 src/test/foo源目录。

如何编写gradle插件来实现这种功能?有可能这样做吗?

对于下面的需求,我有一个“类似于解决方案”的解决方法,但仍想了解添加新语言源目录的正确方法。

最佳答案

为了实现这种功能,应该扩展现有的源集(或至少扩展maintest源集)。看起来像maintest源集are defined in JavaPlugin 。可以通过Convention对象进行扩展。

public class FooPlugin implements Plugin<ProjectInternal> {
@Override
public void apply(ProjectInternal project) {
project.getPluginManager().apply(JavaPlugin.class);
FooExtension ext = project.getExtensions().create(
"foo",
FooExtension.class,
project,
project.getFileResolver()
);
SourceSetContainer cont = (SourceSetContainer) project.getProperties().get("sourceSets");
cont.all((SourceSet ss) -> {
String name = ss.getName();
File sources = project.file("src/" + name + "/foo");
FooSourceSet fss = ext.getSourceSetsContainer().maybeCreate(name);
SourceDirectorySet sds = fss.getFoo();
sds.srcDir(sources);
Convention sourceSetConvention = (Convention) InvokerHelper.getProperty(ss, "convention");
sourceSetConvention.getPlugins().put("foo", fss);
});
project.task("compileFoo");
}
}

public class FooExtension {

private final NamedDomainObjectContainer<FooSourceSet> sourceSetsContainer;

public FooExtension(Project project, FileResolver fileResolver) {
sourceSetsContainer = project.container(
FooSourceSet.class,
new FooSourceSetFactory(fileResolver)
);
}

public NamedDomainObjectContainer<FooSourceSet> getSourceSetsContainer() {
return sourceSetsContainer;
}

public void srcDir(String file) {
sourceSetsContainer.getByName("main").getFoo().srcDir(file);
}
}

public class FooSourceSetFactory implements NamedDomainObjectFactory<FooSourceSet> {

private final FileResolver fileResolver;

public FooSourceSetFactory(FileResolver fileResolver) {
this.fileResolver = fileResolver;
}

@Override
public FooSourceSet create(String name) {
return new DefaultFooSourceSet(name, fileResolver);
}
}

public interface FooSourceSet {
public String getName();
public SourceDirectorySet getFoo();
public FooSourceSet foo(Closure clsr);
}

public class DefaultFooSourceSet implements FooSourceSet {

final String name;
final SourceDirectorySet foo;

public DefaultFooSourceSet(String displayName, FileResolver fileResolver) {
this.name = displayName;
DefaultDirectoryFileTreeFactory ddftf = new DefaultDirectoryFileTreeFactory();
foo = new DefaultSourceDirectorySet(name, fileResolver, ddftf);
}

@Override
public String getName() {
return name;
}

@Override
public SourceDirectorySet getFoo() {
return foo;
}

@Override
public FooSourceSet foo(Closure clsr) {
ConfigureUtil.configure(clsr, foo);
return this;
}
}

public class CompileFooTask extends DefaultTask {

@TaskAction
public void compileFoo() {
SourceSetContainer cont = (SourceSetContainer) getProject().getProperties().get("sourceSets");
cont.all((SourceSet ss) -> {
FooSourceSet fss = getProject()
.getExtensions()
.getByType(FooExtension.class)
.getSourceSetsContainer()
.maybeCreate(ss.getName());
System.out.println("directories under " + ss.getName()
+ ": " + fss.getFoo().getSrcDirs());
});
}
}

任务 compileFoo演示了该插件确实有效。给定问题的构建脚本片段,它会打印出以下行:
directories under main: [<root>/src/main/foo, <root>/build/generated-sources/gen-foo]
directories under test: [<root>/src/test/foo, <root>/build/generated-sources/gen-test-foo]

关于gradle - 如何在gradle插件中添加新的语言源目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com