Программы        26.01.2024   

Что такое репозиторий в linux. Настройка репозиториев Ubuntu. Как добавить новый репозиторий в Cydia

Репозиторий

Репозито́рий, хранилище - место, где хранятся и поддерживаются какие-либо данные. Чаще всего данные в репозитории хранятся в виде файлов, доступных для дальнейшего распространения по сети .

Существуют репозитории для хранения программ, написанных на одном языке (например, CPAN для Perl) или предназначенных для одной платформы. Многие современные операционные системы, такие как OpenSolaris , FreeBSD и большинство дистрибутивов Linux , имеют официальные репозитории, но также позволяют устанавливать пакеты из других мест. Большинство репозиториев бесплатны, однако некоторые компании предоставляют доступ к собственным репозиториям за платную подписку.

Репозитории используются в системах управления версиями , в них хранятся все документы вместе с историей их изменения и другой служебной информацией. Русское сообщество Subversion рекомендует использовать вместо термина репозиторий термин хранилище , поскольку он полностью соответствует как прямому переводу слова «repository», так и его понятию.

Существуют различные автоматизированные системы создания репозиториев. Один из типов репозиториев: хранилища на /DVD - установочные диски для пакетов того или иного ПО .

См. также

Ссылки


Wikimedia Foundation . 2010 .

