【问题标题】:Resolve a dependency dynamically inside a gradle task在 gradle 任务中动态解决依赖关系
【发布时间】:2014-01-27 07:40:46
【问题描述】:

我正在尝试构建一个 gradle 插件,它执行以下操作:

  1. 作为其任务的一部分,它会创建一个新配置
  2. 它向此配置添加了 DefaultExternalModuleDependency - 更具体地说,它构建了对应用程序服务器 zip 文件(在 Nexus 上可用)的依赖关系。调用项目也可以覆盖此信息。
  3. 尝试解决这个新添加的依赖项,然后将文件解压缩到本地文件夹

当我将详细信息硬编码在构建文件中时,所有这些都运行良好,但看起来添加依赖项作为任务的一部分并没有像在解析时提供该信息那样被对待。

所以我的问题是,如何让项目重新加载配置/依赖项?

代码如下所示:

@TaskAction
void installAppserver() {
  Dependency dependency = new DefaultExternalModuleDependency(group,name,version)
  Configuration configuration = project.configurations.detachedConfiguration(dependency)
  configuration.setTransitive(false)
  configuration.files.each { file ->
    if (file.isFile() && file.name.endsWith('.zip')) {
      println 'Attempting to unzip: ' + file + ' into folder: ' + appServerFolder
      new Copy().from(project.zipTree(file)).into(appServerFolder).execute()
    }
  }
}

问题是实际的工件没有得到解决!

【问题讨论】:

    标签: gradle


    【解决方案1】:

    任务无法配置构建模型(插件就是这样做的)。在任务中创建和解决分离的配置很好。如果这不起作用,则任务代码或它试图解决的依赖关系可能存在问题。请注意,只有定义了正确的存储库,才能解决依赖关系。

    应该使用project.dependencies.create() 而不是new DetaultExternalModuleDependency()(这是一个内部类)。应该使用project.copy 而不是new Copy().execute()(不能从用户代码中调用Task#execute)。

    【讨论】:

    • 不。没运气。当我在调试模式下运行代码时,我注意到存储库存在;正在使用正确的存储库来查找依赖项; TransientConfigurationBuilder 说它已经加载了“已解决的配置结果” - 然后它停止了!我现在不确定如何进行调试。有什么想法吗?
    • 不可能在不知道所有细节的情况下说出来。这不是一个普遍的问题,因为许多现有任务已经与您尝试执行的任务相同。也许看看 Gradle 代码库中的代码质量插件。
    • 我正在调试代码,并注意到当我尝试动态解析配置时,从未调用过“DefaultModuleDescriptor.addArtifact()”方法。
    • 没关系..发现我的错误..没有指定文件扩展名。另一方面,我仍然将此标记为答案,因为此讨论帮助我清理了我的插件并在正确的位置查找。谢谢彼得。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2017-04-29
    • 2015-06-15
    • 1970-01-01
    • 2018-06-18
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多