Как установить пакет, для которого отсутствует зависимость нужной версии –

Как установить пакет, для которого отсутствует зависимость нужной версии - Электронная цифровая подпись

“невозможно найти пакет” при попытке установить пакеты с apt – apt

xbmc доступен только в репозитории юниверсов, только начиная с Ubuntu 12.04 (точнее). Если у вас более старая версия Ubuntu, вам нужно обновить или получить xbmc из другого места.

Если у вас Ubuntu 12.04, убедитесь, что вы включили хранилище юниверсов. Вы можете увидеть, какие репозитории вы включили в файл /etc/apt/sources.list (и в файлах в каталоге /etc/apt/sources.list.d). Убедитесь, что этот файл содержит строку вроде

deb http://al.archive.ubuntu.com/ubuntu/ precise universe

или же

deb http://zw.archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse

Если вы найдете только строку, как

deb http://mn.archive.ubuntu.com/ubuntu/ precise main restricted

и не соответствует universe, добавлять universe в конце этой строки или отдельной строкой с precise universe, как показано выше.

Если вам нужно изменить /etc/apt/sources.list, бежать sudo apt-get update затем попробуйте установить снова. Если пакет все еще не найден, опубликуйте полное содержание /etc/apt/sources.list и выход sudo apt-get update,

Обновление Ubuntu или Debian до актуального состояния

Откройте терминал и выполните:

sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade && sudo apt-get autoremove

Файл control

Мы начнём с обзора файла control, который содержится в архиве control.tar.gz. Файл control содержит самую жизненно важную информацию о пакете. Он использует структуру схожую с email заголовками и может быть просмотрен командой dpkg -I. Например, файл control для apt выглядит так:

4 Конфликтующие пакеты: поле Conflicts

Поле Conflicts показывает когда пакет не может быть установлен одновременно с другим. Самой распространённой причиной этого является то, что оба пакета включают файлы с одинаковыми именами, предоставляют один и тот же сервис на одном и том же порту протокола управления передачей TCP.

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

5 Несовместимости: поле Breaks

Поле Breaks имеет эффект схожий с полем Conflicts, но со специальным значением. Он сигнализирует, что установка пакета сломает другой пакет (или его определённую версию). В общем, эта несовместимость между двумя пакетами является приходящей (временной) и отношение Breaks относится к конкретным версиям.

Когда пакет ломает уже установленный пакет, dpkg откажется его устанавливать, а apt попытается решить эту проблему обновлением пакета, который может стать неисправным, на новую версию (исходя из предположения, что новая версия исправлена, и, следовательно, снова совместима).

Ситуация такого типа может возникнуть в случаях обновления без обратной совместимости: это тот случай, когда новая версия больше не работает со старой версией и вызывает сбой в другой программе без специальных условий. Поле Breaks помогает предотвратить подобные проблемы.

6 Представляемые пакеты: поле Provides

Это поле представляет очень интересную концепцию виртуального пакета. У него много ролей, но две из них имеют особое значение. Первая роль заключается в использовании виртуального пакета для связи с ним универсального сервиса (пакет предоставляет сервис).

Метапакеты и Виртуальный пакет

Важно чётко отличать метапакеты от виртуальных пакетов. Первые являются реальными пакетами (включая настоящие файлы .deb), единственной целью которых является выражение зависимостей.

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

1.6.1 Предоставляемый сервис

Давайте обсудим первый случай более подробно с примером: все почтовые серверы, такие как postfix или sendmail, представлены виртуальным пакетом mail-transport-agent. Таким образом, любой пакет, который нуждается в функциональности этой службы (например, менеджер списков рассылки, такой как smartlist или sympa), в своих зависимостях просто заявляет, что ему требуется mail-transport-agent вместо указания большого, но неполного списка возможных решений.

Более того, бесполезно устанавливать два почтовых сервера на одном компьютере, поэтому каждый из этих пакетов объявляет конфликт с виртуальным пакетом mail-transport-agent. Система игнорирует конфликт между пакетом и самим собой, но этот метод запрещает установку двух почтовых серверов рядом друг с другом.

1.6.2 Взаимозаменяемость с другим пакетом

Поле Provides также интересно, когда содержимое пакета включено в более крупный пакет. Например, модуль Perl libdigest-md5-perl был необязательным модулем в Perl 5.6 и был интегрирован как стандарт в Perl 5.8. Таким образом, в пакете perl с версии 5.

8 объявлено Provides: libdigest-md5-perlso, эта запись означает, что если в системе имеется Perl 5.8 (или новее), то он выполняет и функции libdigest-md5-perlso, то есть libdigest-md5-perlso как будто бы тоже установлен. Сам libdigest-md5-perlpackage был удалён, когда удалялись старые версии Perl, так как он больше не имел никакого смысла.

