1

如何让 gradle 克隆一个 git 存储库(到当前存储库的子存储库)并将其构建为子项目?

目前我有以下内容:

设置.gradle:

include 'contrib/dependency/foolib'

build.gradle(缩短):

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'org.ajoberstar:gradle-git:0.7.0'
    }
}

apply plugin: 'com.android.application'

import org.ajoberstar.grgit.*

task clone << {
    File dir = new File('contrib/dependency')
    if(!dir.exists()) {
        def grgit = Grgit.clone(dir: dir, uri: 'https://github.com/someone/dependency.git', refToCheckout: 'dev')
    }
    def grgit = Grgit.open(dir)
    grgit.checkout(branch: 'dev')
    grgit.pull(rebase: false)
}


project.afterEvaluate {
    preBuild.dependsOn clone
}


repositories {
    mavenCentral()
}

dependencies {
    compile project(':contrib/dependency/foolib')
}

android {
    // nothing out of the ordinary here, omitting
}

子项目有自己的build.gradle,可以自己构建。

我逐渐构建并测试了脚本,首先是克隆操作(效果很好)。当我第一次以完整的最终形式运行脚本时,由于之前的克隆操作,子存储库已经/仍然存在,并且构建顺利完成。

但是,当我通过简单地删除模拟新构建时contrib,出现错误:

Cannot evaluate module contrib/dependency/foolib : Configuration with name 'default' not found.

显然,这是由对仍待导入的子项目的引用引起的。我该如何解决这个问题?

4

1 回答 1

0

正如@nickb 建议的那样,我最终使用 git 子模块解决了它。

build.gradle(缩短):

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

dependencies {
    compile project(':contrib/dependency/foolib')
}

android {
    // nothing out of the ordinary here, omitting
}

(本质上,我只是删除了所有 grgit 的东西,但将子项目保留为依赖项。)

然后在我的项目目录中我做了:

git submodule add https://github.com/someone/dependency.git contrib/dependency
cd contrib/dependency

# then either (to switch to a different branch):
git checkout -b mybranch origin/mybranch

# or (to check out a particular ref on the current branch):
git checkout deadc0de

# or both of the above (to check out a particular ref on a different branch)

(要稍后更新子模块,您可能需要在签出所需的 ref 之前git fetch或之前进行。)git pull

但是请注意,在 git 中使用子模块并非没有陷阱,这很容易破坏您在子模块中所做的更改或无意中恢复到过时的版本。为了避免这些:

  • 不要提交到子模块(总是提交上游,然后从上游拉)
  • 确保git submodule update每次 HEAD 更改时运行(拉取、合并、结帐等)

一篇关于 git 子模块陷阱的好文章:https ://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/

于 2017-07-23T15:34:21.093 回答