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

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

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

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 898
  • Репутация: +24/-0
  • Автор темы
вот последние наработки подсмотрел у  ivan-hc тут https://github.com/ivan-hc/AppImaGen ,его скрипт у меня не заработал, скормил скрипт ИИ вытащил нужное мне связанное с использованием реп Debian, и перепаковкой в appimage выбраного пакета. Скрипт не идеален увы, работает удовлетворительно в процентном соотношении не дотягивая до 40, то есть некоторые пакеты перепаковывает некоторые нет, у некоторых может добыть десктоп файл и картинку,у некоторых нет, если добывает все ресурсы то на выходе Appimage, но наличие Appimage на выходе еще не факт что пакет запустится, потому что у некоторых захардкожена линковка с файловой системой, например как у Liferea, единственый выход это компиляция пакета с линковкой либ внутрь пакета, я не знаю если такое потяну, но пробовать буду.
Но некоторые пакеты скрипт делает, условия:
1. Програмный пакет должен быть на Gtk
2. Забываем про приложения на QT
3. Зависимости пакета не должны быть захардкожены на файловую систему
4.Если сталкиваемся всё таки что  просит что-то из /~app/usr/lib/x86_64-linux-gnu/-можно использовать каталог портативки, используя скрипт LAUNCH вместо бинарника AppRun, и в  LAUNCH экспортировать в PATH запрашиваемые каталоги с библиотеками и схемами, иногда помогает.   
5. Наличие десктоп файла и иконки с прописаным  в нем именем .
   А пока больше идей нет как улучшить ситуацию для ленивого создания самодостаточных пакетов с Appimage, и наверное их и нет, только компиляция.
как использовать
-------------------------------
Для работы программы поместить appimagetool,pkg2appimage  в ~/apptool 
если скрипт их не найдет то скачает их
поместить скрипт repo2app ~/
пример создания appimage c mate-calc
./repo2app mate-calc
на выходе в ~/portapps каталог с портативкой и  mate-calc.Appimage
повторюсь момент важный если десктоп файл не был скопирован скриптом в каталог создаваемой програмы то копируем его вручную из ~/portapps/my_app/usr/share/applications в корень ~/portapps/my_app туда же нужно скопировать иконку в формате png с именем затребованом в секции Icon в  десктоп файле после этого , для теста работы портативки запускаем AppRun , далее если заработало запустить из текущего в терминале по пути текущего каталога вводим команду
Код
ARCH=$(arch) ~/apptool/appimagetool -n ./
и Appimage нашей программы будет собран.
------------------------------------------
вот код скрипта

Код
 #!/usr/bin/env bash
set -x
mkdir -p ~/apptool
cd ~/apptool
# Проверка наличия инструментов
if [ ! -f appimagetool ]; then
  wget -q https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O appimagetool
  chmod a+x appimagetool
fi

if [ ! -f pkg2appimage ]; then
  wget -q https://raw.githubusercontent.com/ivan-hc/AM-application-manager/main/tools/pkg2appimage
  chmod a+x pkg2appimage
fi
# Установка необходимых зависимостей
sudo apt install imagemagick binutils

# Создание временной директории
mkdir -p tmp
cd tmp



# Создание файла рецепта
echo "app: $1
ingredients:" > recipe.yml

cat >> recipe.yml <<EOF
  dist: debian
  arch: $(arch)
  sources:
    - deb http://deb.debian.org/debian/ stable main contrib non-free 
    - deb http://deb.debian.org/debian/ stable-updates main contrib non-free
    - deb http://security.debian.org/debian-security stable/updates main contrib non-free
  packages: 
    - $1 
EOF

# Скачивание пакетов и сборка APPDIR
~/apptool/pkg2appimage ./recipe.yml   

# Копируем каталог с ресурсами в ~/portapps
echo "Копируем каталог с ресурсами в ~/portapps "
mkdir -p ~/portapps/$1.AppDir
cp -r ./$1/$1.AppDir ~/portapps/
cd ~/portapps/$1.AppDir
# Имя файла из десктоп-файла
#requested_filename=$(grep -oP '(?<=Icon=).*' ~/portapps/$1.AppDir/usr/share/applications/*.desktop)
#requested_filename=$(grep -m 1 Icon ~/portapps/$1.AppDir/usr/share/applications/*.desktop | cut -d '=' -f 2)
requested_filename=$(grep -m 1 -o '^Icon=.*' *.desktop | cut -d '=' -f 2-)
echo "$requested_filename"
# Переименовываем app.png
#cd ~/portapps/$1.AppDir
image="$(find /usr/share/icons/gnome/48x48/apps/ -name "$requested_filename.png")"
# Добавляем изображение app.png в ~/portapps/$1.AppDir
cp "$image" ~/portapps/$1.AppDir/

# Применяем glib-compile-schemas к каталогу с ресурсами
echo "Применяем glib-compile-schemas к каталогу с ресурсами"
sudo glib-compile-schemas ~/portapps/$1.AppDir/usr/share/glib-2.0/schemas/