Читайте также:  Как установить сертификат ЭЦП на Рутокен с компьютера


Рисунок 1. Использование поля Provides чтобы не сломать зависимости:

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

7 Замена файлов: поле Replaces

Поле Replaces указывает, что пакет содержит файлы, которые также присутствуют в другом пакете, но этот пакет имеет законное право заменить их. Без этой спецификации dpkg даёт сбой, заявляя, что он не может перезаписать файлы другого пакета (технически, это можно сделать принудительно с помощью параметра –force-overwrite, но это не считается стандартной операцией).

Использование этого поля оправдано, когда имена пакетов меняются или когда пакет включён в другой. Это также происходит, когда сопровождающий решает распределить файлы по-разному среди различных двоичных пакетов, созданных из одного и того же исходного пакета: заменённый файл больше не принадлежит старому пакету, а только новому.


Если все файлы в установленном пакете были заменены, пакет считается удаленным. Наконец, это поле также побуждает dpkg удалять заменённый пакет в случае конфликта.

Установка зависимостей

Теперь установите зависимости:

Средства сборки:

sudo apt-get install build-essential cmake

GUI:

sudo apt-get install qt5-default libvtk6-dev

Работа с изображениями:

sudo apt-get install zlib1g-dev libjpeg-dev libwebp-dev libpng-dev libtiff5-dev libjasper-dev libopenexr-dev libgdal-dev

Видеоввод/вывод:

sudo apt-get install libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libv4l-dev libxine2-dev

Библиотеки параллельного исполнения программ и линейной алгебры:

sudo apt-get install libtbb-dev libeigen3-dev

Python:

sudo apt-get install python-dev python-tk python-numpy python3-dev python3-tk python3-numpy

Java:

sudo apt-get install ant default-jdk

Документация:

sudo apt-get install doxygen sphinx-common texlive-latex-extra

Скрипты конфигурирования

В дополнение к управляющему файлу архив control.tar.gz для каждого пакета Debian может содержать несколько скриптов (postinst, postrm, preinst, prerm), вызываемых dpkg на разных этапах обработки пакета.

Эти файлы представляют собой скрипты, выполняемые на различных этапах установки/удаления:

  • preinst — выполняется перед установкой пакета
  • postinst — выполняется после установки пакета
  • prerm — выполняется перед удалением пакета
  • postrm — выполняется после удаления пакета


Мы можем использовать dpkg -I, чтобы показать эти файлы, которые находятся в архиве пакета .deb:

dpkg -I /var/cache/apt/archives/zsh_5.3-1_amd64.deb | head
 new debian package, version 2.0.
 size 814486 bytes: control archive=2557 bytes.
     838 bytes,    20 lines      control
    3327 bytes,    43 lines      md5sums
     969 bytes,    41 lines   *  postinst             #!/bin/sh
     348 bytes,    20 lines   *  postrm               #!/bin/sh
     175 bytes,     5 lines   *  preinst              #!/bin/sh
     175 bytes,     5 lines   *  prerm                #!/bin/sh
 Package: zsh
 Version: 5.3-1

dpkg -I zsh_5.3-1_amd64.deb preinst
#!/bin/sh
set -e
# Automatically added by dh_installdeb
dpkg-maintscript-helper symlink_to_dir /usr/share/doc/zsh zsh-common 5.0.7-3 -- "$@"
# End automatically added section

Политика Debian подробно описывает каждый из этих файлов с указанием вызываемых скриптов и аргументов, которые они получают. Эти последовательности могут быть сложными, поскольку в случае сбоя в одном из скриптов dpkg попытается вернуться в удовлетворительное состояние, отменив установку или удалив сделанные изменения (насколько это возможно).

База данных dpkg

Вы можете просмотреть базу данных dpkg в файловой системе в /var/lib/dpkg/. Этот каталог содержит текущую запись всех пакетов, которые были установлены в системе. Все скрипты конфигурирования для установленных пакетов хранятся в каталоге /var/lib/dpkg/info/ в виде файла с префиксом имени пакета:

ls /var/lib/dpkg/info/zsh.*
/var/lib/dpkg/info/zsh.list /var/lib/dpkg/info/zsh.md5sums 
/var/lib/dpkg/info/zsh.postinst 
/var/lib/dpkg/info/zsh.postrm 
/var/lib/dpkg/info/zsh.preinst 
/var/lib/dpkg/info/zsh.prerm

