2017-08-31 67 views
0

我想將共享gradle文件應用於我的項目settings.gradle。共享文件位於jar中,必須在配置階段下載並提取該文件。這是因爲應用了必須在配置階段應用的插件。我發現這個相關的問題:How to share a common build.gradle via a repository?我的首選方式描述在這個答案:https://stackoverflow.com/a/39228611/987860在配置階段在settings.gradle中使用ant

但是,這似乎只在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. 

有什麼辦法我settings.gradle之前利用ant的int confiuration階段評估?我需要在將要下載的文件被應用之前下載和附加依賴項。

回答

0

這是一種非常不尋常的做事方式。我真的不建議你做你想做的事情,因爲它會讓你的構建比應該慢得多。您正在刪除build/gradle並在每個版本中提取插件jar的內容。

build.gradle(或settings.gradle)中的所有內容都可以放入插件並以此方式分發。你已經有一個需要下載的jar,所以將myscript.gradle轉換成插件很容易粗略轉換。適用於settings.gradle

package some.package 

import org.gradle.api.* 

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

對於插件:

package some.package 

import org.gradle.api.* 

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

然後,你可以添加依賴於插件和使用

在一個已經產生插件JAR項目將這個在src/main/groovy/some/package/MyPlugin.groovyapply plugin: some.package.MyPlugin

以這種方式開發/分發插件還有很多其他優勢。你可以在Gradle Guides找到關於插件開發的更多信息。

或者,如果您絕對必須保留單獨的.gradle腳本。如果你可以單獨爲它服務(罐外),你可以這樣做:

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

這樣做的缺點是,它會下載該文件上的每個版本(這是固定的搖籃4.2)。

+0

謝謝,我沒有注意到構建時間的顯着增加。所以下載和提取一個jar並不是一個大問題,我不介意它是否在每個構建中都完成。我的腳本所做的只是從官方gradle插件回購中應用插件,但我不想將內容複製/粘貼到我的所有項目中。除非沒有辦法取消下載的文件,否則我會保留原樣。從公開可用的網址應用配置可能是最後一個,但是可行的選項。 – Ben