具有解耦项目的多项目Gradle构建:如何将依赖项替换为非Java兄弟项目?

时间:2018-10-12 00:08:30

标签: gradle dependencies multi-project

我有一个Gradle项目,其结构如下:

wa-arm-spring-selector
\-core
\-data
\-ws

尽管它们彼此依赖,但是每个子项目都是分离的,可以使用在根项目的build文件夹中生成的基于共享本地文件系统的Maven存储库来单独执行,以共享依赖项。这使项目保持解耦,这是我喜欢的,但是,这引入了需要Maven存储库的必要,这仅是必需的,因为每个子项目都不知道其同级项目。当单独执行时,这很有意义,但是我希望能够执行根项目并替换依赖项,从而不需要此Maven回购。

现在,我已经在我的根项目中编写了一个依赖替换段以实现此目的:

// Replace local module dependencies with project dependencies if the project exists
allprojects {
  configurations.all {
    resolutionStrategy.dependencySubstitution.all { DependencySubstitution dependency ->
      if (dependency.requested instanceof ModuleComponentSelector && dependency.requested.group == "wa.arm.springselector") {
        def targetProject = findProject(":${dependency.requested.module}")
        if (targetProject != null) {
          println "Substituting dependency for project " + targetProject.getName();
          dependency.useTarget(targetProject, "Substituted dependency for local project as it exists")
        }
      }
    }
  }
}

虽然这适用于跨项目标准发布的工件依赖项,但似乎不适用于我的“数据”项目。

“数据”项目生成TARed / GZIPped工件,该工件实质上只是运行时“核心”项目和“ ws”项目都需要的数据CSV。依赖关系写在“核心”中,如下所示:

configurations {
    data { transitive = false }
}
dependencies {
    data 'wa.arm.springselector:data:+'
}

在数据项目中,其产生方式如下:

configurations {
  data
}

publishing {
  publications {
    data(MavenPublication) {
      afterEvaluate {
        artifact bundleCSVTar
      }
    }
  }

  repositories {
    maven {
      name = 'onMachineRepo'
      url = localServerRepoURL
    }
  }
}

task bundleCSVTar(type: Tar) {
  group 'distribution'
  description 'Bundle the output CSV for distribution as a TAR GZ ball'
  compression 'gzip'
  from compileCSVs.outputs
}

artifacts {
  // Define that output artifact for the csvs configuration is produced by the bundleCSVTar task
  data bundleCSVTar
}

当我分别发布每个子项目的工件时,这一切都很好,但是当我使用根项目并开始替换时,出现以下错误,但我无法的底部。我有点理解这是什么意思,但是我不知道如何将我在数据项目中产生的工件与错误所指的“默认”配置相关联。

> Configure project :core
Substituting for project data

FAILURE: Build failed with an exception.

* Where:
Build file 'D:\Documents\wa-arm-spring-selector\core\build.gradle' line: 115

* What went wrong:
A problem occurred evaluating project ':core'.
> Could not resolve all files for configuration ':core:data'.
   > Could not resolve wa.arm.springselector:data:+.
     Required by:
         project :core
      > Project :core declares a dependency from configuration 'data' to configuration 'default' which is not declared in the descriptor for project :data.

关于如何正确创建该关联的任何想法(我尝试过只是将“数据”项目中的数据配置重命名为“默认”,但这不起作用)或有关如何更好地实现替代的任何想法所以这个问题消失了吗?

0 个答案:

没有答案