В этот каталог также включён файл с расширением .list для каждого пакета, содержащий список файлов, принадлежащих этому пакету

head /var/lib/dpkg/info/zsh.list
/. 
/bin 
/bin/zsh 
/bin/zsh5 
/usr 
/usr/lib 
/usr/lib/x86_64-linux-gnu 
/usr/lib/x86_64-linux-gnu/zsh 
/usr/lib/x86_64-linux-gnu/zsh/5.2 
/usr/lib/x86_64-linux-gnu/zsh/5.2/zsh 
[...]

Файл /var/lib/dpkg/status содержит серию блоков данных (в формате запроса заголовков почты для комментариев, RFC 2822), описывающих состояние каждого пакета. Информация из файла control установленных пакетов также копируется туда.

more /var/lib/dpkg/status
Package: gnome-characters 
Status: install ok installed 
Priority: optional 
Section: gnome 
Installed-Size: 1785 
Maintainer: Debian GNOME Maintainers<pkg-gnome-maintainers@lists.alioth.debian.org> 
Architecture: amd64 
Version: 3.20.1-1 
[...]

Давайте обсудим файлы конфигурации и посмотрим, как они взаимодействуют. Как правило, сценарий preinst выполняется до установки пакета, а postinst следует за ней. Аналогично, prerm вызывается перед удалением пакета и postrm после.

Эти последовательности могут быть довольно запутанными, но визуальное представление может помочь. Manoj Srivastava сделал диаграммы, объясняющие, как сценарии конфигурации вызываются dpkg. Подобные диаграммы были также разработаны проектом Debian Women; они немного проще для понимания, но менее полны.

Внимание: символические имена скриптов

Последовательности, описанные в этом разделе, вызывают скрипты конфигурации по определенным именам, таким как old-prerm или new-postinst. Это, соответственно, сценарий prerm, содержащийся в старой версии пакета (установленный до обновления), и сценарий postinst, содержащийся в новой версии (установленный обновлением).

1 Последовательность выполнения скриптов установки и обновления

Вот что происходит во время установки (или обновления):

  1. Для обновления dpkg вызывает old-prerm upgrade new-version.
  2. Тем не менее для обновления dpkg затем выполняет new-preinst upgrade old-version; для первой установки выполняется new-preinst install. Он может добавить старую версию в последний параметр, если пакет уже установлен и удалён (но не очищен, файлы конфигурации были сохранены).
  3. Файлы нового пакета будут распакованы. Если файл уже существует, он заменяется, но резервная копия создаётся и временно сохраняется.
  4. Для обновления dpkg выполняет old-postrm upgrade new-version.
  5. dpkg обновляет все внутренние данные (список файлов, сценарии конфигурации и т. д.). И удаляет резервные копии заменённых файлов. Это точка невозврата: dpkg больше не имеет доступа ко всем элементам, необходимым для возврата в предыдущее состояние.
  6. dpkg обновит файлы конфигурации, программа не может автоматически выполнить эту задачу, поэтому предложит вам решить, что делать со старыми и новыми конфигурационными файлами. Детали этой процедуры обсуждаются в разделе 3. «Контрольные суммы, Conffiles».
  7. Наконец, dpkg настраивает пакет, выполняя команду new-postinst configure last-version-configured.
Читайте также:  Энциклопедия судебной практики. Основания для государственной регистрации прав (Ст. 17 Закона "О государственной регистрации прав на недвижимое имущество и сделок с ним") | ГАРАНТ

2 Удаление пакета


Вот что происходит во время удаления пакета.

  1. dpkg вызывает prerm remove.
  2. dpkg удаляет все файлы пакета, за исключением файлов конфигурации и скриптов конфигурации.
  3. dpkg выполняет postrm remove. Все конфигурационные скрипты, кроме postrm, удалены. Если вы не использовали опцию очистки, процесс останавливается здесь.
  4. Для полной очистки пакета (команда, введённая с помощью dpkg –purge или dpkg -P), также удаляются файлы конфигурации и определённое количество копий (*.dpkg-tmp, *.dpkg-old, *.dpkg-new) и временные файлы; Затем dpkg выполняет postrm purge.

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

Ответы записываются в базу данных debconf для дальнейшего использования. Скрипт обычно выполняется apt перед установкой пакетов один за другим, чтобы сгруппировать все вопросы вместе в начале процесса. Скрипты до и после установки могут затем использовать эту информацию для работы в соответствии с вашими пожеланиями.

Инструмент debconf

Контрольные суммы, Conffiles


В дополнение к скриптам сопровождающего и управляющим данным, уже упомянутым в предыдущих разделах, архив control.tar.gz пакета Debian может содержать другие интересные файлы:

