我已经从 groovy 迁移到 gradle 中的 kotlin,并正在相应地重组项目。我们有多个常规文件,以免主
build.gradle
变得太大和笨重。
apply(from = ... )
不适用于 kts 中的这些文件,将包含的文件保留在 groovy 中可以工作,但很难看。这也是不建议使用的。从文档中我可以看到共享插件是我想要在多个项目上共享配置的插件。但是我找不到任何有关如何配置插件的信息。
作为示例,我想要一个插件来封装我们常见的声纳配置并应用相应的插件:
plugins {
id("org.sonarqube")
}
sonarqube {
properties {
property("sonar.projectKey", "individual_project")
property("sonar.projectName", "Title that is different for each project")
property("sonar.host.url", "https://sonar.somewhere.com")
property("sonar.dependencyCheck.jsonReportPath", "./build/reports/dependency-check-report.json")
property("sonar.dependencyCheck.htmlReportPath", "./build/reports/dependency-check-report.html")
}
}
有两个字段,标题和项目密钥需要为每个项目设置,并且不是静态的。我还没有找到任何关于如何拥有动态值的文档,似乎 gradle 文件中的所有示例都或多或少地添加了任务或静态内容。您如何在插件中拥有动态值,或者跨项目共享可配置构建代码的方式是什么?
使用 gradle.properties 是一种规范的方式吗?我编写的某些插件只是期望设置某些属性?
干杯
您可以提供自定义扩展以允许项目配置该值。还有其他方法,例如使用
gradle.properties
中定义的属性,但提供专用 DSL 更为惯用。
此docs链接用于任务,但概念是相同的。
public abstract class MyExtension {
public abstract Property<String> getProjectKey();
}
然后在您的自定义插件中创建扩展:
public abstract class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.getPluginManager().apply("org.sonarqube");
project.getExtensions().create("myExtension", MyExtension.class);
}
}
然后可以在项目中使用它:
myExtension {
projectKey = "com.example"
}
然后将其映射到插件内的声纳属性:
public abstract class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.getPluginManager().apply("org.sonarqube");
ExtensionContainer extensions = project.getExtensions();
MyExtension myExtension = extensions.create("myExtension", MyExtension.class);
SonarExtension sonar = extensions.getByType(SonarExtension.class);
sonar.properties(properties -> {
properties.property("sonar.projectKey", myExtension.getProjectKey());
});
}
}
这是一个纯Java示例,但概念是相同的。