Применить файл Gradle из другого хранилища

У нас есть несколько репозиториев для разных проектов. Существует также git-репозиторий для инфраструктуры. У нас есть пользовательские плагины Gradle, написанные в этом хранилище инфраструктуры, которые мы используем в других хранилищах.

Пример:

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

Здесь у нас есть файл buildscript{}, foo/bar/buildscript.gradle в каждом репозитории Git. Я хочу знать, есть ли способ, где мы можем применить файл непосредственно из хранилища инфраструктуры. Так что любые изменения видны напрямую через другие репозитории.

3 ответа

В этом случае вы можете добавить git поддерево Merging (отличное от git поддерева) к каждому вашему репо, ссылаясь на инфра репо.

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

Вы можете увидеть это исследование в разделе " Управление вложенными библиотеками с помощью рабочего процесса GIT Subtree Merge".

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. Если вы просто хотите обновить свой файл сборки в одном месте и "автоматически" получить изменения во всех репозиториях проекта, то вам, вероятно, следует вывести файл из-под контроля GIT и, например, просто использовать ссылку или что-то подобное для внешнее местоположение.
  2. Второй вариант - переместить все компоненты сборки в общий каталог, сделать этот каталог отдельным разделяемым репозиторием GIT, а затем подключить этот репозиторий ко всем репозиториям ваших проектов, например, как подмодуль. Но в этом случае вы не получите " "автоматические" обновления, потому что git строго связывает содержимое субмодуля с конкретным коммитом в субмодуле и требует запуска git submodule update и последующее git commit получать обновленное содержимое в репозитории вашего проекта. Вариант этого метода git subtree merge предложено @VonC
  3. Если ваша строительная техника достаточно сложна, вы можете подумать о создании "артефакта gradle" и скрыть там сложность. Затем вы можете подключить этот артефакт к своим проектам и полагаться не на конкретную версию артефакта, а на ряд версий.

Предполагая, что Git-репозиторий доступен через HTTP(S), один из вариантов заключается в использовании apply from: "http://...", Обратите внимание, что плагины сценариев, доступ к которым осуществляется через HTTP, в настоящее время не кэшируются, поэтому сборка не удастся, если сценарий не может быть выбран.

Другие вопросы по тегам