ar p /var/cache/apt/archives/bash_4.4-2_amd64.deb control.tar.gz | tar -tzf -
./
./conffiles
./control
./md5sums
./postinst
./postrm
./preinst
./prerm

Первый — md5sums — содержит контрольные суммы MD5 для всех файлов пакета. Его главное преимущество заключается в том, что он позволяет dpkg –verify проверять, были ли эти файлы изменены с момента их установки. Обратите внимание, что когда этот файл не существует, dpkg будет генерировать его динамически во время установки (и сохранять его в базе данных dpkg, как и другие контрольные файлы).

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

По сути, в этой ситуации dpkg ведёт себя максимально разумно: если стандартный файл конфигурации не изменился между двумя версиями, он ничего не делает. Однако, если файл изменился, он попытается обновить этот файл. Возможны два случая: либо администратор не трогал этот файл конфигурации, и в этом случае dpkg автоматически устанавливает новую версию; или файл был изменён, и в этом случае dpkg спрашивает администратора, какую версию он хочет использовать (старую с модификациями или новую, поставляемую с пакетом).

Чтобы помочь в принятии этого решения, dpkg предлагает отобразить diff (различия), которые показывает разницу между двумя версиями. Если вы решите сохранить старую версию, новая будет сохранена в том же месте в файле с суффиксом .dpkg-dist.

Если вы выбираете новую версию, старая сохраняется в файле с суффиксом .dpkg-old. Другое доступное действие состоит в кратковременном прерывании dpkg для редактирования файла и попытке восстановления соответствующих изменений (ранее идентифицированных с помощью diff).

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

Опция –force-confold сохраняет старую версию файла, в то время как –force-confnew будет использовать новую версию. Эти варианты соблюдаются, даже если файл не был изменён администратором, что лишь редко даёт желаемый эффект.

Добавление параметра –force-confdef указывает dpkg самостоятельно решать, когда это возможно (другими словами, когда исходный файл конфигурации не был затронут), и использует –force-confnew или –force-confold для других случаев.

Эти параметры применяются к dpkg, но в большинстве случаев администратор будет работать напрямую с программами aptitude или apt. Таким образом, необходимо знать синтаксис, используемый для указания параметров, передаваемых команде dpkg (их интерфейсы командной строки очень похожи).

apt -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" full-upgrade

Эти параметры могут быть сохранены непосредственно в конфигурации apt. Для этого просто напишите следующую строку в файл /etc/apt/apt.conf.d/local:

DPkg::options { "--force-confdef"; "--force-confold"; }


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

И наоборот, вы также можете заставить dpkg задавать вопросы о файле конфигурации. Опция –force-confask указывает dpkg отображать вопросы о файлах конфигурации даже в тех случаях, когда они обычно не нужны. Таким образом, при переустановке пакета с этой опцией dpkg снова задаст вопросы для всех файлов конфигурации, изменённых администратором.

Читайте также:  Как установить сертификат ЭЦП на компьютер: инструкция по установке электронной подписи

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

Связанные статьи:

Компиляция и установка OpenCV

В вашем терминале, убедитесь, что вы находитесь в каталоге OpenCV и выполните следующие команды:

mkdir build
cd build
cmake -DWITH_QT=ON -DWITH_OPENGL=ON -DFORCE_VTK=ON -DWITH_TBB=ON -DWITH_GDAL=ON -DWITH_XINE=ON -DBUILD_EXAMPLES=ON ..
make -j4
sudo make install

Теперь, настройте OpenCV:

sudo ldconfig

Теперь, вы установили OpenCV. И вы можете выполнить некоторые примеры.

Запуск некоторых OpenCV примеров

Перейдите в каталог OpenCV и выполните C пример:

cd build/bin
./cpp-example-edge ../../samples/data/fruits.jpg

Теперь, перейдите в каталог OpenCV и выполните пример Python программы:

cd samples/python
python video.py

И наконец, перейдите в каталог OpenCV и выполните пример на Java:

cd samples/java/ant
ant -DocvJarDir=../../../build/bin -DocvLibDir=../../../build/lib

Компиляция примера

Создайте исходный файл с именем demo.cpp и со следующим кодом:

#include <opencv2/core/core.hpp>
#include <opencv2/viz/vizcore.hpp>
int main()
{
cv::viz::Viz3d window = cv::viz::Viz3d("Viz demonstration");
cv::Point3d min(0.25, 0.0, 0.25);
cv::Point3d max(0.75, 0.5, 0.75);
cv::viz::WCube cube(min, max, true, cv::viz::Color::blue());
cube.setRenderingProperty(cv::viz::LINE_WIDTH, 4.0);
window.showWidget("Axis widget", cv::viz::WCoordinateSystem());
window.showWidget("Cube widget", cube);
while(!window.wasStopped()) {
window.spinOnce(1, true);
}
return 0;
}

