Эта проблема имеет несколько осей - сборка исходного кода, установка пакета, внешние репозитории, разрывы api / abi, сборка самой системы.
Прежде всего, ваши требования - вас интересует только упаковка и / или также установка.
Для самой упаковки можно использовать, например, следующие системы упаковки: nuget, conan, vcpkg, choco
.
Скорее всего, вам также будет интересно не только опубликовать сами пакеты, но и отладочные символы для них.
Для azure документация по публикации devops / debug символов может быть найдена, например, по следующим ссылкам:
https://azure.microsoft.com/en-us/blog/deep-dive-into-azure-artifacts/ https://docs.microsoft.com/en-us/nuget/create-packages/symbol-packages-snupkg
В настоящее время Conan (упаковка c ++) не поддерживает публикацию символов: https://github.com/conan-io/conan/issues/4047
Для получения исходного кода можно использовать саму git. Подмодули Git позволяют создавать внешние ссылки на репозиторий git, но как только вы добавили внешний подмодуль, вам нужно использовать двойную фиксацию, чтобы изменить все - один git коммит в суб-репозиторий, один git коммит для обновления, на который ссылаются git га sh из главного репозитория.
Действительно, существуют некоторые способы решения этой проблемы, такие как: вложенные git без подмодулей:
вложенные git репозитории без подмодулей ?
=>
http://debuggable.com/posts/git-fake-submodules: 4b563ee4-f3 cc -4061-967e-0e48cbdd56cb
Если вы строите однако основной репозиторий с предварительно собранными двоичными файлами вместо исходных кодов - в идеальном решении вам не нужен этот внешний репозиторий git, а это означает, что не требуется git клонирование / извлечение внешнего репозитория.
Тогда это также можно иметь либо all-in-one solution
, либо несколько решений, каждое из которых скомпилировано отдельно.
Действительно, проще иметь all-in-one solution
, поскольку с зависимыми решениями меньше проблем ilation.
Для создания полностью динамического c решения можно, например, использовать cmake - он может генерировать решение в зависимости от предварительно сконфигурированных опций, используемых в cmake. (См. Cmake "option"
).
cmake действительно хорошая альтернатива для C ++ (поддерживает предварительно скомпилированный заголовок, ускоряет построение единиц), но может быть не так просто для C# (сложно найти необходимые параметры для настройки это правильно).
На данный момент (5.2020) не нашли лучшей альтернативы cmake, но существует множество инструментов и экосистем, развивающихся параллельно cmake, поэтому необходимо следить за тем, что может принести будущее.
Тогда по поводу упаковки. choco, кажется, является подмножеством nuget - он расширяет unspe c своими собственными xml тегами, поддерживающими обновление программного обеспечения. (ссылки на веб-страницы: https://chocolatey.org/, https://docs.microsoft.com/en-us/nuget/reference/nuspec)
Если вы хотите опубликовать sh пакет nuget или даже пакет установщика, можно использовать хранилище nuget (без каких-либо дополнительных затрат).
Если этого недостаточно для вас, возможно также обновить сервер nuget до сервера choco, но это может стоить чего-то - см. шоколадные веб-страницы.
Api Разрывы / abi не могут наблюдаться на любом уровне, пока не произойдет ошибка компиляции / ссылки или не произойдет сбой приложения во время выполнения - единственная альтернатива, которую это возможно сделать, - это управление версионированием самой упаковки - так, чтобы версия основного пакета nuget (или choco) требуется более высокая версия зависимой версии nuget (или choco).
Если основной репозиторий разрабатывается теми же парнями, что и дочерний репозиторий, - то разрывы api / abi могут выполняться самим разработчиком, но если два git независимы от каждого другие и разрабатываются разными командами - тогда перерывы api / abi могут произойти в любой момент времени.
Лучший способ достичь То, что репозитории являются согласованными, - это проведение модульного тестирования в главном репозитории, которое будет проверять, не происходит ли разрыв api / abi.
Теоретически, если происходят разрывы api / abi - сама система сборки может продолжаться с двумя альтернативами сборки. -
- следовать за основным хранилищем с последним работающим дочерним хранилищем
- следовать за дочерним хранилищем без создания основного хранилища
Та же самая механика может быть применена с использованием веток, например
- "main git: основная ветка" + "child git: ветка release / 1.0 "
- " child git: ветка master "
Этот механизм может потребовать наблюдения не только двух репозиториев, но и переключения ветвей в случае длительных сбоев. (Например, команда разработчиков child git не заботится о сбоях сборки, происходящих в main git)
Подозреваю, что для этого не существует готовых инструментов (пожалуйста, оставьте комментарий, если таковые появятся), поскольку для этого может потребоваться переподключение инструментов из двух потенциально разных цепочек сборки из потенциально разных репозиториев git, из потенциально разных организаций.
И последнее, но не менее важное - если вы хотите, чтобы ваше приложение поддерживало обновление программного обеспечения - тогда Загрузка дистрибутива nuget / choco может использоваться с дополнительным сервером nuget / choco.
Вот хороший пример части загрузки для пакета nuget: https://github.com/mwrock/NugetDownloadFeed
Установка сборки пакета немного более сложный вопрос - см., например, следующие ссылки:
(В порядке лучше-хуже на мой взгляд)