Сайт | Скачать | Видео | Wiki

Автор Тема: Создание портативных приложений своими руками.  (Прочитано 3925 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Нашел простой не зубодробительный способ, для подключения нужных каталогов с компонентами,то есть доступный для понимания, чтоб было ясно о чем я буду говрить приведу код лаунчера
Код
#!/bin/sh
set -x
HERE="$(dirname "$(readlink -f "$0")")"
last_dir=$(basename "$HERE")
usr="$HERE"


# Временно применяем монтирование, чтобы /home/live/portApps/liferea/usr/share/liferea/
# была доступна по пути /usr/share/liferea/
sudo mkdir -p /usr/share/liferea/
sudo mount --bind /home/live/portApps/liferea/usr/share/liferea/ /usr/share/liferea/


# Запускаем программу
GSETTINGS_SCHEMA_DIR=$HERE/usr/share/glib-2.0/schemas/ LD_LIBRARY_PATH=$HERE/usr/lib/x86_64-linux-gnu:  $HERE/usr/bin/$last_dir
обратите внимание добавилась секция которая создаёт в /usr/share/ каталог /liferea/ а потом монтирует  в /usr/share/liferea/ компоненты из портативной программы из  home/live/portApps/liferea/usr/share/liferea/ каталог будет примонтирован до завершения сессии, после перезагрузки каталог /usr/share/liferea/ будет пуст. Я такого никогда не применял ...
upd: не знаю насколько  годный, потому что лезет в системный, но... пока другого не нашел
      ####--Upd!!!--- Способ с sudo mount --bind можно использовать если каталог который монтируем в систему не перекрывает собой раннее находящиеся файлы, если эти файлы на этот момент используются системой а мы их тут переписываем mount --bind  -ом то это нарушит работу системы, меня утром посетила шальная мысль а что если я сделаю вот так sudo mount --bind /home/live/portApps/liferea/usr/ /usr, я попробовал это сделать в виртуалке и ... как и ожидал система легла, благо после перезагрузки всё встает на свои места, и дважды благо что опыты проводил в виртуалке, но на живой системе так делать не стоит, на живой нужно очень акуратно вкладывать это, понимая что делаешь.
« Последнее редактирование: 05 Октябрь 2023, 00:02:45 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Не смотря на то что создание портативных приложений задача не из простых , всё таки продолжим ,
    нашёл на сайте puppylinux утилиту которая значительно облегчает создание лаунчера(автору утилиты спасибо от всей души), и подвязку ресурсов, хотя в случае с программой для чтения rss liferea  всё равно пришлось использовать грязноватый хак с монтированием в /usr/share  каталога ~/portApps/liferea/usr/share/liferea/ через sudo mount --bind насчет утилиты там все просто , утилиту брал отсюда https://forum.puppylinux.com/viewtopic.php?t=590  , нужно чуток перемотать вниз, там есть ссылка для 64x и для 32x , вот ссылка чтоб долго не искать https://forum.puppylinux.com/download/file.php?id=2076 , утилита больше чем вероятно использует yad, пример использования тут https://oldforum.puppylinux.com/download/file.php?id=120351&sid=c493f6b4536fc786c3638eb4c698b686,  в графе Select---AppDir указываю корневой моего портативного приложенияя в моем случае это `/home/live/portApps/liferea/ `  не забываем про хак с sudo mount --bind он на пару постов выше описан, его можно вписать в лаунчер AppRun внутри каталога, и запускать именно его, ибо с бинарного лаунчера, что создался утилитой, работать не будет.
в графе утилиты Type command to be execute я написал имя исполняемого бинарника , у меня liferea, и далее идем по меню
  попробовал, эта утилита делает полноценный лаунчер для каталога с портативной программой.
  ... я сегодня уже третий раз успел в этом вопросе отчаяться, но к вечеру я остался больше доволен ,чем не доволен. Завтра подведу итог этой теме.
upd: утром на свежую голову , понял эта утилита делает не только лаунчер для каталога с портативной программой , а еще и полноценный appimage, который можно найти вне каталога с портативной программой,я думал что это просто лаунчер завернутый для удобства в бинарник
« Последнее редактирование: 05 Октябрь 2023, 15:32:34 от totiks2012 »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34033
  • Репутация: +231/-0
    • PuppyRus-A
mount --bind
Чем и для чего это лучше стандартного aufs слоя?
утилиту брал отсюда
Она чем-то помогла с проблемой /usr/share ?
Перекомпилить с нужным prefix
Это не попробовали?
полноценный appimage
Для фругала - чем лучше appimage ?

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Чем и для чего это лучше стандартного aufs слоя?
mount --bind
 это костыль, при этом даже при не понимании что делаем может быть вредным,но это единичный случай, не часто встречаемый.
<Она чем-то помогла с проблемой /usr/share> --нет не помогла но зато утилита помогает делать из подготовленого каталога свои appimage, не искать по сайтам, не пихать в систему чёрти что и черти как не пойми кем собранное, пакеты из репы которые использую тоже кем то собранные но к ним больше доверия.
<Перекомпилить с нужным prefix> --сунулся и понял что пока не дорос, в общем там не то что капец как сложно, просто с программой которой пробовал, не было в каталоге ./cmake а был atomake.sh , решил пока отложить.
<Для фругала - чем лучше appimage> тем что нет необходимости использовать fuse2, так себе аргумент, не знаю, мне нравится что каталог доступен для изменения того же AppRun. Но используя утилиту с сайта puppylinux, мы получаем полноценный appimage, я тут уже штук 10 портабелек накрутил, мне нравится. На самом деле у меня нет задач, а изучить структуру очень хочется, учусь, хочу со временем добратся до AUFS , ибо у меня очень очень смутное понимание как это работает. И до компиляции со статической линковкой тоже доберусь.
« Последнее редактирование: 05 Октябрь 2023, 15:28:04 от totiks2012 »

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • /dev/hands < /dev/ass
А кто-нибудь docker юзает? Немного не в тему, но многие в него рыпнулись и становится актуальным.
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
А кто-нибудь docker юзает? Немного не в тему, но многие в него рыпнулись и становится актуальным.
ух прикольная штука... опять не смогу уснуть... :)

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34033
  • Репутация: +231/-0
    • PuppyRus-A
