LINUX.ORG.RU

Как вы находите ресурсы?


0

0

Как бы находите в вашем приложении путь к папке share после инсталляции? Система сборки cmake, необходима поддержка запуска прямо из папки с исходниками и обычный режим с инсталляцией. На данный момент передаю в директиву в config.h. Формируется что-то вроде /usr/share/myapp. Нужно без велосипедов обезпечить запуск уже после mаke.

★★★★★

Меня торкнуло.

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

Перефразирую.

Кто-то скачал архив с моей программой. Распаковал.

/home/user/myapp/ - папка с исходниками.

Пользователь набирает make. Появляются бинарники. Они работают и находят файлы ресурсов для своей работы как раз в том же каталоге.

Когда пользователь после этого набирает make install, то программа ставится в /usr и работает оттуда. Но теперь она лежит в /usr/bin и находит свои русурсы в /usr/share/myapp.

Как самым простым способом проверить _в_каком_режиме_работает_программа - в установленном или в отдельной папке.

Я могу придумать кучу жутких решений. Например проверить начитается ли путь к моей программе на /usr/bin, или при инсталляции делать пометки в конфигах. Если такие подходы правильные, то скажите что «да» и я пойду так делать.

Использую cmake, поэтому сразу начал смотреть исходники supertux для примера, потому что они были на cmake как раз валялись на винте. Там вообще physfs намутили.

Сейчас пока смотрю GNU Hello, потому что на cmake внятного ничего не нашел.

vertexua ★★★★★ ()

> Как бы находите в вашем приложении путь к папке share после инсталляции?

зависит от приложения. обычно передаю путь при сборке через -DPKGDATADIR.

если надо уметь и оттуда, и из текущей папки — то, соответственно, делаю поддержку возможности поиска ресурсов в текущей папке.

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

> Как самым простым способом проверить _в_каком_режиме_работает_программа - в установленном или в отдельной папке.

искать ресурсы сначала в текущей папке (или в папке с бинарником), затем в /usr/share.

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

Просто мне это не очень нравится. Лучше всегда знать пути четко, потому что файлы ведь можно не только читать, а и создавать - это раз. А во-вторых программа может быть установлена, но пользователь занимается модификацией исходного кода и версия бинарника в начальной папке новее, но после установки может начать подхватывать ресурсы из /usr/share, которые могут уже не подходить.

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

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

> Как самым простым способом проверить _в_каком_режиме_работает_программа - в установленном или в отдельной папке.

1) if (strncmp(argv[0], «/usr/», 5) == 0) { /* installed */ } else { }

2) if (access(«Makefile», F_OK) != 0) { /* installed */ } else { } ;)

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

ха, кстати, юмор юмором, но ведь можно и наоборот: if (access(«/usr/share/my-app/resources/some-resource.docx», F_OK) == 0) … :)

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

Ну вот в целом, где можно почитать о работе с файлами и ресурсами, их нахождении в open-source проектах, которые рассчитаны на разработку через git, bazaar. Тоесть как это происходит, как происходит поиск фалов в branch, если она не устанавливается, а просто лежит в своей папке? Как это совмещается с инсталляцией и упаковкой для конечного пользователя?

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

у нас велосипед

мы пишем на qt

qmake раскладывает по папкам как надо все сам. Да и есть макросы для конценой сборки и для тестов

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

Но файлы то надо как-то открывать и создавать. Если вам нужно создать файл рядом с ресурсами, то как вы это делаете?

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

vertexua ★★★★★ ()

Добавь опцию или переменную окружения. Создай launch.sh, который делает что-нибудь вроде

cd "$(dirname $0)/src"
MYAPP_DATA="$(dirname $0)/data" ./myapp
Davidov ★★★★ ()
Ответ на: комментарий от vertexua

> Тоесть как это происходит, как происходит поиск фалов в branch, если она не устанавливается, а просто лежит в своей папке?

в текущем моем проекте — поиск производится только в datadir (/usr/....). т.е. да, после каждой модификации файлы надо туда копировать.

в одном из старых проектов — часть файлов обязательно была в /usr, путь к остальным ресурсам указывался в конфиге.

насчет вопросов типа «как создавать файлы в /usr» — мне как-то дико. для контента, который программа создает, есть $HOME.

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

> насчет вопросов типа «как создавать файлы в /usr» — мне как-то дико. для контента, который программа создает, есть $HOME.

Конечно, это я просто так говорю. Теоретически такая потребность может возникнуть

vertexua ★★★★★ ()

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

Deleted ()
Ответ на: комментарий от waker

> Ну вот в целом, где можно почитать о работе с файлами и ресурсами, их нахождении в open-source проектах, которые рассчитаны на разработку через git, bazaar. Тоесть как это происходит, как происходит поиск фалов в branch, если она не устанавливается, а просто лежит в своей папке? Как это совмещается с инсталляцией и упаковкой для конечного пользователя?

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

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

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

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

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

У меня отходняк после шока, испытываемого после попытки упаковки своего проекта в deb так, чтобы оставалась возможность разработки в локальном каталоге.

Сдесь С++, а я уже привык все в jar и

InputStream propStream = myproject.MyClass.class.getResourceAsStream( "hello.png" );

А тут кастомные костыли.

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

Тут уже предложили кучу вариантов. Все - костыли. Я такие могу за 5 минут придумать. Просто ищу _стандарт_ - pattern. Просто надеюсь, что публикации есть. Пока не смог сделать успешный запрос в Гугл, все не то.

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

окей, вот паттерн:

создаешь в каталоге проекта папку src и share, в последней ресурсы в первой исходники и (в будущем) бинарники

делаешь ../, как тебе уже сказали ранее

воила?

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

Корректно ли думать, что share и bin на одном уровне в дереве каталогов на Unix системах?

Я не говорю о не Unix, потому что приложение глубоко-гномовое.

Короче пока что сделаю install only. Кого нервирует постоянный install, пусть поставят один раз, а потом заменят все на симлинки. Там файлов не много, в основном все в sqlite3 и gconf

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

>У меня отходняк после шока, испытываемого после попытки упаковки своего проекта в deb так, чтобы оставалась возможность разработки в локальном каталоге.

Мсье определенно знает толк кое в чем

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

Думаю логичнее вместо секаса с мозгом целый день лучше мне было еще кода по делу написать.

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

> Корректно ли думать, что share и bin на одном уровне в дереве каталогов на Unix системах?

Нет. В третий раз тебе говорю (раз ты так полохо читаешь) - используй префиксы.

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

> Там файлов не много, в основном все в sqlite3 и gconf

ты базы в /usr/share кидаешь?

static_lab ★★★★★ ()

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

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

>потому что файлы ведь можно не только читать, а и создавать
ЩИТО? создавать файлы в /usr/share ? да кто ж твою программу от рута будет запускать?

грамотней всего читать из
1) ~/.myapp/ или ~/.myapp/share
2) ./share/ (но я бы так не делал)
3) ../share (тут включается и случай с расположением программы в /usr/bin, и в /usr/local/bin, и в ~/devel/suxx/myapp/src, и в ~/devel/suxx/myapp/bin)

создавать файлы можно только в ~/.myapp/

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

но, как уже сказали - лучше всего получать это через опции
а по умолчанию считать так, как написал я.

xydo ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.