Ruby Gems с постоянными данными

Я хочу создать приложение ruby ​​(не rails). Это консольное приложение, в котором необходимо сохранить некоторые данные. Я использую pstore в качестве базы данных. Я хочу развернуть это приложение как жемчужину.

У меня вопрос: где живут мои данные?

В настоящее время я создал каталог данных как аналог каталога bin в стандартном макете драгоценного камня. Поэтому я ожидал, что гем будет хранить свои данные «внутри себя» после развертывания. Но когда я выполняю локальную установку гемов для тестирования, я обнаруживаю, что данные хранятся локально в файлах проекта, а не где-то внутри каталога драгоценных камней.

Конечно, может быть, я просто неправильно понимаю, что делает rake install_gem. Кроме того, меня смутно беспокоит, что если мне понадобится sudo для установки гема, он действительно сможет создать файл данных «внутри себя» в каталоге гема.

Может кто-нибудь немного прояснить это?

Спасибо. Джон Шэнк

@makevoid - спасибо за ответ. Вот мой основной сценарий целиком. В каталоге / bin ... (Я добавил его к основному вопросу, потому что я не знаком с форматированием содержимого в комментарии - и вставленный код выглядел ужасно.

#!/usr/bin/env ruby

$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'

require 'timesheet'

begin
  command_hash = TimesheetParser.parse
  store = YAML::Store.new("data/time_entries.yaml")
  tl = TimeLog.new(store)
  ts = Timesheet.new(tl)
  ts.process(command_hash)
rescue Exception => e
  raise if command_hash[:debug]
  puts e.message

person jschank    schedule 02.01.2010    source источник
comment
Можете ли вы распечатать и сообщить нам путь, по которому ваш файл PStore сохраняется и загружается? Это ваш основной путь загрузки драгоценного камня? (gem env чтобы разобраться)   -  person makevoid    schedule 02.01.2010
comment
Я добавил детали к исходному сообщению, потому что комментарии, похоже, не обладают такими широкими возможностями редактирования.   -  person jschank    schedule 03.01.2010
comment
Хорошо, похоже, я хочу использовать ответ, отправленный Йоханнесом, и, вероятно, сделать что-то вроде поиска ENV [timesheet_home], чтобы пользователи могли переопределить местоположение, вернуться к ENV [HOME] плюс какое-то стандартное местоположение, как в ответе Йоханнеса. И потерпеть неудачу с объяснением, если ни то, ни другое не установлено. Спасибо всем, кто ответил!   -  person jschank    schedule 03.01.2010


Ответы (2)


В Linux есть два часто используемых места для хранения переменных данных.

/home/user/.application

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

ENV["HOME"] + "/." + $application_name

/ var / lib / приложение

Если все пользователи совместно используют хранилище или приложение предназначено для запуска только одним пользователем (большинство демонов), / var - подходящее место для хранения всех типов данных.

  • /var/log для журналов
  • /var/run для pid
  • /var/lock для файлов блокировки
  • /var/www для httpсерверов
  • /var/tmp для неважных, но постоянных данных
  • /var/lib для всех остальных данных

Путь к вашему хранилищу в / var должен быть

"/var/lib/" + $application_name

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

person johannes    schedule 02.01.2010
comment
Я думал о том, чтобы сделать что-то подобное, но меня беспокоило, что это не сработает в Windows. Есть ли другой поворот в этой теме, чтобы сделать ее кроссплатформенной? Или эта техника будет работать и с окнами? (Определяет ли Windows переменную среды HOME заранее?) - person jschank; 03.01.2010
comment
Кроме того, правильно ли я прочитал, что appdata находится в каталоге dotfile, когда находится в пользовательском пространстве, но в общем он идет в папку без dotfile для / var / lib? или это должно быть /var/lib/.application? Спасибо! Джон - person jschank; 03.01.2010
comment
Верно. Dotfiles - это скрытые файлы в unix. Таким образом, пользователь обычно не видит эти файлы конфигурации в своем домашнем каталоге. Нет смысла делать их невидимыми в / var / lib. - person johannes; 03.01.2010
comment
Именно так, как я думал, когда читал вопрос. Однако вопрос о Windows вызвал у меня любопытство. Что было бы там хорошей практикой? Я далеко от мира Windows. - person Priit; 03.01.2010
comment
Я знаю, что это старый, но я только что открыл irb в Windows 7, и ENV [HOME] предоставил мне мой домашний каталог. Однако не уверен в других версиях Windows. - person Justin; 15.10.2013

Вы определенно не хотите хранить данные в каталоге драгоценных камней. Ожидаемое поведение состоит в том, что пользователи могут без проблем удалять и переустанавливать драгоценные камни. Если у вас есть данные в установленном каталоге вашего драгоценного камня, удаление драгоценного камня уничтожит эти данные и разозлит ваших пользователей.

У Йоханнеса есть правильные идеи для использования в Linux. Для Mac конкретные каталоги будут немного другими. То же самое и с Windows. Вам нужно будет изучить, какие места подходят для каждой платформы, на которую вы хотите настроить таргетинг, и попросить ваш код условно переключать места хранения в зависимости от того, на каком хосте он работает.

Не забудьте разрешить пользователям отменять ваши настройки по умолчанию. Способ сделать это сделает их очень счастливыми :)

person edebill    schedule 02.01.2010
comment
Хм, насчет удаления, это имеет смысл. Однако я не уверен, как в этом случае изменить значение по умолчанию. Если пользователь не делает что-то вроде установки переменной среды. Поскольку приложение создаст хранилище данных в каком-то месте, и каждая вызываемая команда должна будет вернуться в это место. (и я не хочу указывать местоположение хранилища данных с каждой командой) Кто-нибудь знает, как определить платформу выполнения во время выполнения в ruby? - person jschank; 03.01.2010
comment
есть константа RUBY_PLATFORM, которая должна позволить вам определять платформу. Переменные среды - отличный способ позволить людям переопределить значения по умолчанию. В конце концов, если они отменяют значения по умолчанию, они должны быть более опытным пользователем, который может справиться с чем-то подобным. - person edebill; 03.01.2010