# Создаем заглушку png
#touch ~/portapps/$1.AppDir/${1,,}.png

# Сборка AppImage
ARCH=$(arch) ~/apptool/appimagetool -n ~/portapps/$1.AppDir

cd ~/portapps/$1.AppDir
chmod a+x *.AppImage
cd ~/apptool
rm -rf ./tmp

upd: Буду безмерно благодарен если кто подскажет или предложит как решить обозначеные проблемы ( но мне кажется что решения тут нет , тут нужно собирать автомат который собирает исходники и из них компилирует программу с опцией RPATH (run path) - путь поиска разделяемых библиотек, встроенный в исполняемый файл то есть внутрь каталога с портативкой)
« Последнее редактирование: 25 Январь 2024, 22:03:37 от totiks2012 »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 34026
  • Репутация: +231/-0
    • PuppyRus-A
идей нет как улучшить ситуацию для ленивого создания самодостаточных пакетов с Appimage, и наверное их и нет, только компиляция.
Если это
есть утилита https://github.com/NixOS/patchelf c помощью которой можно менять в бинарниках и либах пути к зависимым либам
не поможет - думаю - только компиляция и то не везде
Что-то сложное проще будет запускать в докере или нашем chroot2pfs в родном окружении
На самом деле почти весь жирный  софт почти во всех дистрах есть. Если во фругале работает ПМ - проще всего сделать модуль только под свой дистр

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 898
  • Репутация: +24/-0
  • Автор темы