Смотреть что такое "Репозиторий" в других словарях:

    Место, где хранятся и поддерживаются какие либо данные. Чаще всего данные в репозитории хранятся в виде файлов, доступных для дальнейшего распространения по сети. Репозитории используются в системах управления версиями, в них хранятся все… … Словарь бизнес-терминов

    репозиторий - Хранилище объектов баз данных. Тематики информационные технологии в целом EN repository …

    - (истор., лат. repono, repositum возвращать на место, вправлять) акушерский инструмент, применявшийся для вправления выпавшей петли пуповины … Большой медицинский словарь

    Репозиторий: (англ. repository склад, хранилище) Репозиторий См. также Репозиторий Юкка Маунтин американское сухое хранилище отработанного ядерного топлива … Википедия

    репозиторий программных пакетов (репозиторий) - 3.17 репозиторий программных пакетов (репозиторий): Замкнутая совокупность программных пакетов и метаинформации о них. Репозиторий называется замкнутым, если для каждого бинарного пакета можно вычислить его замыкание, т.е. можно установить пакет… … Словарь-справочник терминов нормативно-технической документации

    Юкка Маунтин … Википедия

    У этого термина существуют и другие значения, см. Сизиф (значения). Сизиф персонаж греческой мифологии. Сизиф (… Википедия

    центральный репозиторий - центральная система хранения Данная система предназначена для хранения различных данных, включая биографии спортсменов, количество медалей, расписание мероприятий, отчеты о транспортном обслуживании и информацию о посетителях. [Департамент… … Справочник технического переводчика

    Институциональный репозитарий электронный архив для длительного хранения, накопления и обеспечения долговременного и надежного открытого доступа к результатам научных исследований, проводимых в учреждении. Университетский институциональный… … Википедия

    Репозиторий место, где хранятся и поддерживаются какие либо данные. Чаще всего данные в репозитории хранятся в виде файлов, доступных для дальнейшего распространения по сети. Примером репозитория может служить репозиторий свободного программного… … Википедия

Книги

  • Ruby on Rails для начинающих. Изучаем разработку веб-приложений на основе Rails , Хартл Майкл. Ruby on Rails, используемый самыми разными компаниями, такими как Twitter, GitHub, Disney и Yellow Pages, - один из наиболее популярных фреймворков для разработки веб-приложений, но его…

Приветствую Всех!

В прошлой статье мы разобрались как установить обновления и дополнительные программы из официальных репозиториев Linux Ubuntu Как установить обновления и дополнительные программы для Linux Ubuntu!

Что же такое Linux репозитории.
Репозито́рий Linux, хранилище - место, где хранятся и поддерживаются какие-либо данные. Чаще всего данные в репозитории хранятся в виде файлов, доступных для дальнейшего распространения по сети.

Поскольку репозитории Linux расположены в интернете, существует вероятность подмены репозитория злоумышленником на свой, содержащий модифицированные пакеты. Многие репозитории имеют защиту от подмены.

Защита реализована при помощи сверки цифровых подписей Linux репозитория и клиента.

Доверенными Linux репозиториями считаются репозитории, которые имеет цифровую подпись, а пользовательский компьютер содержит открытый ключ для этого репозитория.

В Linux Ubuntu по умолчанию доверенными являются репозитории на установочных дисках и основные интернет репозитории - archive.ubuntu.com. При наличии на компьютере нескольких подключенных Linux репозиториев, предпочтение отдается доверенным.

При подключении Linux репозитория, защищенного цифровой подписью, нужно скачать открытый ключ и добавить его в систему. Иногда для скачивания предоставляется доступный для установки пакет, который при своей установке сам прописывает ключ репозитория. Если вы скачиваете ключ с сайта репозитория Linux, то вы получите обычный файл с расширением.key, .gpg или другим.

Для закрепления теории рассмотрим на практике добавление дополнительного Linux репозитория на примере бесплатной кроссплатформенной виртуальной машине Oracle VirtualBox версии 5.0

Открываем терминал для работы в командной строке ()

Для редактирования файла /etc/apt/sources.list в командной строке набираем (mcedit-текстовый редактор, как его установить смотрите )

sudo mcedit /etc/apt/sources.list

Для получения дополнительных привилегий необходимо ввести пароль пользователя и нажать на клавиатуре клавишу «Enter».

В конец файла добавляем строку
deb http://download.virtualbox.org/virtualbox/debian trusty contrib

Для сохранения внесенных изменений нажимаем на клавиатуре клавишу «F2» и подтверждаем перезапись файла нажав кнопку «Сохранить».

Для возвращения в командную строку выйдем из файла, нажав на клавиатуре клавишу «F10».
Следующим шагом скачаем открытый ключ и добавим его к себе в систему.
Для этого копируем следующую строку

sudo wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -

и нажимаем на клавиатуре клавишу «Enter».

После добавления ключа получаем ответ, что все хорошо.

Мы рассмотрели как добавить новый Linux репозиторий и открытый ключ. В дальнейшем вы сможете добавлять новые репозитории Linux самостоятельно. Всю необходимую информацию Вы сможете найти на сайте разработчика этого программного обеспечения.
Для того чтобы установить VirtualBox версии 5.0. необходимо обновить списки пакетов (как это сделать смотрите ) и только после этого запустить установку (как это сделать смотрите )
В командной строке необходимо набрать следующую строку
sudo apt-get install virtualbox-5.0
и нажать на клавиатуре клавишу «Enter».

Для того чтобы запустить программу virtualbox-5.0. нажимаем на значок в левом верхнем углу экрана «Поиск на компьютере...»
В поисковой строке вводим «virt»
И выбираем программу «Oracle VM VirtualBox» кликнув левой кнопки мыши.

Для того, чтобы посмотреть версию установленной программы, в верхней панели выбираем «Справка», «О программе»

Видим, что у нас установлена программа VirtualBox Версия 5.10 r104061

О том, как работать с VirtualBox мы рассматривали в статье
Установка и настройка программы для работы с виртуальными машинами – Oracle VirtualBox)

Для того, чтобы каждый раз не искать необходимую программу, мы можем закрепить ее на панели. Для этого щелкаем правой кнопкой мыши на значке и выбираем «Закрепить на панели»

После закрытия программы значок остается на панели.

Данным способом вы можете закреплять на панели необходимые вам программы.

Теперь рассмотрим, как устанавливать программы из пакетов.
Программу VirtualBox можно также установить и из пакета, скачав его с официального сайта. Минус данного способа, что все дальнейшие обновления нам придется также устанавливать вручную, пока не добавим к себе в систему Linux репозиторий VirtualBox.

Но не у всех программ есть репозиторий Linux. И эти программы можно устанавливать и обновлять только вручную. Ярким примером является Skype.

Для установки скачиваем пакет с официального сайта. Так как нет пакета для нашей версии 14.04, то выбираем ближайший 12.04.

Соглашаемся и сохраняем файл.

Выбираем загруженный файл и указываем открыть папку со скачанным файлом.

Обычно все загруженные файлы сохраняются в домашней директории пользователя в папке «Загрузки».

Щелкаем правой кнопкой мыши на значке и выбираем «Открыть с помощью «Центр приложений»».

Откроется центр приложений. Для установки пакета нажимаем кнопку «Установить».

Начнется процесс установки. Об этом нам сообщает центр приложений Linux Ubuntu в верхней части окна и слева в виде шкалы загрузки.

Для установки дополнительных программ для Linux Ubuntu нам потребуются дополнительные привилегии.
Для их получения система просит нас ввести наш пароль. Вводим его и нажимает кнопку «Аутентифицировать»

После окончания установки откроем Skype. Нажимаем на значок в левом верхнем углу экрана «Поиск на компьютере...»
В поисковой строке введем «sky»

Настройка Skype в Windows и Linux немного отличаются, но я думаю, что настройка не вызовет у вас каких-то сложностей, если вы будете руководствоваться вышеуказанной статьей. Но если они все-таки возникнут, то вы всегда можете задать мне вопрос.

Мы рассмотрели как добавить дополнительные Linux репозитории и установить программу из пакета. Теперь вы сможете сами устанавливать требуемые вам программы в Linux Ubuntu. И если остались непонятные вопросы по данной теме и есть предложения, то прошу их писать в комментариях. Всем пока!

Repository commonly refers to a storage location, often for safety or preservation.
- Wikipedia

Вот как Википедия описывает репозиторий. Так уж случилось, что в отличие от некоторых других жаргонных словечек, с которыми мы имеем дело, этот термин прекрасно передает свою суть. Репозиторий представляет собой концепцию хранения коллекции для сущностей определенного типа.

Репозиторий как коллекция

Вероятно, наиболее важным отличием репозиториев является то, что они представляют собой коллекции объектов. Они не описывают хранение в базах данных или кэширование или решение любой другой технической проблемы. Репозитории представляют коллекции. Как вы храните эти коллекции - это просто деталь реализации.

Я хочу внести ясность в этот вопрос. Репозиторий - это коллекция. Коллекция, которая содержит сущности и может фильтровать и возвращать результат обратно в зависимости от требований вашего приложения. Где и как он хранит эти объекты является ДЕТАЛЬЮ РЕАЛИЗАЦИИ.

В мире PHP мы привыкли к циклу запрос/ответ, который оканчивается смертью процесса. Все, что пришло извне и не сохранилось - ушло навсегда, в этой точке. Так вот, не все платформы работают именно так.

Хорошим способом понять как работают репозитории является представление вашего приложения постоянно работающим, в этом случае все объекты остаются в памяти. Вероятность критических сбоев и реакцию на них в этом эксперименте можно пренебречь. Представьте, что у вас есть Singleton-экземпляр репозитория для сущностей Member , MemberRepository .

Затем создайте новый объект Member и добавьте его в репозиторий. Позже, вы запросите у репозитория все элементы, хранящиеся в нем, таким образом вы получите коллекцию, которая содержит этот объект внутри. Возможно вы захотите получить какой-то конкретный объект по его ID, это также возможно. Очень легко представить себе, что внутри репозитория эти объекты хранятся в массиве или, что еще лучше, в объекте-коллекции.

Проще говоря, репозиторий - это особый вид надежных коллекций, которые вы будете использовать снова и снова, чтобы хранить и фильтровать сущности.

Взаимодействие с Репозиторием

Представьте, что мы создаем сущность Member . Мы приводим объект к необходимому состоянию, затем запрос заканчивается и объект исчезает. Пользователь пытается авторизоваться в нашем приложении и не может. Очевидно, что нам необходимо сделать этот объект доступным и для других частей приложения.

$member = Member::register($email, $password); $memberRepository->save($member);
Теперь мы можем получить доступ к объекту позже. Примерно так:

$member = $memberRepository->findByEmail($email); // or $members = $memberRepository->getAll();
Мы можем хранить объекты в одной части нашего приложения, а затем извлекать их из другой.

Должны ли репозитории создавать сущности?

Вы можете встретить такие примеры:

$member = $memberRepository->create($email, $password);
Я видел множество аргументов приводящихся в пользу этого, но совершенно не заинтересован в подобном подходе.

Прежде всего, репозитории - это коллекции. Я не уверен в том, зачем коллекция должна быть коллекцией и фабрикой. Я слышал аргументы вроде «если обращаться удобнее так, то почему бы не повесить обработчик на подобные действия» ?

На мой взгляд, это анти-паттерн. Почему бы не позволить классу Member , иметь свое собственное понимание как и зачем создается объект или почему бы не сделать отдельную фабрику для создания более сложных объектов?

Если мы относимся к нашим репозиториям как к простым коллекциям, так значит и не нужно нагружать их лишним функционалом. Я не хочу классов коллекций, которые ведут себя как фабрики.

В чем выгода использования репозиториев?

Основное преимущество репозиториев - это абстрактный механизм хранения для коллекций сущностей.

Предоставляя интерфейс MemberRepository мы развязываем руки разработчику, который уже сам решит как и где хранить данные.

Class ArrayMemberRepository implements MemberRepository { private $members = ; public function save(Member $member) { $this->members[(string)$member->getId()] = $member; } public function getAll() { return $this->members; } public function findById(MemberId $memberId) { if (isset($this->members[(string)$memberId])) { return $this->

Class RedisMemberRepository implements MemberRepository { public function save(Member $member) { // ... } // you get the point }
Таким образом, большинство наших приложений знает только абстрактное понятие MemberRepository и его использование может быть отделено от фактической реализации. Это очень раскрепощает.

К чему относятся репозитории: Domain или Application Service Layer?

Итак, вот интересный вопрос. Во-первых, давайте определим, что Application Service Layer - это многоуровневая архитектура, которая отвечает за специфические детали реализации приложения, такие как целостность базы данных, и различные реализации работы с интернет-протоколами (отправка электронной почты, API) и др.

Определим термин Domain Layer как слой многоуровневой архитектуры, которая отвечает за бизнес-правила и бизнес-логику.

Куда же попадет репозиторий при таком подходе?

Давайте посмотрим на нашем примере. Вот код, написанный ранее.

Class ArrayMemberRepository implements MemberRepository { private $members = ; public function save(Member $member) { $this->members[(string) $member->getId()] = $member; } public function getAll() { return $this->members; } public function findById(MemberId $memberId) { if (isset($this->members[(string)$memberId])) { return $this->members[(string)$memberId]; } } }
В этом примере я вижу много деталей реализации. Они, несомненно, должны входить в слой приложения

А теперь давайте удалим все детали реализации из этого класса…

Class ArrayMemberRepository implements MemberRepository { public function save(Member $member) { } public function getAll() { } public function findById(MemberId $memberId) { } }
Хм… это начинает выглядеть знакомо… Что же мы забыли?

Возможно, получившийся код напоминает вам это?

Interface MemberRepository { public function save(Member $member); public function getAll(); public function findById(MemberId $memberId); }
Это означает, что интерфейс находится на границе слоев. и на самом деле может содержать доменно-специфические концепты, но сама реализация не должна этого делать.

Интерфейсы репозиториев принадлежат к слою домена. Реализация же относятся к слою приложения. Это означает, что мы свободны при построении архитектуры на уровне доменного слоя без необходимости зависеть от слоя сервиса.

Свобода смены хранилищ данных

Всякий раз, когда вы слышите чей-то разговор о концепции объектно-ориентированного дизайна, вы, наверное, могли слышать что-то вроде "… и у вас есть возможность поменять одну реализацию хранения данных на другую в будущем..."

По-моему, это не совсем правда… я бы даже сказал, что это очень плохой аргумент. Самой большой проблемой объяснения концепции репозиториев является то, что сразу напрашивается вопрос «вы действительно хотите это делать?» . Я НЕ хочу чтобы подобные вопросы влияли на использование паттерна репозитория.

Любое достаточно хорошо спроектированное объектно-ориентированное приложение автоматически подходит под приведенное преемущество. Центральной концепцией ООП является инкапсуляция. Вы можете предоставить доступ к API и скрыть реализацию.

Ведь вы же на самом деле не будете переключаться с одного ORM на другой и обратно. Но даже если вы захотите так делать, то, по крайней мере, у вас будет возможность сделать это. Однако, замена реализации репозитория будет огромным плюсом при тестировании.

Тестирование при использовании паттерна «Репозиторий»

Ну, тут все просто. Давайте предположим, что у вас есть объект, который обрабатывает что-то вроде регистрации участников…

Class RegisterMemberHandler { private $members; public function __construct(MemberRepository $members) { $this->members = $members; } public function handle(RegisterMember $command) { $member = Member::register($command->email, $command->password); $this->members->save($member); } }
Во время очередной операции, я могу взять экземпляр DoctrineMemberRepository . Однако, во время тестирования легко можно заменить его на экземпляр ArrayMemberRepository. Они оба реализуют один и тот же интерфейс.

Упрощенный пример теста может выглядеть примерно так…

$repo = new ArrayMemberRepository; $handler = new RegisterMemberHandler($repo); $request = $this->createRequest(["email" => "[email protected]", "password" => "angelofdestruction"]); $handler->handle(RegisterMember::usingForm($request)); AssertCount(1, $repo->findByEmail("[email protected]"));
В этом примере мы тестируем обработчик. Нам не нужно проверять корректность хранения данных репозитория в БД (или еще где). Мы тестируем конкретное поведение этого объекта: регистрируем пользователя на основе данных формы, а затем передаем их в репозиторий.

Коллекция или Состояние

В книге Implementing Domain-Driven Design Vaughn Vernon делает различие между типами репозиториев. Идея коллекцио-ориентированного репозитория (ориг. - collection-oriented repository) в том, что работа с репозиторием идет в памяти, как с массивом. Репозиторий, ориентированный на хранение состояний (ориг. - persistence-oriented repository) содержит в себе идею, что в нем будет какая-то более глубокая и продуманная система хранения. По сути различия лишь в названиях.

// collection-oriented $memberRepository->add($member); // vs persistence-oriented $memberRepository->save($member);
Замечу, что это лишь мое мнение и пока что я придерживаюсь именно его в вопросах использования репозиториев. Однако, хотел бы предупредить, что возможно могу передумать. В конце-концов, я сосредотачиваюсь на них как на коллекциях объектов с теми же обязанностями, что и у любого другого объекта-коллекции.

Дополнительная информация

создал проект на Github о репозиториях на который, безусловно, стоит посмотреть. Внутри вы найдете примеры работы с хранением в памяти и файлах.

Итоги

Я считаю, что…
  1. … важно дать репозиториям сингулярную задачу функционировать как коллекция объектов.
  2. … мы не должны использовать репозитории для создания новых экземпляров объектов.
  3. … мы должны избегать использования репозиториев как способа перехода от одной технологии к другой, так как они имеют очень много преимуществ, от которых трудно отказаться.
В будущем я планирую написать еще несколько статей о репозиториях, таких как кэширование результатов с помощью декоратора, запросов с помощью паттерна критерия, роли репозитория в обработке пакетных операций на большом количестве объектов.

Если у вас есть вопросы или если ваше мнение отличается от моего, пожалуйста, пишите комментарии ниже.

Как всегда, я намерен обновлять статью, чтобы синхронизировать ее с моим текущим мнением.

Repository commonly refers to a storage location, often for safety or preservation.
- Wikipedia

Вот как Википедия описывает репозиторий. Так уж случилось, что в отличие от некоторых других жаргонных словечек, с которыми мы имеем дело, этот термин прекрасно передает свою суть. Репозиторий представляет собой концепцию хранения коллекции для сущностей определенного типа.

Репозиторий как коллекция

Вероятно, наиболее важным отличием репозиториев является то, что они представляют собой коллекции объектов. Они не описывают хранение в базах данных или кэширование или решение любой другой технической проблемы. Репозитории представляют коллекции. Как вы храните эти коллекции - это просто деталь реализации.

Я хочу внести ясность в этот вопрос. Репозиторий - это коллекция. Коллекция, которая содержит сущности и может фильтровать и возвращать результат обратно в зависимости от требований вашего приложения. Где и как он хранит эти объекты является ДЕТАЛЬЮ РЕАЛИЗАЦИИ.

В мире PHP мы привыкли к циклу запрос/ответ, который оканчивается смертью процесса. Все, что пришло извне и не сохранилось - ушло навсегда, в этой точке. Так вот, не все платформы работают именно так.

Хорошим способом понять как работают репозитории является представление вашего приложения постоянно работающим, в этом случае все объекты остаются в памяти. Вероятность критических сбоев и реакцию на них в этом эксперименте можно пренебречь. Представьте, что у вас есть Singleton-экземпляр репозитория для сущностей Member , MemberRepository .

Затем создайте новый объект Member и добавьте его в репозиторий. Позже, вы запросите у репозитория все элементы, хранящиеся в нем, таким образом вы получите коллекцию, которая содержит этот объект внутри. Возможно вы захотите получить какой-то конкретный объект по его ID, это также возможно. Очень легко представить себе, что внутри репозитория эти объекты хранятся в массиве или, что еще лучше, в объекте-коллекции.

Проще говоря, репозиторий - это особый вид надежных коллекций, которые вы будете использовать снова и снова, чтобы хранить и фильтровать сущности.

Взаимодействие с Репозиторием

Представьте, что мы создаем сущность Member . Мы приводим объект к необходимому состоянию, затем запрос заканчивается и объект исчезает. Пользователь пытается авторизоваться в нашем приложении и не может. Очевидно, что нам необходимо сделать этот объект доступным и для других частей приложения.

$member = Member::register($email, $password); $memberRepository->save($member);
Теперь мы можем получить доступ к объекту позже. Примерно так:

$member = $memberRepository->findByEmail($email); // or $members = $memberRepository->getAll();
Мы можем хранить объекты в одной части нашего приложения, а затем извлекать их из другой.

Должны ли репозитории создавать сущности?

Вы можете встретить такие примеры:

$member = $memberRepository->create($email, $password);
Я видел множество аргументов приводящихся в пользу этого, но совершенно не заинтересован в подобном подходе.

Прежде всего, репозитории - это коллекции. Я не уверен в том, зачем коллекция должна быть коллекцией и фабрикой. Я слышал аргументы вроде «если обращаться удобнее так, то почему бы не повесить обработчик на подобные действия» ?

На мой взгляд, это анти-паттерн. Почему бы не позволить классу Member , иметь свое собственное понимание как и зачем создается объект или почему бы не сделать отдельную фабрику для создания более сложных объектов?

Если мы относимся к нашим репозиториям как к простым коллекциям, так значит и не нужно нагружать их лишним функционалом. Я не хочу классов коллекций, которые ведут себя как фабрики.

В чем выгода использования репозиториев?

Основное преимущество репозиториев - это абстрактный механизм хранения для коллекций сущностей.

Предоставляя интерфейс MemberRepository мы развязываем руки разработчику, который уже сам решит как и где хранить данные.

Class ArrayMemberRepository implements MemberRepository { private $members = ; public function save(Member $member) { $this->members[(string)$member->getId()] = $member; } public function getAll() { return $this->members; } public function findById(MemberId $memberId) { if (isset($this->members[(string)$memberId])) { return $this->

Class RedisMemberRepository implements MemberRepository { public function save(Member $member) { // ... } // you get the point }
Таким образом, большинство наших приложений знает только абстрактное понятие MemberRepository и его использование может быть отделено от фактической реализации. Это очень раскрепощает.

К чему относятся репозитории: Domain или Application Service Layer?

Итак, вот интересный вопрос. Во-первых, давайте определим, что Application Service Layer - это многоуровневая архитектура, которая отвечает за специфические детали реализации приложения, такие как целостность базы данных, и различные реализации работы с интернет-протоколами (отправка электронной почты, API) и др.

Определим термин Domain Layer как слой многоуровневой архитектуры, которая отвечает за бизнес-правила и бизнес-логику.

Куда же попадет репозиторий при таком подходе?

Давайте посмотрим на нашем примере. Вот код, написанный ранее.

Class ArrayMemberRepository implements MemberRepository { private $members = ; public function save(Member $member) { $this->members[(string) $member->getId()] = $member; } public function getAll() { return $this->members; } public function findById(MemberId $memberId) { if (isset($this->members[(string)$memberId])) { return $this->members[(string)$memberId]; } } }
В этом примере я вижу много деталей реализации. Они, несомненно, должны входить в слой приложения

А теперь давайте удалим все детали реализации из этого класса…

Class ArrayMemberRepository implements MemberRepository { public function save(Member $member) { } public function getAll() { } public function findById(MemberId $memberId) { } }
Хм… это начинает выглядеть знакомо… Что же мы забыли?

Возможно, получившийся код напоминает вам это?

Interface MemberRepository { public function save(Member $member); public function getAll(); public function findById(MemberId $memberId); }
Это означает, что интерфейс находится на границе слоев. и на самом деле может содержать доменно-специфические концепты, но сама реализация не должна этого делать.

Интерфейсы репозиториев принадлежат к слою домена. Реализация же относятся к слою приложения. Это означает, что мы свободны при построении архитектуры на уровне доменного слоя без необходимости зависеть от слоя сервиса.

Свобода смены хранилищ данных

Всякий раз, когда вы слышите чей-то разговор о концепции объектно-ориентированного дизайна, вы, наверное, могли слышать что-то вроде "… и у вас есть возможность поменять одну реализацию хранения данных на другую в будущем..."

По-моему, это не совсем правда… я бы даже сказал, что это очень плохой аргумент. Самой большой проблемой объяснения концепции репозиториев является то, что сразу напрашивается вопрос «вы действительно хотите это делать?» . Я НЕ хочу чтобы подобные вопросы влияли на использование паттерна репозитория.

Любое достаточно хорошо спроектированное объектно-ориентированное приложение автоматически подходит под приведенное преемущество. Центральной концепцией ООП является инкапсуляция. Вы можете предоставить доступ к API и скрыть реализацию.

Ведь вы же на самом деле не будете переключаться с одного ORM на другой и обратно. Но даже если вы захотите так делать, то, по крайней мере, у вас будет возможность сделать это. Однако, замена реализации репозитория будет огромным плюсом при тестировании.

Тестирование при использовании паттерна «Репозиторий»

Ну, тут все просто. Давайте предположим, что у вас есть объект, который обрабатывает что-то вроде регистрации участников…

Class RegisterMemberHandler { private $members; public function __construct(MemberRepository $members) { $this->members = $members; } public function handle(RegisterMember $command) { $member = Member::register($command->email, $command->password); $this->members->save($member); } }
Во время очередной операции, я могу взять экземпляр DoctrineMemberRepository . Однако, во время тестирования легко можно заменить его на экземпляр ArrayMemberRepository. Они оба реализуют один и тот же интерфейс.

Упрощенный пример теста может выглядеть примерно так…

$repo = new ArrayMemberRepository; $handler = new RegisterMemberHandler($repo); $request = $this->createRequest(["email" => "[email protected]", "password" => "angelofdestruction"]); $handler->handle(RegisterMember::usingForm($request)); AssertCount(1, $repo->findByEmail("[email protected]"));
В этом примере мы тестируем обработчик. Нам не нужно проверять корректность хранения данных репозитория в БД (или еще где). Мы тестируем конкретное поведение этого объекта: регистрируем пользователя на основе данных формы, а затем передаем их в репозиторий.

Коллекция или Состояние

В книге Implementing Domain-Driven Design Vaughn Vernon делает различие между типами репозиториев. Идея коллекцио-ориентированного репозитория (ориг. - collection-oriented repository) в том, что работа с репозиторием идет в памяти, как с массивом. Репозиторий, ориентированный на хранение состояний (ориг. - persistence-oriented repository) содержит в себе идею, что в нем будет какая-то более глубокая и продуманная система хранения. По сути различия лишь в названиях.

// collection-oriented $memberRepository->add($member); // vs persistence-oriented $memberRepository->save($member);
Замечу, что это лишь мое мнение и пока что я придерживаюсь именно его в вопросах использования репозиториев. Однако, хотел бы предупредить, что возможно могу передумать. В конце-концов, я сосредотачиваюсь на них как на коллекциях объектов с теми же обязанностями, что и у любого другого объекта-коллекции.

Дополнительная информация

everzet создал проект на Github о репозиториях на который, безусловно, стоит посмотреть. Внутри вы найдете примеры работы с хранением в памяти и файлах.

Итоги

Я считаю, что…
  1. … важно дать репозиториям сингулярную задачу функционировать как коллекция объектов.
  2. … мы не должны использовать репозитории для создания новых экземпляров объектов.
  3. … мы должны избегать использования репозиториев как способа перехода от одной технологии к другой, так как они имеют очень много преимуществ, от которых трудно отказаться.
В будущем я планирую написать еще несколько статей о репозиториях, таких как кэширование результатов с помощью декоратора, запросов с помощью паттерна критерия, роли репозитория в обработке пакетных операций на большом количестве объектов.

Если у вас есть вопросы или если ваше мнение отличается от моего, пожалуйста, пишите комментарии ниже.

Как всегда, я намерен обновлять статью, чтобы синхронизировать ее с моим текущим мнением.

Открываем менеджер пакетов Synaptic, заходим в настройки, выбираем репозитории.

В открывшемся окне несколько вкладок с типами репозиториев:

Main - основная ветка - стабильное официально поддерживаемое Canonical ПО

Restricted - официально поддерживаемое ПО распространяемое не под лицензией GPL

Universe - программы, поддерживаемые сообществом Ubuntu

Multiverse - ветка проприетарного программного обеспечения

В зависимости от дистрибутива линукса эти окна немного могут немного различаться, например в Mint выглядит так.

Для добавления репозитория в Ubuntu перейдите на вкладку другое ПО на этой вкладке вы можете видеть весь список репозиториев Ubuntu которые были подключены к системе:

Чтобы иметь доступ к дополнительным программам рекомендуется подключить сторонний репозиторий партнеров Canonical. Для этого просто поставьте напротив него галочку.

Для добавления репозитория Ubuntu нажмите кнопку Добавить:

Здесь в единственном поле нужно ввести apt строку репозитория и нажать кнопку добавить источник.

Apt строка репозитория имеет такой синтаксис:

deb http://адрес_репозитория версия_дистрибутива ветки

Например:

deb http://ua.archive.ubuntu.com/ubuntu/ xenial main restricted
deb https://apt-mo.trafficmanager.net/repos/dotnet/ trusty main

Чтобы добавить в командной строке, достаточно выполнить команду:

sudo add-apt-repository "deb адрес репозитория ветка main"

Например:

sudo add-apt-repository "deb http://mirror.yandex.ru/ubuntu/ trusty main"

Основные репозитории для Ubuntu, Mint и им подобных

Ualinux

Данный репозиторий могут использовать не только пользователи Ubuntu, но так же и пользователи Kubuntu, Xubuntu, Lubuntu и других систем, таких как LinuxMint, Runtu и д.р.

Интернет программы

sudo add-apt-repository ppa:chromium-daily/stable

wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb

sudo dpkg -i google-chrome-stable_current_i386.deb

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

sudo dpkg -i google-chrome-stable_current_amd64.deb

sudo add-apt-repository "deb http://deb.opera.com/opera/ stable non-free"

wget -O - http://deb.opera.com/archive.key | sudo apt-key add -

sudo add-apt-repository ppa:mozillateam/firefox-next

Twitter-клиент Hotot

Sudo add-apt-repository ppa:hotot-team

Это репозиторий замечательного твиттер клиента Turpial

sudo add-apt-repository ppa:effie-jayx/turpial

Мультимедиа

sudo add-apt-repository ppa:videolan/stable-daily

MPV (ответвление mplayer)

sudo add-apt-repository ppa:mc3man/mpv-tests

sudo add-apt-repository ppa:mc3man/trusty-media

Lightworks - мощная программа для монтажа теперь доступна под Ubuntu

VkAudioSaver: аудиоплеер для скачивания и прослушивания музыки из ВКонтакта

Pepperflash (замена flash-player для Chromium)

sudo add-apt-repository ppa:skunk/pepper-flash

sudo apt-get update && sudo apt-get install pepflashplugin-installer

После установки вам нужно указать Chromium, что нужно пользоваться Pepper Flash Player. Для этого отредактируйте файл запуска браузера. Введите следующую команду:

sudo gedit /etc/chromium-browser/default

И в самом конце файла вставьте следующую строчку:

./usr/lib/pepflashplugin-installer/pepflashplayer.sh

Cinelerra - видеоредактор

sudo add-apt-repository ppa:cinelerra-ppa/ppa

Аудиоплеер наподобие Winamp.

sudo add-apt-repository ppa:alexey-smirnov/deadbeef

Кодеры-декодеры

Mobile Media Converter

Простой интуитивно понятный интерфейс, множество поддерживаемых форматов.

Программа очень простая, мало настроек и предустановок.

sudo add-apt-repository ppa:paul-climbing/ppa

sudo apt-get install winff

sudo add-apt-repository ppa:nilarimogard/webupd8

sudo apt-get update

sudo apt-get install transmageddon

Skype Call Recorder

Запись звонков Skype. Программа кроссплатформенная.

sudo add-apt-repository ppa:dajhorn/skype-call-recorder

Запись экрана с множеством возможностей.

sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
sudo apt-get update
sudo apt-get install simplescreenrecorder

Драйвера

официальный репозиторий графических драйверов Intel

sudo add-apt-repository "deb https://download.01.org/gfx/ubuntu/14.04/main trusty"

sudo add-apt-repository ppa:ubuntu-x-swat/x-updates

Под различные ОС можно скачать .

sudo add-apt-repository ppa:alexx2000/doublecmd

Распознавание текста

GImageReader и Tesseract

sudo add-apt-repository ppa:gezakovacs/tesseract

sudo add-apt-repository ppa:sandromani/gimagereader

Cuneiform и Yagf

sudo add-apt-repository ppa:alex-p/notesalexp

Это репозиторий, в котором есть графическая оболочка для Cuneiform - программа Yagf. Служит для распознания текста в Linux.

Настройка

Ezame - новый редактор меню для Unity

sudo add-apt-repository ppa:caldas-lopes/ppa
sudo apt-get update
sudo apt-get install gksu ezame


sudo add-apt-repository ppa:tualatrix/ppa

Sudo add-apt-repository ppa:danielrichter2007/grub-customizer

Графическое приложение для конфигурации Grub/Burg, чтобы не копаться вручную в их многочисленных настройках в /etc.

Различные дополнения

Для самых крайних версий

sudo add-apt-repository ppa:kde3-maintainers/trinity-svn-nightly

Темы, иконки

sudo add-apt-repository ppa:tiheum/equinox

sudo apt-get install faenza-icon-theme faience-icon-theme faience-theme

sudo add-apt-repository ppa:noobslab/icons

sudo apt-get install awoken-icon-theme mint-x-icons malys-ex malys-uniblack malys-uniblue acyl-icons darkenza mac-x-lion-reloaded nitrux-icons meliaesvg-icons piratunbu-icons azenis-green-icons nouvegnome-color nouvegnome-gray fs-icons hi-lights-icons matrilineare

sudo add-apt-repository ppa:upubuntu-com/icons

sudo apt-get install azenis-icons betelgeuse-icons candy-icons faenk-icons gxiria-icons hilights-icons hydroxygen-icons kalahari-icons magog-white-icons mx-icons propheticon13 sphere-icons

Работа с текстом

Libreoffice

sudo add-apt-repository ppa:vincent-c/cherrytree

Это репозиторий древовидного иерархического текстового редактора Cherry Tree.

sudo add-apt-repository ppa:pdfshuffler/ppa

Просмотрщик PDF

sudo add-apt-repository ppa:ed10vi86/ppa


sudo add-apt-repository ppa:pdfmod-team/ppa

sudo add-apt-repository ppa:mystic-mirage/komodo-edit

Графика

sudo add-apt-repository ppa:otto-kesselgulasch/gimp

Прочие

sudo add-apt-repository ppa:ubuntu-wine/ppa

sudo add-apt-repository ppa:stebbins/handbrake-releases

sudo add-apt-repository ppa:colingille/freshlight

sudo add-apt-repository ppa:chris-lea/node.js

Docky
sudo add-apt-repository ppa:docky-core/ppa

Java
sudo add-apt-repository ppa:webupd8team/java

SVN
sudo add-apt-repository ppa:svn/ppa

Список репозиториев ppa ubuntuupdates.org

Atareao Atareao
Atom
Banshee Team
Brightbox Ruby NG Experimental
Cairo-dock-team
Canonical Kernel Team
Canonical Partner
Cassandra
Chris Lea Nodejs
Chromium Stable Channel
Conky Companions
Deluge-team
Docker
Docky
Drizzle Developers
Dropbox
Ehoover Compholio Netflix
EugeneSan
Extras
FerramRoberto VLC
Firefox Aurora
Flexiondotorg Java
Flexiondotorg Shotwell
FreeNX Stable
FreeNX Testing
Gdm2setup
GetDeb Apps
GetDeb Games
Gloobus-dev Gloobus Preview
Gnome 3
Gnome Shell
Google Chrome
Google Earth
Google Music
Google Stable Non Free
Google Talk Plugin
Google Testing Non Free
Gwendal Le Bihan Dev Cinnamon Stable
Handbrake releases
Handbrake Snapshots
Indicator-multiload daily
Intel Linux Graphics
KeePassX
kernel-ppa
Kubuntu-ppa Backports
Kubuntu-ppa Beta
Kubuntu Updates
Lffl Wireshark
LibreOffice
Lucidbleed
Mactel Support
MariaDB 5.2
MariaDB 5.5
MariaDB Repo 5.2
Medibuntu Free
Medibuntu Non Free
Midori
Mint Import
Mint Main
Mint upstream
Mozilla Team Firefox Next
Mozilla Team Firefox Stable
Mozilla Team Thunderbird Stable
Murrine Daily
Mythtv 0.22
Mythtv 0.23
Mythtv 0.23.1
Mythtv 0.24
MythTV 0.25
MythTV 0.26
MythTV 0.27
MythTV 0.28
MythTV Testing
nathan-renniewaldock ppa
Nautilus Elementary
Nginx
Nvidia-vdpau
Openshot-Edge
Opera
Percona Server with XtraDB
Phablet Tools
Phusion Passenger
Pidgin
Pipelight
Pithos Daily
Pitti Postgresql
PlayOnLinux
Postgresql
Pratikmsinha ruby 1.9.2
Puppet repo
Riak
Scopes packagers
Screenlets stable
SevenMachines Flash
Skype
Spotify
Sssup