在配置阶段在settings.gradle中使用ant

时间:2017-08-31 20:32:23

标签: gradle groovy jar

我想将共享gradle文件应用于我的项目settings.gradle。共享文件位于jar中,必须在配置阶段下载和提取。这是因为应用了一个必须在配置阶段应用的插件。我发现了这个相关的问题:How to share a common build.gradle via a repository?我在这个答案中描述了我的首选方式:https://stackoverflow.com/a/39228611/987860

但是,这似乎仅适用于build.gradle。我尝试将buildscript块移到我的settings.gradle

settings.gradle

buildscript {

    ext {
        dependencyVersion = '0.1.2'
    }

    repositories {
        maven {
            credentials {
                username 'user'
                password 'password'
            }
            url 'https://my-private-maven-repo.com'
        }
    }
    dependencies {
        classpath "my.group:myartifact:$dependencyVersion"
    }
    dependencies {
        def gradleScripts = new File(rootDir, '/build/gradle')
        delete gradleScripts
        def jars = configurations.classpath.files as List<File>
        ant.unjar(src: jars.find { it.name.matches '.*myartifact.*' }, dest: gradleScripts) {
            patternset {
                include(name:'*.gradle')
            }
        }
    }
}

apply from: new File(rootDir, '/build/gradle/myscript.gradle')

但这导致以下异常:

FAILURE: Build failed with an exception.

* Where:
Settings file 'settings.gradle' line: 24

* What went wrong:
A problem occurred evaluating settings 'journal'.
> Could not get unknown property 'ant' for object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 0.019 secs
Could not get unknown property 'ant' for object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

在评估ant之前,有没有办法在配置阶段使用settings.gradle?在下载待下载文件之前,我需要下载依赖项并进行extractet。

1 个答案:

答案 0 :(得分:0)

这是一种非常不寻常的做事方式。我真的建议你不要做你想做的事情,因为它会让你的构建速度慢得多。您正在删除build/gradle并在每次构建时提取插件jar的内容。

build.gradle(或settings.gradle)中的所有内容都可以放入插件中并以这种方式分发。您已经有一个需要下载的jar,因此将myscript.gradle转换为插件非常容易粗略转换。

将它放在src/main/groovy/some/package/MyPlugin.groovy已生成插件jar的项目中:

package some.package

import org.gradle.api.*

class MyPlugin implements Plugin<Project> {
   void apply(Project project) {
      project.with {
        // contents of script
      }
   }
}

适用于settings.gradle的插件:

package some.package

import org.gradle.api.*

class MyPlugin implements Plugin<Settings> {
   void apply(Settings settings) {
      settings.with {
        // contents of script
      }
   }
}

然后,您只需将依赖项添加到插件中,然后使用apply plugin: some.package.MyPlugin

以这种方式开发/分发插件还有很多其他优点。您可以在Gradle Guides中找到有关插件开发的更多信息。

或者,如果您绝对必须保留单独的.gradle脚本。如果你可以单独服务(在jar之外),你可以这样做:

apply from: "http://example.com/some/url/myscript.gradle"

这样做的缺点是它会在每次构建时下载文件(这在Gradle 4.2中已得到修复)。