如何更改 gradle 插件存储库?

Posted

技术标签:

【中文标题】如何更改 gradle 插件存储库?【英文标题】:How can the gradle plugin repository be changed? 【发布时间】:2016-09-14 02:26:54 【问题描述】:

我在一家大公司工作,该公司有严格的政策,禁止未经过滤地使用外部库。我们必须从受祝福的公司存储库中提取所有内容,而不是从裸互联网(包括 gradle.org)中提取所有内容。

使用 gradle 的原始应用插件语法,结合 buildscript 块,我可以将(祝福)插件添加到我们的 repo 并在构建中使用它们。换句话说:

buildscript 
    repositories 
        maven  url "https://privaterepo.myemployer.com" 
    

    dependencies 
        // various dependencies
        classpath "org.something:some-plugin:1.0"
        ...
    

apply plugin: "someplugin"

相反,我希望能够使用新的插件 DSL,即

plugins 
    id 'org.something.some-plugin' version '1.0'

(我意识到需要在某个地方定义私有 repo url)

新的插件语法总是转到 gradle.org 并且似乎没有任何方法可以提供备用下载 url。有人知道方法吗?

我仔细检查了文档和 Internet,但找不到答案。如果答案完全显而易见,我们深表歉意。

非常感谢!

【问题讨论】:

仅供参考,在 Gradle 2.14 中能够做到这一点,它的第一个候选版本应该在本周发布。 请注意。发布候选版本于今天上午发布。 gradle.org/release-candidate 如果它有解决这个问题? 【参考方案1】:

Gradle 3.5 和(大概)更高版本

Gradle 3.5 有一个新的 (incubating) 功能,可以更好地控制插件依赖解析,using the pluginManagement DSL:

插件解析规则允许你修改插件请求 plugins 块,例如更改请求的版本或明确 指定实现工件坐标。

要添加解析规则,请使用resolutionStrategy pluginManagement 块:

示例 27.6。插件解析策略。

settings.gradle
pluginManagement 
  resolutionStrategy 
      eachPlugin 
          if (requested.id.namespace == 'org.gradle.sample') 
              useModule('org.gradle.sample:sample-plugins:1.0.0')
          
      
  
  repositories 
      maven 
        url 'maven-repo'
      
      gradlePluginPortal()
      ivy 
        url 'ivy-repo'
      
  

这告诉 Gradle 使用指定的插件实现工件 而不是使用其从插件 ID 到的内置默认映射 Maven/Ivy 坐标。

pluginManagement 块只能出现在 settings.gradle 中 文件,并且必须是文件中的第一个块。自定义 Maven 和 Ivy 插件存储库还必须包含插件标记工件 到实际实现插件的工件。

pluginManagement 中的 repositories 块与以前版本中的 pluginRepositories 块的工作方式相同。


Gradle 3.5 之前

在 Gradle 3.5 之前,您必须在 settings.gradle 中 define the pluginRepositories block,如 sytolk 的回答中所述:

pluginRepositories 块可能只出现在 settings.gradle 文件,并且必须是文件中的第一个块。

pluginRepositories 
  maven 
    url 'maven-repo'
  
  gradlePluginPortal()
  ivy 
    url 'ivy-repo'
  

【讨论】:

有没有办法在 build.gradle 中做到这一点?【参考方案2】:

自最新版本的 Gradle 以来,插件语法发生了一些变化,现在 Gradle 4.x 的正确语法是:

pluginManagement 
  repositories 
      maven 
        url 'maven-repo'
      
      gradlePluginPortal()
      ivy 
        url 'ivy-repo'
      
  

因此,例如,这个 settings.gradle 将使用您的内部 Nexus 镜像:

pluginManagement 
  repositories 
    maven 
      url 'https://internal.repo.corporate/repository/gradle-proxy/'
    
  


rootProject.name = 'My Project Name'

更多信息可以在the Gradle plugin documentation找到。

【讨论】:

【参考方案3】:

要全局应用设置,可以是added to USER_HOME/.gradle/init.gradle,如下:

allprojects        
    repositories 
        mavenLocal()
        maven  url "https://artifactory.mycompany.com/artifactory/maven-repo" 
           
   

settingsEvaluated  settings ->
    settings.pluginManagement 
        repositories 
            mavenLocal()
            maven  url "https://artifactory.mycompany.com/artifactory/maven-repo" 
        
    

【讨论】:

flutter-plugin 失败,例如apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 仍然尝试下载gradle-3-2-1.jar 文件;但扩展该插件的flutter.gradle 文件,如buildscript repositories maven url uri(offlineRepoDir) 有效??? 用户级别的配置应该用于 preferential 设置(作为一般规则,不仅仅是 Gradle)。像这样的关键配置应该与项目一起存储。【参考方案4】:

需要在设置Gradle中定义pluginRepositories

https://docs.gradle.org/current/userguide/plugins.html#sec:custom_plugin_repositories

pluginRepositories 块只能出现在 settings.gradle 文件中,并且必须是文件中的第一个块

pluginRepositories 
  maven 
    url 'maven-repo'
  
  gradlePluginPortal()
  ivy 
    url 'ivy-repo'
  

【讨论】:

以上是关于如何更改 gradle 插件存储库?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库?

如何更改 Gradle 下载位置

Gradle'war'插件如何更改档案的名称

Android 库 - 使用 Gradle 将多个变体发布到本地 Maven 存储库

Gradle eclipse 插件:在存储库容器上找不到参数 [] 的方法 jcenter()。有关详细信息,请参阅错误日志

用于依赖项的 Gradle 私有存储库