Как получить и изменить исходный код пакетов, установленных через apt-get?


163

Я предполагаю, что все приложения, установленные через apt-get, с открытым исходным кодом; но для тех, которые доступны таким образом, где я могу получить исходный код для этих приложений, а также обновить их?

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

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


7
apt-getтакже поддерживает программы с закрытым исходным кодом, поэтому ваше первоначальное предположение неверно.
Flimm

Ответы:


183

Используйте команду apt-get source <package>(не используйте sudo с ней), чтобы загрузить исходный код пакета.

От man apt-get:

   source
       source causes apt-get to fetch source packages. APT will examine the
       available packages to decide which source package to fetch. It will then
       find and download into the current directory the newest available version of
       that source package while respect the default release, set with the option
       APT::Default-Release, the -t option or per package with the pkg/release
       syntax, if possible.

       Source packages are tracked separately from binary packages via deb-src type
       lines in the sources.list(5) file. This means that you will need to add such
       a line for each repository you want to get sources from. If you don't do
       this you will properly get another (newer, older or none) source version
       than the one you have installed or could install.

       If the --compile option is specified then the package will be compiled to a
       binary .deb using dpkg-buildpackage, if --download-only is specified then
       the source package will not be unpacked.

       A specific source version can be retrieved by postfixing the source name
       with an equals and then the version to fetch, similar to the mechanism used
       for the package files. This enables exact matching of the source package
       name and version, implicitly enabling the APT::Get::Only-Source option.

       Note that source packages are not tracked like binary packages, they exist
       only in the current directory and are similar to downloading source tar
       balls.

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

sudo apt-get build-dep <package>  

Затем используйте dpkg-buildpackageдля создания .debфайла. Из APT и Dpkg Quick Reference Sheet :

dpkg-buildpackage Создает пакет Debian из дерева исходных текстов Debian. Вы должны быть в главном каталоге дерева исходных текстов, чтобы это работало. Пример использования:

 dpkg-buildpackage -rfakeroot -uc -b

Где -rfakerootон указывает использовать программу fakeroot для имитации привилегий root (для целей владения), -ucобозначает «Не криптографически подписывать журнал изменений» и -bобозначает «Создавать только двоичный пакет».

В терминале, cdв каталог, содержащий источник пакета (например ~/code/hellanzb-0.13), и выполните следующую команду:

dpkg-buildpackage -rfakeroot -uc -b

Если сборка прошла успешно, .debв родительском
каталоге будет находиться файл (например ~/code/hellanzb_0.13-6.1_all.deb).


Как я могу установить из модифицированного источника. а также передать его обратно для использования другими пользователями. Спасибо!
myusuf3

1
@dustyprogrammer Обновил мой ответ инструкциями по созданию .debпакета из исходного кода. Что касается получения вашего модифицированного пакета в репозитории, вы должны поговорить об этом с MOTU .
Исаия

@DoR есть ли способ создать deb, который по умолчанию устанавливается в пользовательский каталог? так же, как мы можем установить, используя --prefix во время процесса настройки? на самом деле я не могу найти tar-архивы для источника библиотеки, поэтому я не могу сконфигурировать --prefix и сделать его установку ... но этот источник pakages доступен через apt, поэтому я подумал установить пакет с исходным кодом в нужном префиксе ,
Ashishsony

2
Если вы не хотите использовать apt-get source (например, при сборке пакета, взятого из другого дистрибутива), загрузите 3 исходных файла и используйте 'dpkg-source -x [fine] .dsc', чтобы извлечь файлы и применить diffs перед dpkg-buildpackage. ( ftp.debian.org/debian/doc/source-unpack.txt )
Шломи Лубатон,

Устанавливает ли sudo apt-get build-dep <package>зависимости как двоичные файлы? Если это так, это не полная сборка из исходного кода. Как сделать build-dep установки зависимостей из исходного кода?
Привет, мир,

21

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

  1. Включить исходные репозитории. Откройте панель инструментов (верхняя левая кнопка) и выполните поиск sources. Это должно Software & Updatesзапустить программу, запустить ее и убедиться, что у вас выбрана опция «Исходный код»:

    введите описание изображения здесь

  2. Откройте терминал и выполните эту команду:

    apt-get source vlc
    

Это загрузит исходники vlc в ваш текущий каталог, и вы сможете просматривать их на досуге.

Конечно, в случае vlc, вы также можете загрузить их непосредственно с веб-сайта videolan.org: https://www.videolan.org/vlc/download-sources.html.


1
Вам не нужно использовать sudo с 'apt-get source'
Squidly

@MrBones аааа! Нет, конечно, нет, сила привычки. Спасибо за указание на это.
Terdon