Перекомпилить с нужным prefix> --сунулся и понял что пока не дорос
Пробуйте в арче . Там это проще всего
А кто-нибудь docker юзает? Немного не в тему, но многие в него рыпнулись и становится актуальным.
Штука полезная, но не дома

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Улучшил скрипт для скачивания добычи ресурсов для портативной программы используя инструмент apt2sb
улучшил файл генерации LAUNC2 файла , если заработает с ним, то будет работать и в генераторе appimage.
бывае что в  /usr/bin к имени бинарника добавляют например -gtk в лаунчере это следует править руками убрать
 $last_dir и добавить правильное имя бинарника.
Код
#!/bin/bash

echo "введите имя портативной программы которую вы хотите получить"
read nameProg
mkdir ~/portApps
cd ~/portApps
mkdir ./$nameProg
cd ./$nameProg
sudo apt2sb "$nameProg"
sudo mv /$nameProg.sb ./
unsquashfs ./$nameProg.sb
find squashfs-root -mindepth 1 -maxdepth 1 -type d -not -name 'var' -exec mv {} . \;

HERE="$(dirname "$(readlink -f "$0")")"

# Очищаем файл перед заполнением
echo "" > LAUNC2

echo "#!/bin/sh" >> LAUNC2

echo 'HERE="$(dirname "$(readlink -f "$0")")"' >> LAUNC2
echo 'last_dir=$(basename "$HERE")' >> LAUNC2
echo 'usr="$HERE"' >> LAUNC2
echo "#sudo mkdir -p /usr/share/" >> LAUNC2
echo '#sudo mount --bind $HERE/usr/share/$last_dir/ /usr/share/$last_dir/' >> LAUNC2
# Ваша существующая команда запуска audacity
echo "GSETTINGS_SCHEMA_DIR=\$HERE/usr/share/glib-2.0/schemas/ LD_LIBRARY_PATH=\$HERE/usr/lib:\$HERE/usr/lib/x86_64-linux-gnu \$HERE/usr/bin/\$last_dir" >> LAUNC2
chmod +x ./LAUNC2
echo "файлы для портативной программы добыты и перемещены"
echo "не факт что портативка запустится, нужно проверять по зависимостям"
rm -rf ./*.sb ./squashfs-root

если кому нужно будет и у вас дистрибутив с apt2sfs (DebianDog) там apt2sfs использует графику, можно из выше приведеного скрипта взять часть которая отвечает за генерацию скрипта, манипуляции с созданием sfs и распаковкой произвести вручную , далее ту часть скрипта запустить для генерации лаунчера , либо воспользоватся утилитой для создания appimage с сайта puppylinux которую приводил выше https://forum.puppylinux.com/download/file.php?id=2076 и при её работе генрируется  лаунчер портативной программы AppRun . У debian Dog организовано горячее подключение модулей, но я не владею информацие имя, модуля может быть произвольным? можно подключать горячим подключением?Но это уже другая тема. А эту тему закрываю.
upd: Скрипт поместил на всякий во вложении.
« Последнее редактирование: 06 Октябрь 2023, 12:02:09 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
С помощью этого скрипта произвожу добычу ресурсов и создание портативной программы, для этого следует запустить скрипт из любой удобной вам директории домашнего каталога, скрипт запросит имя пакета пропарсит все зависимости которые нужны для вашей портативной программы, распакует *.deb  и сохранит их в каталоге $HOME/portapps/имя_вашего_пакета, после этого cоздаст в каталоге $HOME/portapps/имя_вашего_пакета запускалку LAUNCH из которой и следует запускать вашу портативку. Из непреодоленых трудностей, не удалось избежать ручного созания сиволической ссылки из  $HOME/portapps/имя_вашего_пакета/usr/lib/x86_64-linux-gnu/ имя_вашего_пакета, либо если пакет использует qt то ссылки на qt5 и qt-default, в соотвествующий каталог файловой системы, то есть в /usr/lib/x86_64-linux-gnu/ (создаётся  символическая ссылка в нем имя_вашего_пакета ), подумываю что это можно автоматизировать , но на пару дней возьму тайм-аут, ибо мои шарики зашли за ролики, дам мозгу слегка отдохнуть, теперь код.
Код
#!/bin/bash
set -x
echo "Введи имя пакета"
read package_name
mkdir -p ~/s_module
cd ~/s_module
mkdir -p ~/s_module/"$package_name"
cd ~/s_module/"$package_name"

#package_name=$1
# Проверяем, установлен ли пакет
apt-rdepends $package_name  | grep -v Depends >> deps.txt
apt-rdepends $package_name | grep "Depends" | awk '{print $2}' >>deps.txt
sort -u deps.txt -o deps.txt
# Файл со списком пакетов
depends_file="deps.txt"

# Проходим по списку пакетов
while read -r package; do

  # Проверяем, установлен ли пакет
  if dpkg -s "$package" > /dev/null 2>&1; then
   
    # Удаляем пакет из файла, если он установлен
    sed -i "/$package/d" "$depends_file"
  fi

done < "$depends_file"

sudo cat ./deps.txt >>./deps1.txt
# Путь к файлу со списком зависимостей
deps_file="./deps1.txt"

# Создаем временный каталог для скачивания пакетов
temp_dir="$(mktemp -d)"

# Чтение файла с зависимостями и установка каждого пакета во временный каталог
while IFS= read -r package; do
    apt-get download --allow-unauthenticated --allow-downgrades --allow-remove-essential --allow-change-held-packages -o Dir::Cache::archives="$temp_dir" "$package"
done < "$deps_file"

# Перемещение скачанных пакетов в текущий каталог
mv "$temp_dir"/* .

# Удаляем временный каталог
rm -r "$temp_dir"




# Распаковываем все deb-пакеты в текущей директории
for deb_file in *.deb; do
    sudo dpkg-deb -x "$deb_file" .
done

echo "Все deb-пакеты успешно распакованы"

# Удаляем все deb-пакеты
sudo rm *.deb

echo "Все deb-пакеты успешно удалены"
mkdir -p ~/portapps
cp -r ~/s_module/"$package_name" ~/portapps
cp -r ~/portapps/"$package_name"/usr/share/applications/* ~/portapps/"$package_name"
sudo apt install libglib2.0-bin
sudo cp /home/live/portapps/"$package_name"/usr/share/glib-2.0/schemas/* /usr/share/glib-2.0/schemas/

# Путь для генерации запускатора 
launch_path="/home/live/portapps/$package_name/LAUNCH"

# Генерируем содержимое запускатора, подставляя имя пакета 
cat <<EOF > $launch_path
#!/bin/bash

package_name="$package_name"

sudo mkdir -p /opt/\$package_name 
sudo mount --bind /home/live/portapps/\$package_name /opt/\$package_name
#sudo chown -R $USER:\$USER /opt/\$package_name
sudo glib-compile-schemas /usr/share/glib-2.0/schemas/
export LD_LIBRARY_PATH=/opt/\$package_name/usr/lib:/opt/\$package_name/usr/lib/x86_64-linux-gnu 

/opt/\$package_name/usr/bin/\$package_name "\$@"
EOF

chmod +x $launch_path
sudo rm -rf ~/s_module/*


жду тестов и замечаний, и спасибо еще раз, за поддержку и помощь.
upd: в планах приспособить активатор дезактиватор модулей на peco, то есть сваять менеджер портативных программ.
И да всё это затевалось, в причину что освоил Live-Kit и теперь у меня свой кастомный Debian Linux, абсолютно настроеный под мои нужды и капризы, и захотелось что то вроде модульности ...вот не удержался похвастать ,  Live-Kit штука невероятная, спасибо разрабам этих крутейших утилит https://www.linux-live.org/
« Последнее редактирование: 21 Январь 2024, 07:03:05 от totiks2012 »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34033
  • Репутация: +231/-0
    • PuppyRus-A
С портированием qt5 есть проблемы с оформлением.
При обычной установке оно в ~/.config/qt5ct и работает
На портированных прогах - например virtualbox (родной - универсальный) - нет. Никакими ключами добиться не удалось
Кроме того у qt куча компонентов в /lib/qt . Если перекомпилить это в /opt - проги не найдут
И при незапуске qt проги выдают ошибки, по которым сложно понять чего не хватает

Итог : портирование прог с открытыми исходниками - для ленивых (меня), юзающих несколько дистрибов  и пару простых прог.
Пригодно только для таких простых случаев и простых прог
В остальных лучше запускать в docker по принципу - 1 перекомпиленное приложение = 1 docker. Тогда точно система не сломается

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Итог : портирование прог с открытыми исходниками - для ленивых (меня), юзающих несколько дистрибов  и пару простых прог.
вот к таким же выводам и пришёл

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
В остальных лучше запускать в docker по принципу - 1 перекомпиленное приложение = 1 docker. Тогда точно система не сломается
вот по этой теме , вчера наткнулся на интересный проект https://github.com/fsquillace/junest , по сути это миниатюрная система Arch, если поместить в ~/.bashrc  , export PATH="$PATH:~/.junest/usr/bin_wrappers" позволяет устанавливать например прямо из debian хоста приложения из Arch репы , при этом это чистой воды контейнер, но без гемороя и заморот, установить можно из того же am (консольный инсталятор appimage), junest  там есть ,предупреждение, требует много много места, AUR тоже доступен, на его основе создан Appimage build как разберусь с ним отпишусь тут, если разберусь.
« Последнее редактирование: 24 Январь 2024, 10:03:21 от totiks2012 »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34033
  • Репутация: +231/-0
    • PuppyRus-A
apt2sfs
Юзайте chroot2pfs - будет универсально под любой дистр
Особенно если в apt2sfs не выбора слоя поверх которого выбирать. Тогда получится что наэтом же дистре с другим ДЕ и софтом - работать не будет
чистой воды контейнер, но без гемороя и заморот
chroot2pfs тоже может запускать проги из любых модулей
Т.е. в любом линуксе  собираете chroot из модулей другого линукса и запускаете из него прогу
Сейчас сижу под арчем  и таким способом собираю пакеты под альт
Типа docker-flatpak для бедных

Для фул установки проще поставить пакетами из родной репы
Для фругала - сделать модуль. Можно и портировать если он не сильно затейливый (нет подлиб /lib/прога и пр.) - что я и делаю

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 899
  • Репутация: +24/-0
  • Автор темы
Юзайте chroot2pfs
chroot2pfs использует aufs, как прикрутить ядро с его поддержкой к live-kit не знаю, знаю что это делают, но нет даже зацепки как это сделать, это сложный вопрос  и тебует знаний, если бы я решил вопрос с ядром изначально, то всей этой опупеи с appimage не было бы, а так своебразный альтернативный путь, если даже и тупиковый я должен его пройти...

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34033
  • Репутация: +231/-0
    • PuppyRus-A