从不同的仓库申请gradle文件

我们有不同的项目的多个git存储库。 还有一个用于基础设施的git仓库。 我们有定制的gradle插件写在这个基础设施仓库中,我们在其他仓库中使用

例:

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

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

在这种情况下,你可以添加一个Git子树合并 (不同于Git子树)到你的每个仓库,指的是红外回购。

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

您可以在“ 使用GIT子树合并工作streampipe理嵌套库 ”中看到这样的研究。

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. 如果你只是想在一个地方更新你的构build文件,并且“自动地”接收所有项目回购中的变化,那么你可能应该把文件从GIT控制中拿出来,例如,简单地使用一个链接或类似的东西外部位置。
  2. 第二个选项是将所有的构build工具移动到一个公共目录中,将该目录设置为一个单独的可共享GIT存储库,然后在所有项目的回收站中插入该存储库,例如作为子模块。但在这种情况下,您将不会收到“ automagical“更新,因为git将子模块内容严格地绑定到子模块中的特定提交,并且不需要运行git submodule update和随后的git commit来接收项目回购中更新的内容。 这种方法的变种是由@VonC提出的git subtree merge
  3. 如果您的构build机器足够复杂,您可能需要考虑创build一个“gradle artifact”并隐藏其中的复杂性。 然后,您可以将这个工件插入到您的项目中,而不是依赖某个特定版本的工件,而是依赖于一系列版本

假设Git仓库可以通过HTTP(S)访问,一个select是使用apply from: "http://..." 。 请注意,通过HTTP访问的脚本插件目前不被caching,因此如果无法获取脚本,构build将失败。