в терминале: software-properties-gtk <---, который запустит панель графического интерфейса «Software & Updates». (По какой-то причине меня это не
Пестофаг

17

Вы можете использовать apt-get source --compileнапрямую:

sudo apt-get build-dep <package>
sudo apt-get source --compile <package>

Работал на меня. .Deb попадает в каталог, из которого вы выполнили команду.


9
Работал и на меня, спасибо. Только одна дополнительная деталь: вы можете установить .deb сsudo dpkg -i <package>.deb
waldyrious

Лучшее решение, за исключением того, что apt вернется к версии репозитория, потому что вы забыли задокументировать список изменений с помощью "dch -i".
Футал

3

Чтобы получить больше информации о пакете, включая исходный URL-адрес и контакты проекта / программы, вы можете взглянуть на файл авторских прав (ссылка на которого указана на сайте packages.debian.org ).

Когда пакет включен и установлен в вашей системе, вы также можете прочитать файл об авторских правах непосредственно по адресу /usr/share/doc/$package_or_program_name/copyright.

Посмотрите, как загрузить исходный код пакета Debian? ,


2

Минимальный пример с helloпакетом

Все это и многое другое описано по адресу: https://www.debian.org/doc/manuals/maint-guide/build.en.html.

Сначала давайте возьмем пример пакета для изменения источника:

sudo apt-get install hello
hello

выходы:

Hello, world!

Теперь давайте разберемся. Получить источник:

apt-get source hello
cd hello-*

и откройте:

vim src/hello.c

и измените сообщение на:

Hello, world hacked!

Затем проделайте то же самое с тестом, иначе раздражающий тест начнет проваливаться:

vim tests/greeting-1

Затем восстановите с помощью:

sudo apt-get install devscripts
sudo apt-get build-dep hello
debuild -b -uc -us

Ближе к концу вывода написано:

dpkg-deb: building package 'hello' in '../hello_2.10-1build1_amd64.deb'.

поэтому он создал .deb в родительском каталоге, как он посмел. Итак, наконец мы устанавливаем и тестируем модифицированный пакет:

sudo dpkg -i ../hello_2.10-1build1_amd64.deb
hello

и вот, он выводит новое сообщение:

Hello, world hacked!

Проверено на Ubuntu 18.04.

Старый bzrответ

TODO: это перестал работать на Ubuntu 16.04 дружественных, в противном случае с: bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/".. bzr branch lp:ubuntu/wily/helloработает и bzr branch lp:ubuntu/xenial/helloснова не работает . По какой-то причине https://code.launchpad.net/ubuntu/+source/hello не показывает Xenial: https://web.archive.org/save/https://code.launchpad.net/ubuntu/+source /Привет

Как уже упоминалось на https://askubuntu.com/a/81889/52975, есть также подход, специфичный для Ubuntu bzr.

Получить последнюю версию:

bzr branch lp:ubuntu/hello

Конкретная версия:

bzr branch lp:ubuntu/trusty/hello

Вы также можете использовать pull-lp-source:

sudo apt-get install ubuntu-dev-tools
pull-lp-source hello

Тогда вы сможете отредактировать его:

cd hello
vim some_file

Восстановите это:

dch -i 
debcommit
bzr bd -- -b -us -uc

И установить это:

sudo dpkg -i ../hello.deb

Руководство по упаковке Ubuntu - хороший источник информации.


bzr branch lp:ubuntu/hello bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/hello/". bzr branch lp:ubuntu/xenial/lightdm bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/xenial/lightdm/". Руководство по упаковке Ubuntu , а именно 4.2. Получение источника говорит: bzr branch ubuntu:lightdm lightdm.quickswitch bzr: ERROR: Not a branch: "bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lightdm/". какой беспорядок. :-(
Стефан Гурихон

Используется pull-lp-sourceвместо этого, но тогда мы не получим хранилище bzr. bzr bd -- -b -us -ucговорит bzr: ERROR: Not a branch: "/org/gourichon/localdata/SG/projects/sysadmin/sysadmin_ergozel/2016/2016-08-15/blouarp/lightdm-1.18.3/".: - / Спасибо за любой намек.
Стефан Гурихон

@ StéphaneGourichon хммм, я воспроизвожу тебя на Ubuntu 16.04 Xenial. Добавление конкретной версии работает: bzr lp:ubuntu/wily/helloно почему-то нет xenialверсии? И никто не показывает на: code.launchpad.net/ubuntu/+source/hello Go рисунок.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

1
Спасибо за заботу о воспроизведении. Вид выбрал не ту карту, тогда. Открыл bugs.launchpad.net/ubuntu/+source/bzr/+bug/1614053 с упоминанием этой страницы.
Стефан Гурихон

1
Более удобно, чем некоторые другие подходы. И спасибо за другие советы инсайдеров :)
nealmcb
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.