【问题标题】:Apply a gradle plugin with a common configuration to all projects将具有通用配置的 gradle 插件应用于所有项目
【发布时间】:2015-11-25 15:36:33
【问题描述】:

我有一个包含多个不相关的 gradle 项目的工作区。我正在寻找一种方法,通过通用配置将工件插件应用于所有这些插件。

到目前为止,我尝试创建这个通用的 gradle 文件,并使用 apply from 将它应用到每个项目(顶级,而不是模块):

buildscript {
  repositories {
    maven {
            url 'http://artifactory.mycompany.com/artifactory/plugins-release'    
        } 
    }

    dependencies {
     classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
  }

}


if (!project.plugins.findPlugin("com.jfrog.artifactory"))
  project.apply(plugin: "com.jfrog.artifactory")

artifactory {
    contextUrl = "${artifactory_contextUrl}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            maven = true
        }
    }
    resolve {
        repository {
            repoKey = 'libs-release'
            maven = true
        }
    }
}

但我在构建时遇到以下错误:

A problem occurred evaluating script.
> Failed to apply plugin [id 'com.jfrog.artifactory']
   > Plugin with id 'com.jfrog.artifactory' not found.

我怎样才能让这个方案发挥作用?

【问题讨论】:

  • 构建脚本必须在多模块项目的根 build.gradle 文件中定义。子项目中的 buildscript 块被忽略。这可能是导致找不到插件的原因。
  • @BenManes Gretty 的(用于 gradle 的 tomcat/jetty 插件)似乎成功地做到了,但在我的情况下它不起作用。这是他们的“入门”指南:akhikhl.github.io/gretty-doc/Getting-started.html 他们建议在 build.gradle 中添加“应用自:'raw.github.com/akhikhl/gretty/master/pluginScripts/…'”以获取插件
  • 是的,但这必须应用于根项目而不是子项目。我不确定这是否是您的问题,但这听起来与用户在设置我的插件时报告的错误相似。
  • 特别是这让我想起了这个issue
  • @BenManes 是的,看起来确实很相似,但是我尝试将其应用到的项目是一个完全独立的 java 项目,它也可能是一个 gradle“HelloWorld”。它不是多项目构建的模块。

标签: java gradle build.gradle artifactory


【解决方案1】:

据我所知,为不相关的项目注入通用配置的最佳方法是使用an init script。您可以在其中配置常见行为,包括应用 Artifactory 插件。

【讨论】:

  • 听起来不错,但我仍然无法让它工作。我在 initscript 中定义了 jcenter 存储库和 org.jfrog.buildinfo:build-info-extractor-gradle 类路径,但我得到一个“未找到 ID 为 'com.jfrog.artifactory' 的插件”。当我尝试应用插件时。您能否指出一个可行的示例?
  • 好的,所以我发现问题是您不能在初始化脚本中通过其 id 添加插件(请参阅此答案:stackoverflow.com/a/14600210/3199595)。
【解决方案2】:

我终于让它工作了。

正如JBaruch 提到的那样,“正确”的做法可能是使用初始化脚本。问题是 Gradle(在我的例子中是 2.6 版)无法在初始化脚本中通过其 id 添加插件。这是 2012 年 6 月(至少)已知的错误(请参阅 here)。感谢this SO answer from 2013

话虽如此,由于工件插件本身的变化,OP 从 2013 年开始的解决方案(发布在 question 本身)不再起作用。具体来说,插件的完全限定名称不再是org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin。现在(版本 3.1.1)有两个用于 gradle 2 的插件:

org.jfrog.gradle.plugin.artifactory.ArtifactoryPublicationsGradle2Pluginorg.jfrog.gradle.plugin.artifactory.ArtifactoryConfigurationsGradle2Plugin

所以这是一个有效的初始化脚本:

initscript {
    repositories {
       jcenter()
    }

    dependencies {
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1'
    }
}

allprojects {
    apply plugin: org.jfrog.gradle.plugin.artifactory.ArtifactoryConfigurationsGradle2Plugin //Note the lack of quotation marks
    apply plugin: org.jfrog.gradle.plugin.artifactory.ArtifactoryPublicationsGradle2Plugin //Note the lack of quotation marks

    artifactory {
        contextUrl = "${artifactory_contextUrl}"
        publish {
            repository {
                repoKey = 'libs-release-local'
                username = "${artifactory_user}"
                password = "${artifactory_password}"
                maven = true
            }
        }
        resolve {
            repository {
                repoKey = 'libs-release'
                username = "${artifactory_user}"
                password = "${artifactory_password}"
                maven = true
            }
        }
    }   
}

编辑:

另一个更简单的解决方案是完全删除 artifactory 插件,并将其替换为 maven-publish。像这样:

allprojects {

    apply plugin: 'maven-publish'

    publishing {
        repositories {
            maven {
                url  "${artifactory_contextUrl}/"+ (version.contains('SNAPSHOT') ? 'libs-snapshot-local' : 'libs-release-local')
                credentials {
                    username "${artifactory_user}"
                    password "${artifactory_password}"
                }
            }
        }
    }

    repositories {
        mavenLocal()

        maven {
            url "${artifactory_contextUrl}/libs-release"
            credentials {
                username "${artifactory_user}"
                password "${artifactory_password}"
            }
        }

        maven {
            url "${artifactory_contextUrl}/libs-snapshot"
            credentials {
                username "${artifactory_user}"
                password "${artifactory_password}"
            }
        }
    }
} 

【讨论】:

  • @JBaruch 初始化脚本只是解决方案的一部分,因为在初始化脚本中加载外部插件很棘手,如果插件的类名在未来版本中发生变化,事情可能会中断。我还在等着看是否有人能想出一个更干净的方法来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多