Создайте текстовый файл с именем CMakeLists.txt и со следующим кодом:

cmake_minimum_required(VERSION 2.8.12)
project(demo)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(demo demo.cpp)
target_link_libraries(demo ${OpenCV_LIBS})

И наконец, скомпилируйте и выполните:

mkdir build && cd build && cmake .. && make
./demo

Теперь вы установили OpenCV, выполнили некоторые примеры, и скомпилировали небольшую OpenCV программу.

Ошибка «в значении поля «description» обнаружена пустая строка»

Если при установки пакета возникла ошибка:

dpkg: ошибка при обработке архива viber_fixed.deb (--install):
 анализ файла «/var/lib/dpkg/tmp.ci/control» около строки 17 пакета «viber»:
 в значении поля «Description» обнаружена пустая строка
При обработке следующих пакетов произошли ошибки:
 viber_fixed.deb


То это означает, что в файле control есть последняя пустая строка — удалите эту пустую строку и пересоберите установочный файл.

После этого всё ставится как нужно:

Если вам действительно просто нужен Viber, то смотрите статью «Как установить Viber на Linux».

Вам понравилось «потрошить» .deb пакеты? Тогда смотрите подробную справочную информацию об их устройстве в статье «Структура APT пакета: разбираемся в строении пакета Debian».

Связанные статьи:

Установка opencv вручную

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

sudo apt-get autoremove libopencv-dev python-opencv

и следуйте инструкциям ниже.

Установка opencv из репозитория

Вы можете установить OpenCV из репозитория с помощью команды:

sudo apt-get install libopencv-dev python-opencv

Но таким способом вы, скорее всего, не установите последнюю версию OpenCV и там могут отсутствовать некоторые функции (например: поддержка Python 3).

2 Pre-Depends — это более требовательные Depends

Предварительные зависимости, перечисленные в поле Pre-Depends заголовков пакета, дополняют обычные зависимости; их синтаксис идентичный. Обычная зависимость указывает, что она должна быть распакована и настроена до того, как конфигурация пакета объявит зависимость.

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

1 Зависимости: поле Depends

Зависимости пакета определены в поле Depends в пакетном заголовке. Это список условий, которым должен удовлетворять пакет для правильной работы — эта информация используется такими инструментами как apt для установке требуемых библиотек в соответствующих версиях, удовлетворяющих зависимостям устанавливаемого пакета.

Для каждой зависимости вы можете ограничить диапазон версий удовлетворяющих условию. Другими словами, можно выразить тот факт, что нужен пакет libc6 версии равной или большей чем «2.15» (записывается так «libc6 (>= 2.15)»). Операторами сравнения версий являются следующие:

В списке условий, которым должны удовлетворять зависимости, разделителем является запятая, интерпретируемая как логическое «И». В условиях вертикальная черта (труба) (“|”) выражает логическое «ИЛИ» (это инклюзивное «ИЛИ», а не эксклюзивное «ЛИБО, ЛИБО»); то есть это включающее «ИЛИ», а не исключающее: подойдёт любой вариант или сразу оба, не требуется жёсткое условие «ТОЛЬКО ОДИН ИЗ».

Оно имеет больший приоритет чем «И» и вы можете использовать его столько раз, сколько нужно. Таким образом, зависимость “(A OR B) AND C” записывается как A | B, C. В противоположность ей выражение “A OR (B AND C)” должно быть записано как “(A OR B) AND (A OR C)”, но поскольку поле Depends не терпит круглых скобок, то изменён порядок приоритета логических операторов «ИЛИ» и «И». Поэтому выражение должно быть записано как A | B, A | C.

3 Поля Recommends, Suggests, и Enhances

Поля Recommends (рекомендованные) и Suggests (предлагаемые) описывают зависимости, которые не являются обязательными. В первую очередь следует обратить внимание на рекомендуемые (Recommends) зависимости, они значительно улучшают функциональность, предлагаемую пакетом, но не являются обязательными для его работы.

Предлагаемые (Suggests) зависимости, имеющие второстепенное значение, указывают на то, что некоторые пакеты могут дополнять и улучшать работу определённых утилит, но совершенно разумно устанавливать одни без других. Иногда в рекомендуемых зависимостях указывают просто пакеты с документацией и справкой.


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

Оцените статью
ЭЦП Эксперт
Добавить комментарий

Adblock
detector