от уныния до воодушевления тоже один шаг... Завел liferea . Пробросил символические ссылки из
~/portapps/liferea/usr/lib/x86_64-linux-gnu/* в /usr/lib/x86_64-linux-gnu/
~/portapps/liferea/usr/share/glib-2.0/schemas/net.sf.liferea.gschema.xml  в /usr/share/glib-2.0/schemas/
~/portapps/liferea/usr/share/liferea/ в /usr/share/
перекомпилил sudo glib-compile-schemas /usr/share/glib-2.0/schemas/
и вуаля
Автоматизировать бы это но имея дело с корнем стрёмно , крайне высока вероятность сломать что нить, но способ рабочий, ибо делал всё через ln -s другие способы создания символических ссылок опасны ибо заменяют существующие, этот не заменяет, проговариваю это для новичков... и своего склероза...
на всякий пожарный пробросил ссылки и на каталог с QT компонентами, но c qbittorrent так и не удалось решить вопрос с иконками, но мне так даже больше нравится, ибо у QT интерфейс китайской ёлки, остальные пунктыы меню те что текстом прекрасно отображаются программа работает, для добычи ресурсов, и создания appimage, кому нужно и если кто то желает себе такого веселья какое я себе устроил эти три недели, то берите последний скрипт тот что использует pkg2appimage и apptool, ресурсы добывает, а с их запуском нужно повозится...
напоследок приведу код который помогает делать символические ссылки , запрашивает последовательно пути откуда и куда,скрипт сканирует каталог на битые ссылки если находит удаляет их , и создаёт ссылку
Код
#!/bin/bash
set -x
echo "ВНИМАНИЕ!!! КРАЙНЕ ОСТОРОЖНО!!! УКАЖИТЕ ПУТЬ ОТКУДА СОЗДАТЬ СИМВОЛЬНУЮ ССЫЛКУ!"
read name_dir
# Сканирование /usr/lib/x86_64-linux-gnu/ и удаление брошенных символических ссылок
#target_dir="/usr/lib/x86_64-linux-gnu/"
#target_dir=$(echo "$name_pack" | awk -F '/' '{print "/"$6"/"$7"/"$8}')
echo "ВНИМАНИЕ!!! КРАЙНЕ ОСТОРОЖНО!!! УКАЖИТЕ ПУТЬ КУДА СОЗДАТЬ СИМВОЛЬНУЮ ССЫЛКУ!"
read target_dir
while IFS= read -r file; do
    if [ -L "$target_dir$file" ] && [ ! -e "$target_dir$file" ]; then
        echo "Удаляется брошенная символическая ссылка: $target_dir$file"
        sudo rm "$target_dir$file"
    fi
done < <(sudo find "$target_dir" -type l -exec basename {} \;)

sudo ln -s "$name_dir"/* "$target_dir"

echo "Сылка из каталога $name_pack в $target_dir cоздана"
за сим откланиваюсь.

upd: вот код который автоматизирует пробросс ссылок на библиотеки из портативной программы
Код
 #!/bin/bash
set -x

echo "ВНИМАНИЕ!!! КРАЙНЕ ОСТОРОЖНО!!! УКАЖИТЕ ИМЯ КАТАЛОГА ПОРТАТИВНОЙ ПРОГРАММЫ!"
echo "пример: Имя каталога--liferea.AppDir"
echo "вводим имя каталога--liferea "
read name_dir


libs="$HOME/portapps/$name_dir.AppDir/usr/lib/x86_64-linux-gnu/"
target_dir="/usr/lib/x86_64-linux-gnu/"
# Удаление брошенных символических ссылок в /usr/lib/x86_64-linux-gnu/
while IFS= read -r file; do
    if [ -L "$target_dir$file" ] && [ ! -e "$target_dir$file" ]; then
        echo "Удаляется брошенная символическая ссылка: $target_dir$file"
        sudo rm "$target_dir$file"
    fi
done < <(sudo find "$target_dir" -type l -exec basename {} \;)

# Удаление брошенных символических ссылок в /usr/share/
shtarget_dir="/usr/share/$name_dir"
shares="$HOME/portapps/$name_dir.AppDir/usr/share/$name_dir"

while IFS= read -r file; do
    if [ -L "$file" ] && [ ! -e "$file" ]; then
        echo "Удаляется брошенная символическая ссылка: $file"
        sudo rm "$file"
    fi
done < <(sudo find "$shtarget_dir" -type l)

echo "Процесс удаления брошенных символических ссылок завершен."

# Создание символических ссылок
sudo ln -s "$libs"/* /usr/lib/x86_64-linux-gnu/
sudo mkdir -p /usr/share/"$name_dir"
sudo ln -s "$shares"/* /usr/share/"$name_dir"

echo "Ссылка созданны! "
 
   если при запуске из текущего приложение не заведется с ./AppRun либо из бинарника
то запускаем linkator2
и вводим имя программы только имя
например если каталог с именем -- mate-calc.AppDir
то вводим в linkator2   при запросе  имени  mate-calc
после этого программа должна запустится, если нет то по примеру скрипта либо дописываем в скрипт , либо вручную
с ln -s пробрасываем нужные ссылки, но как показывает практика достаточно перечисленых в скрипте.
« Последнее редактирование: 27 Январь 2024, 23:51:19 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 898
  • Репутация: +24/-0
  • Автор темы
 :) Хочу привести еще один скрипт для создания портативных пакетов , этот скрипт более универсальный чем тот что использую в  представленном мной респине debian12, ибо более лучще обрабатывает зависимости. Это в причину что использует более лучший алгоритм для определеня зависмостей к пакету который использует  нативный список реп из source.list , и их не нужно прописывать дополнительно как в прошлом скрипте.  Хочу заметить что создание портативных программ   дело не простое, то есть даже этот скрипт не со всеми пакетами справляется, особенно например он не любит те что на электроне , ту же liferea можно сделать не с этим скриптом а с тем что в респине repo2sb, в любом случае два инструмента лучше чем один, потому то что не умеет один сделает другой, скрипт который представляю например прекрасно умеет собирать ресурсы для таких программ как  qbittorrent и libreoffice, есть тяжелые случаи когда не справляются оба, тогда я ищу работающую альтернативу, вместо lferea это rss reader кто не в курсе, я выбрал консольный newsboat ,он по мне очень быстрый и удобный оказался. скрипту дал название ow-apt2sb чтоб отличить от других похожих.
Запускать в терминале по пути ~/ скрипт там же
Код
./ow-apt2sb libreoffice

если нужно скрипт может обработать несколько имен и включит их в один общий модуль например
Код
./ow-apt2sb qbittorren qbittorren-nox

вот код
Код
#!/bin/bash

#set -x

# Проверка наличия аргумента
if [ -z "$1" ]; then
    echo "Использование: $0 <package_name>"
    exit 1
fi

# Имя пакета
package_name="$1"

cd ~/portapps
rm -rf ./$1
# Каталог для создания портативного приложения
app_dir="$HOME/portapps/$package_name"

# Создание каталога
mkdir -p "$app_dir"

# Файл для хранения ссылок
url_file="$(mktemp)"

# Скачивание deb-пакетов и зависимостей

apt-get install --download-only --print-uris $package_name | grep -o 'https\?://\S*\.deb' > "$url_file"

# Скачивание файлов из списка
wget -P "$app_dir" -i "$url_file"

# Удаление файла со списком ссылок
rm "$url_file"

# Распаковка deb-пакетов
for deb in "$app_dir"/*.deb; do
    dpkg-deb -x "$deb" "$app_dir"
done

# Удаление deb-пакетов
rm "$app_dir"/*.deb

echo "Портативное приложение $package_name создано в $app_dir"
cd "$app_dir/usr/share/"
rm -rf ./fonts
rm -rf ./locale
rm -rf ./doc
rm -rf ./man

cd $HOME/portapps/

mksquashfs ./"$1" ./"$1".sb -comp gzip -b 256K -Xcompression-level 9


полученные модули будут в ~/portapps их перместить в ~/modules подключать менеджером подключения модулей скриптом отсюда https://forum.puppyrus.org/index.php?topic=24216.msg188853#new  этот способ строго для Debian-о подобных дистрибутивах (проверил на Debian, Mx linux, runtu, на рунту, не все зависимости подтянул но пакет не заработал, сам скрипт работает, но если разобраться чего не хватает каких зависимостей , то заработает)
« Последнее редактирование: 23 Май 2024, 20:55:27 от totiks2012 »