【问题标题】:Ruby Gems with Persistent data具有持久数据的 Ruby Gems
【发布时间】:2010-01-02 07:21:51
【问题描述】:

我想创建 ruby​​ 应用程序(不是 rails)。这是一个控制台应用程序,需要保留一些数据。我使用 pstore 作为数据库。我想将此应用程序部署为 gem。

我的问题是:我的数据在哪里?

目前,我在标准 gem 布局中创建了一个数据目录作为 bin 目录的同级目录。因此,我希望 gem 在部署后将其数据存储在“内部”。但是当我进行本地 gem 安装进行测试时,我发现数据存储在本地项目文件中,而不是 gems 目录中的某个位置。

当然,我可能只是误解了“rake install_gem”在做什么。另外,我隐约担心如果我需要 sudo 来安装 gem,它实际上将能够在 gem 目录中“内部”创建数据文件。

有人可以澄清一下吗?

谢谢。 约翰·尚克

@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

【问题讨论】:

  • 您能打印出来并告诉我们您的 PStore 文件保存-加载的路径吗?这是您的主要宝石加载路径吗? (gem env 搞清楚)
  • 我在原帖中添加了细节,因为cmets似乎没有那么丰富的编辑能力
  • 好的,所以看起来我想使用 Johannes 发布的答案,并且可能会执行类似查找 ENV["timesheet_home"] 之类的操作,以便用户可以覆盖位置,回退到 ENV["HOME "] 加上约翰内斯的回答中的一些标准位置。如果两者都没有设置,则失败并给出解释。谢谢所有回复的人!

标签: ruby linux file gem


【解决方案1】:

在 Linux 上,有两个常用的位置用于存储可变数据。

/home/user/.application

如果每个用户都需要自己的存储空间,这通常在用户主目录中完成。您在用户主目录中的存储路径应该是

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

/var/lib/应用程序

如果所有用户共享存储,或者应用程序仅由一个用户(大多数守护程序)运行,/var 是存储所有类型数据的正确位置。

  • /var/log 用于日志
  • /var/run 用于 pid 的
  • /var/lock 锁定文件
  • /var/www 用于 httpservers
  • /var/tmp 用于不重要但持久的数据
  • /var/lib 用于所有其他数据

/var 中的存储路径应该是

"/var/lib/" + $application_name

确保此目录的权限是这样的,您不必让您的应用程序以 root 身份运行。

【讨论】:

  • 我曾想过做这样的事情,但我担心它在 Windows 上不起作用。这个主题是否有不同的转折使其跨平台?还是这种技术也适用于 Windows? (windows 是否预定义了“HOME”环境变量?)
  • 另外,我是否没看错,因为 appdata 在用户空间中时位于 dotfile 目录中,但在共享时它位于 /var/lib 的非 dotfile 文件夹中?还是应该是/var/lib/.application?谢谢!约翰
  • 没错。点文件是 unix 中的隐藏文件。所以用户通常不会在他的主目录中看到这个配置文件。让它们在 /var/lib 中不可见是没有意义的。
  • 就像我在阅读问题时认为的那样。然而,关于 Windows 的问题让我很好奇。那里有什么好的做法?我远离 Windows 世界。
  • 我知道这是旧的,但是我刚刚在 Windows 7 中打开了 irb,ENV["HOME"] 给了我我的主目录。不过不确定其他版本的 Windows。
【解决方案2】:

您绝对不想将数据存储在 gem 目录中。预期的行为是用户可以毫无问题地卸载和重新安装 gem。如果您的 gem 的安装目录中有数据,卸载 gem 会破坏该数据并激怒您的用户。

johannes 有在 Linux 上使用的正确想法。对于 Mac,特定目录会有所不同。 Windows 也是如此。您需要研究您想要定位的每个平台的正确位置,并让您的代码根据运行的主机类型有条件地切换存储位置。

不要忘记让用户覆盖您的默认设置。这样做的方法会让他们非常高兴:)

【讨论】:

  • 嗯,关于卸载,这是有道理的。但是,我不确定在这种情况下如何覆盖默认值。除非用户执行设置环境变量之类的操作。因为应用程序将在某个位置创建数据存储,并且调用的每个命令都需要返回到该位置。 (而且我不想用每个命令指定数据存储位置)有谁知道如何在运行时确定执行平台,在 ruby​​ 中?
  • 有一个常量 RUBY_PLATFORM 可以让你确定平台。环境变量是让人们覆盖默认值的绝佳方式。毕竟,如果他们覆盖了默认值,他们应该是一个更成熟的用户,可以处理类似的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2018-12-14
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多