Применить файл 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".
В твоем случае:
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
Ответ зависит от того, что именно вы собираетесь достичь.
- Если вы просто хотите обновить свой файл сборки в одном месте и "автоматически" получить изменения во всех репозиториях проекта, то вам, вероятно, следует вывести файл из-под контроля GIT и, например, просто использовать ссылку или что-то подобное для внешнее местоположение.
- Второй вариант - переместить все компоненты сборки в общий каталог, сделать этот каталог отдельным разделяемым репозиторием GIT, а затем подключить этот репозиторий ко всем репозиториям ваших проектов, например, как подмодуль. Но в этом случае вы не получите " "автоматические" обновления, потому что git строго связывает содержимое субмодуля с конкретным коммитом в субмодуле и требует запуска
git submodule update
и последующееgit commit
получать обновленное содержимое в репозитории вашего проекта. Вариант этого методаgit subtree merge
предложено @VonC - Если ваша строительная техника достаточно сложна, вы можете подумать о создании "артефакта gradle" и скрыть там сложность. Затем вы можете подключить этот артефакт к своим проектам и полагаться не на конкретную версию артефакта, а на ряд версий.
Предполагая, что Git-репозиторий доступен через HTTP(S), один из вариантов заключается в использовании apply from: "http://..."
, Обратите внимание, что плагины сценариев, доступ к которым осуществляется через HTTP, в настоящее время не кэшируются, поэтому сборка не удастся, если сценарий не может быть выбран.