Репозиторий программного обеспечения , или сокращенно репо , — это место хранения пакетов программного обеспечения . Часто вместе с метаданными также сохраняется оглавление. Репозиторий программного обеспечения обычно управляется системой контроля версий или менеджерами репозитория. Менеджеры пакетов позволяют автоматически устанавливать и обновлять репозитории, иногда называемые «пакетами».
Многие издатели программного обеспечения и другие организации содержат для этой цели серверы в Интернете либо бесплатно, либо за абонентскую плату. Репозитории могут быть предназначены исключительно для конкретных программ, таких как CPAN для языка программирования Perl , или для всей операционной системы . Операторы таких репозиториев обычно предоставляют систему управления пакетами , инструменты, предназначенные для поиска, установки и иного управления пакетами программного обеспечения из репозиториев. Например, во многих дистрибутивах Linux используется Advanced Packaging Tool (APT), обычно встречающийся в дистрибутивах на основе Debian , или Yellowdog Updater, Modified ( yum ), встречающийся в дистрибутивах на основе Red Hat . Существует также несколько независимых систем управления пакетами, таких как pacman, используемый в Arch Linux , и equo, найденный в Sabayon Linux .
Поскольку репозитории программного обеспечения предназначены для включения полезных пакетов, основные репозитории спроектированы так, чтобы не содержать вредоносных программ . Если компьютер настроен на использование репозитория с цифровой подписью от надежного поставщика и подключен к соответствующей системе разрешений , это значительно снижает угрозу вредоносного ПО для этих систем. Побочным эффектом является то, что многим системам, обладающим этими возможностями, не требуется антивирусное программное обеспечение . [1]
Большинство основных дистрибутивов Linux имеют множество репозиториев по всему миру, которые отражают основной репозиторий.
В корпоративной среде репозиторий программного обеспечения обычно используется для хранения артефактов или для зеркалирования внешних репозиториев, которые могут быть недоступны из-за ограничений безопасности. Такие репозитории могут предоставлять дополнительные функции, такие как контроль доступа, управление версиями, проверки безопасности загруженного программного обеспечения, функциональность кластера и т. д., и обычно поддерживают множество форматов в одном пакете, чтобы удовлетворить все потребности предприятия и, таким образом, стремятся предоставить единую точку истины. Популярными примерами являются JFrog Artifactory, [2] [3] репозиторий Nexus [4] и Cloudsmith, [5] облачный продукт.
На стороне клиента менеджер пакетов помогает устанавливать и обновлять репозитории.
На стороне сервера репозиторий программного обеспечения обычно управляется системой контроля версий или менеджерами репозитория. Некоторые менеджеры репозиториев позволяют объединять другие местоположения репозитория в один URL-адрес и предоставляют прокси-сервер для кэширования. При выполнении непрерывной сборки создается множество артефактов, которые часто хранятся централизованно, поэтому важно автоматически удалять те, которые не были выпущены.
Система управления пакетами отличается от процесса разработки пакетов .
Типичное использование системы управления пакетами — облегчение интеграции кода из различных источников в единую автономную операционную единицу. Таким образом, система управления пакетами может использоваться для создания дистрибутива Linux , возможно, дистрибутива, адаптированного для конкретного ограниченного приложения.
Процесс разработки пакета, напротив, используется для управления совместной разработкой кода и документации набора функций или подпрограмм с общей темой, в результате чего создается пакет программных функций, которые обычно не являются полными и непригодными для использования сами по себе. Хороший процесс разработки пакетов поможет пользователям соблюдать хорошие методы документирования и кодирования, включая некоторый уровень модульного тестирования .
В следующей таблице перечислены несколько языков с репозиториями для сопутствующего программного обеспечения. Столбец «Автопроверки» описывает выполненные плановые проверки.
Очень немногие люди имеют возможность тестировать свое программное обеспечение в нескольких операционных системах с разными версиями основного кода и с другими дополнительными пакетами, которые они могут использовать. Для языка программирования R Comprehensive R Archive Network (CRAN) регулярно проводит тесты.
Чтобы понять, насколько это ценно, представьте себе ситуацию с двумя разработчиками, Салли и Джоном. Салли предоставляет пакет A. Салли запускает текущую версию программного обеспечения только в одной версии Microsoft Windows и тестировала ее только в этой среде. Более или менее регулярно CRAN тестирует вклад Салли в дюжине комбинаций операционных систем и версий основного программного обеспечения на языке R. Если один из них генерирует ошибку, он получает это сообщение об ошибке. Если повезет, подробности сообщения об ошибке могут предоставить достаточную информацию, чтобы разрешить исправление ошибки, даже если она не сможет воспроизвести ее с помощью своего текущего оборудования и программного обеспечения. Далее предположим, что Джон добавляет в репозиторий пакет B, который использует пакет A. Пакет B проходит все тесты и становится доступным для пользователей. Позже Салли представляет улучшенную версию A, которая, к сожалению, нарушает работу B. Автопроверки позволяют предоставить информацию Джону, чтобы он мог решить проблему.
Этот пример демонстрирует как сильные, так и слабые стороны системы внесенных пакетов R: CRAN поддерживает этот вид автоматического тестирования внесенных пакетов, но пакеты, внесенные в CRAN, не должны указывать версии других внесенных пакетов, которые они используют. Существуют процедуры запроса определенных версий пакетов, но участники могут не использовать эти процедуры.
Помимо этого, такой репозиторий, как CRAN, который регулярно проверяет внесенные пакеты, на самом деле предоставляет обширный, хотя и специальный, набор тестов для разрабатываемых версий основного языка. Если Салли (в приведенном выше примере) получает сообщение об ошибке, которое она не понимает или считает неуместным, особенно в разрабатываемой версии языка, она может (и часто так и делает с R) обратиться за помощью к основной команде разработчиков языка. . Таким образом, репозиторий может способствовать улучшению качества программного обеспечения основного языка.
(Части этой таблицы были скопированы из «Списка лучших репозиториев по языкам программирования» на сайте Stack Overflow [23] ).
Многие другие языки программирования, в том числе C , C++ и Fortran , не имеют центрального репозитория программного обеспечения универсального масштаба. Известные репозитории с ограниченным объемом включают:
Менеджеры пакетов помогают управлять репозиториями и их распространением. Если репозиторий обновляется, менеджер пакетов обычно позволяет пользователю обновить этот репозиторий через менеджер пакетов. Они также помогают управлять такими вещами, как зависимости между другими репозиториями программного обеспечения. Некоторые примеры менеджеров пакетов включают в себя:
В рамках жизненного цикла разработки исходный код постоянно встраивается в двоичные артефакты с использованием непрерывной интеграции . Он может взаимодействовать с менеджером двоичных репозиториев так же, как это делает разработчик, получая артефакты из репозиториев и отправляя туда сборки. Тесная интеграция с CI-серверами позволяет хранить важные метаданные, такие как:
Артефакты и пакеты по своей сути означают разные вещи. Артефакты — это просто выходные данные или набор файлов (например, JAR, WAR, DLLS, RPM и т. д.), и один из этих файлов может содержать метаданные (например, файл POM). Принимая во внимание, что пакеты представляют собой один архивный файл в четко определенном формате (например, NuGet ), который содержит файлы, соответствующие типу пакета (например, DLL, PDB). [32] Многие артефакты возникают в результате сборок, но и другие типы тоже имеют решающее значение. Пакеты — это, по сути, одно из двух: библиотека или приложение. [33]
По сравнению с исходными файлами бинарные артефакты часто на порядки крупнее, их редко удаляют или перезаписывают (за исключением редких случаев, таких как снимки или ночные сборки), и они обычно сопровождаются большим количеством метаданных, таких как идентификатор, имя пакета, версия. , лицензия и многое другое.
Метаданные описывают двоичный артефакт, хранятся и указываются отдельно от самого артефакта и могут иметь несколько дополнительных применений. В следующей таблице показаны некоторые распространенные типы метаданных и их использование: