从不同的存储库应用gradle文件

时间:2014-07-12 04:35:42

标签: git gradle

我们为不同的项目提供了多个git存储库。还有一个用于基础架构目的的git存储库。我们在此基础结构存储库中编写了自定义gradle插件,我们在其他存储库中使用

示例:

buildscript {
    apply from: 'foo/bar/devinfra-buildscript.gradle', to: buildscript
}
apply plugin: 'devinfra'

这里我们在每个Git存储库中都有buildscript {}文件,foo / bar / buildscript.gradle。我想知道是否有一种方法可以直接从基础架构存储库中应用该文件。这样就可以直接在其他存储库中看到任何更改。

3 个答案:

答案 0 :(得分:15)

在这种情况下,你可以在你的每个仓库中添加一个git subtree Merging(不同于git子树),参考infra repo。

git read-tree --prefix=<subdirectory_name>/ –u <shared_library_branch>

你可以在“Managing Nested Libraries Using the GIT Subtree Merge Workflow”中看到一项研究。

http://www.typecastexception.com/image.axd?picture=Subtree%20Illustration_thumb_1.png

在你的情况下:

cd /path/to/project
git remote add infrarepo /url/to/infra/repo
git fetch infrarepo
git checkout -b infra infrarepo/master

git checkout master
git read-tree --prefix=infra/ –u infra
git commit -m "Add Infra subtree"

使用子树更改更新项目仓库:

git checkout infra
git pull
git checkout master
git merge --squash –s subtree –-no-commit infra
git commit -m "update infra"

要更改子项目录,并更改项目仓库的子树文件夹:

git checkout infra
git merge --squash –s subtree --no-commit master
git commit -m "(infra subtree) nature of changes"

git push infrarepo infra

答案 1 :(得分:5)

答案取决于你将要实现的目标。

  1. 如果您只是想在一个地方更新您的构建文件并“自动”接收所有项目回购中的更改,那么您可能应该从GIT控件中取出该文件,例如,只需使用链接或类似的东西到外面的位置。
  2. 第二个选项是将所有构建内容移动到公共目录中,使该目录成为可分离的可共享GIT存储库,然后在所有项目存储库中插入该存储库,例如:作为submodule但在这种情况下,您将不会收到“自动”更新,因为git严格将子模块内容绑定到子模块中的特定提交,而不需要运行git submodule update和后续git commit接收项目回购中的更新内容。此方法的变体是@VonC
  3. 提出的git subtree merge
  4. 如果您的构建机制足够复杂,您可能需要考虑创建“gradle artifact”并隐藏其中的复杂性。然后,您可以将该工件插入到您的项目中,而不是依赖于工件的特定版本,而是依赖于一系列版本

答案 2 :(得分:2)

假设可以通过HTTP(S)访问Git存储库,一个选项是使用apply from: "http://..."。请注意,通过HTTP访问的脚本插件当前未被缓存,因此如果无法获取脚本,则构建将失败。