2017-02-13 78 views
1

我意识到有很多关于Gradle设置的帖子。这就是说,我研究了很多,没有找到我正在寻找的东西,或者我使用了不正确的术语来做到这一点。我正在使用Gradle版本3.3。Gradle依赖于另一个项目失败的模块

所以我有多个Gradle项目,每个项目都是单独维护的。没有主Gradle项目。每个项目都有自己的模块,构建和设置文件。其结构如下:

Projects 
    A 
    a1 
     build.gradle 
    a2 
     build.gradle 
    build.gradle 
    settings.gradle 
    B 
    b1 
     build.gradle 
    b2 
     build.gradle 
    build.gradle 
    settings.gradle 

我试图做的是让B依赖于A的模块。我们假设B中的一个模块依赖于a1。在B的设置,我已经做了以下内容:

rootProject.name = 'B' 
rootProject.setProjectDir(new File(".") 

include 'a1' 
project(':a1').setProjectDir(new File(settingsDir.getParentFile(), "/A/a1")) 

我存储的版本号的方式是通过在内线封盖每个项目的文件的build.gradle。然后我通过这个项目访问它们。下面是B的build文件的外观:

ext { 
    freemarkerVersion = '2.3.19' 
} 

dependencies { 
    compile project(':a1') 
    compile group: 'org.freemarker', name: 'freemarker', version: rootProject.properties.get('freemarkerVersion') 
} 

我所看到的是B能够解决其依赖关系,并试图编译项目A1,但它是使用B的版本号,而不是的。我通过在具有不同版本号的两个项目中添加通用依赖项来验证这一点。使用B的版本显示依赖关系。我也在B中更改了版本号,并进一步证实了这一点。因此,如果我可以在他们自己的build.gradle文件中获得任何与项目相关的版本的帮助,那就太棒了!

编辑:更新后,找出以前的问题是从相对路径不解决。

回答

0

不要嘟my我自己的号角或任何东西,但我发布了我提出的解决方案,因为我没有其他答案敲我的门。

我做的第一件事是将我的所有版本属性移动到外部gradle.properties文件中,而不是在项目的build.gradle文件中的ext闭包中。这样做时,项目会在从其自己的上下文编译时默认加载属性文件。它当然会被user.home gradle.properties文件覆盖,所以记住这一点。例如gradle.properties:

a_freemarkerVersion = 2.3.19 

当使用来自另一个项目一个项目的模块,你需要一种方法来分别把两者联系起来,从而可以摇篮解决依赖的属性。我通过定义加载所需项目的属性文件的方法来实现此目的。这种方法看起来像这样:

def addConfig(String parent, String filename) { 
    Properties props = new Properties() 
    props.load(new FileInputStream(new File(project.projectDir.getParent(), "/${parent}/${filename}"))) 
    props.each { prop -> 
     project.ext.set(prop.key, prop.value) 
    } 
} 

addConfig("A", "gradle.properties") 

所有这些方法确实是上升一个目录,进入指定的项目,并检索其gradle.properties文件并加载这些变量到当前项目的属性。说到这里,有一点需要注意:如果你在两者中定义了相同的变量,其中一个将被覆盖。为了避免这种情况,我只是用项目名称和下划线前缀所有变量。这将保证他们永远不会相互冲突。

我访问的变量与此语法所有项目:

dependencies { 
    compile group: 'org.freemarker', name: 'freemarker', version: "${a_freemarkerVersion}" 
} 

设置的其余部分是我在战后初期定义的相同。只要确保包含依赖模块,指定其项目目录,并从项目的依赖关系中编译该项目。

相关问题