使用 grgit 在构建时获取 Gradle 子项目
Fetch Gradle subproject at build time using grgit
如何让 gradle 克隆一个 git 存储库(到当前存储库的子存储库)并将其构建为子项目?
目前我有:
settings.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
,可以自行构建。
我逐渐构建并测试了脚本,首先是克隆操作(效果很好)。当我第一次 运行 完整最终形式的脚本时,子仓库 already/still 在那里,多亏了之前的克隆操作,构建顺利完成。
然而,当我通过简单地删除 contrib
来模拟新构建时,我得到了一个错误:
Cannot evaluate module contrib/dependency/foolib : Configuration with name 'default' not found.
显然,这是由于引用了尚未导入的子项目造成的。我该如何解决这个问题?
我最终按照@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)
(要稍后更新子模块,您可能需要在签出所需的引用之前执行 git fetch
或 git pull
。)
但是请注意,在 git 中使用子模块并非没有陷阱,它很容易破坏您在子模块中所做的更改或无意中恢复到过时的版本。为了避免这些:
- 不要提交子模块(始终提交上游,然后从上游拉取)
- 每次 HEAD 更改(拉、合并、签出等)时,请务必 运行
git submodule update
一篇关于 git 子模块的陷阱的好文章位于:https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/
如何让 gradle 克隆一个 git 存储库(到当前存储库的子存储库)并将其构建为子项目?
目前我有:
settings.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
,可以自行构建。
我逐渐构建并测试了脚本,首先是克隆操作(效果很好)。当我第一次 运行 完整最终形式的脚本时,子仓库 already/still 在那里,多亏了之前的克隆操作,构建顺利完成。
然而,当我通过简单地删除 contrib
来模拟新构建时,我得到了一个错误:
Cannot evaluate module contrib/dependency/foolib : Configuration with name 'default' not found.
显然,这是由于引用了尚未导入的子项目造成的。我该如何解决这个问题?
我最终按照@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)
(要稍后更新子模块,您可能需要在签出所需的引用之前执行 git fetch
或 git pull
。)
但是请注意,在 git 中使用子模块并非没有陷阱,它很容易破坏您在子模块中所做的更改或无意中恢复到过时的版本。为了避免这些:
- 不要提交子模块(始终提交上游,然后从上游拉取)
- 每次 HEAD 更改(拉、合并、签出等)时,请务必 运行
git submodule update
一篇关于 git 子模块的陷阱的好文章位于:https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/