LINUX.ORG.RU

Как сохранять конфиг программы в .appimage контейнере?

 , , , ,


0

2

Прога на C++ раньше сейвила конфиг в той же директории что и сам экзешник, но теперь в .appimage она может прочитать конфиг, только если он уже запакован в контейнер, а создать заново с нуля его она не может.

Программа становится ридонли и виртуально куда-то монтируется со всеми файлами? А как тогда хранить конфиг для такой проги?

Если прога проприетарная и не поддаётся изменению, делай симлинк на файл в /tmp, а оттуда — в хомяке. Я так игрушки в squashfs запаковываю, если они под себя сохранениями срут, а не куда положено (к счастью, таких мало).

И да, конечно, SquashFS ридонли.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)

AppImage - не контейнер.

Программа становится ридонли и виртуально куда-то монтируется со всеми файлами?

AppImage - это только формат. Он может и монтироваться и распаковываться и т.д.. Но да, обычно он монтируется в /tmp в ro (read only).

А как тогда хранить конфиг для такой проги?

Так по стандарту его же надо хранить в ~ в скрытом файле. И проги, собранные в AppImage, хранят их там же.

Но если это какое-то требование, чтобы конфиг лежал рядом с исполняемым файлом, то для пользователя исполняемый файл - это AppImage, и создавать конфиг надо рядом с ним. Узнать, куда пользователь его положил - читать переменную окружения $APPIMAGE.

damix9 ★★★
()
Ответ на: комментарий от Dr64h

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

damix9 ★★★
()
Ответ на: комментарий от peregrine

Естественно.

Для любителей срать в папок и мамок обычно делается ключ специальный. Либо, когда планируется юзать много конфигов или как-то их таскать, делается так: сначала конфиг ищется в текущем каталоге, если там нет, то в $XDG_CONFIG_HOME (~/.config), если и там нет, то в /etc.

Безальтернативно срать в каталог с бинарником — это худшее, что можно придумать.

CrX ★★★★★
()
Ответ на: комментарий от anonymous

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

peregrine ★★★★★
()
Ответ на: комментарий от CrX

Это порт игрушки для винды. Там типа в папке с игрой сейвы и реплеи в своих папках. Хотелось бы выяснить откуда запустился .appimage чтобы записать файлы в папку с игрой

HPW-dev
() автор топика
Ответ на: комментарий от peregrine

я такой софт на внешнем винте храню

Обычно помогает переопределение переменных перед запуском приложения. По крайней мене на PortableApps приложения для Windows в основной массе так запаковывают. Если приложение ищет свои данные по каким-то захардкоженным путям, то тут уже другая магия нужна.

Radjah ★★★★★
()
Ответ на: комментарий от damix9

Если я получаю путь через argv[0] или /proc/self/exe, то получаю путь экзешника из /tmp, а туда писать конфиг нельзя

Если записывать файл в ./ то он запишется откуда был запущен, но запустить можно откуда угодно и тогда конфиг не будет в папке с .appimage

При сохранении в $APPIMAGE/ ошибка

HPW-dev
() автор топика
Ответ на: комментарий от HPW-dev

Создай вместо этих каталогов симлинки на /tmp/gamename/saves и /tmp/gamename/replays. А /tmp/gamename создавай при запуске — симлинк на $HOME/.local/share/gamename. Тогда сейвы и реплеи будут храниться в хомяке прозрачно для юзера.

Ну типа, в AppRun:

#.....

# вот эти две строки измени, остальное можно оставить как есть.
GAMENAME="названиеигры"
GAMESTART="./gameexecuteable.x86_64"

[ -z "$XDG_DATA_HOME" ] && export XDG_DATA_HOME="$HOME/.local/share"
GAMEDATA="$XDG_DATA_HOME/$GAMENAME"

# create data dirs for the game in ~
mkdir -p "$GAMEDATA/saves" "$GAMEDATA/replays"

# remove symlink if it already exists for some reason
rm /tmp/gamename 2> /dev/null

# create the symlink
ln -s "$GAMEDATA" "/tmp/$GAMENAME"

# start the game
$GAMESTART

В самом каталоге с игрой, перед запаковкай сделай так, чтобы вместо каталога сейвов был симлинк на /tmp/названиеигры/saves, а вместо каталога с реплеями — симлинк на /tmp/названиеигры/replays/save

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 3)
Ответ на: комментарий от CrX

Нашёл фикс, надо первый раз запускать прогу через —appimage-portable-config и потом сейвить файлы в XDG_CONFIG_HOME Таким образом конфиг всегда будет лежать не у юзера в хомяке, а в папке gamename.config рядом с .appimage

HPW-dev
() автор топика
Ответ на: комментарий от HPW-dev

То есть игра МОГЛА сохранять в хомяк?..

Тебе надо научиться более точно формулировать суть проблемы. Мне всё это время казалось, что проблема в том, что игра срёт под себя, и надо заставить её сохранять в хомяк. А у тебя чуть ли не наоборот…

CrX ★★★★★
()