2010-01-02 35 views
5

我想創建ruby應用程序(不是rails)。這是一個控制檯應用程序,它需要保存一些數據。我使用pstore作爲數據庫。我想將這個應用程序部署爲一個寶石。帶持久數據的Ruby Gems

我的問題是:我的數據在哪裏?

目前我已經創建了一個數據目錄作爲兄弟的bin目錄在一個標準的寶石佈局。因此,我認爲,在部署之後,寶石會將其數據存儲在「內部」。但是當我做一個本地gem安裝測試時,我發現數據被本地存儲到項目文件中,而不是在gems目錄中的某處。

當然,這可能是我誤解了「rake install_gem」在做什麼。另外,我隱約擔心,如果我需要sudo來安裝gem,它實際上能夠在gem目錄中「在它自己內部」創建數據文件。

有人可以澄清這一點嗎?

謝謝。 John Schank

@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 
+0

你能打印出來,並告訴我們你的PStore文件正在保存加載的路徑嗎?這是否是您的主要寶石加載路徑? (* gem env *弄明白了) – makevoid 2010-01-02 09:18:09

+0

我在原帖中添加了詳細信息,因爲評論似乎沒有那麼豐富的編輯功能 – jschank 2010-01-02 21:43:08

+0

好吧,所以看起來我想用Johannes發佈的答案,並且可能會做一些類似於查找ENV [「timesheet_home」]的內容,以便用戶可以覆蓋位置,回退到ENV [「HOME」]以及一些標準位置,如Johannes的答案。如果兩者都沒有設定,那就解釋失敗。 謝謝大家誰回覆! – jschank 2010-01-02 22:36:29

回答

11

在Linux上常見的有兩種。用於存儲可變數據使用的位置。

/home/user/.application

如果每個用戶都需要它自己的存儲,這通常是在用戶的主目錄完成。路徑爲存儲在用戶的主目錄應be

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 

確認,該目錄的權限是這樣的,你不必讓你的應用程序運行的根。

+0

我曾想過做這樣的事情,但我擔心它不能在Windows上工作。這個主題有不同的轉折點,讓它跨平臺嗎?或者這種技術也可以在Windows上工作? (Windows是否預先定義了一個「HOME」環境變量?) – jschank 2010-01-02 21:44:40

+0

另外,我是否正確地閱讀了這一點,因爲appdata在用戶空間中進入dotfile目錄,但是在共享中,它會進入非dotfile文件夾在/ var/lib中?或者應該是/var/lib/.application? 謝謝! 約翰 – jschank 2010-01-02 21:46:14

+0

沒錯。點文件是unix中的隱藏文件。所以用戶通常不會在他的主目錄中看到這個配置文件。在/ var/lib中使它們不可見是沒有意義的。 – johannes 2010-01-03 14:54:52

0

你絕對不想將數據存儲在gem目錄中。預期的行爲是用戶可以卸載並重新安裝寶石沒有任何問題。如果您的寶石安裝目錄中有數據,則卸載該寶石將會破壞該數據並將您的用戶取消。

johannes在Linux上有正確的使用想法。對於Mac,特定的目錄會有所不同。 Windows也是如此。您需要研究您想要定位的每個平臺的正確位置,並根據運行的主機類型有條件地切換存儲位置。

不要忘記讓用戶覆蓋默認設置。一個方法來做到這一點將使他們非常高興:)

+0

嗯,關於卸載,這是有道理的。 但是,我不知道如何在這種情況下覆蓋默認值。除非用戶做了類似設置環境變量的事情。因爲應用程序將在某個位置創建數據存儲區,並且每個調用的命令都需要返回到該位置。 (我不想指定每個命令的數據存儲位置) 有誰知道如何在運行時確定執行平臺,在紅寶石? – jschank 2010-01-02 22:32:08

+0

有一個恆定的RUBY_PLATFORM應該讓你確定平臺。環境變量是讓人們覆蓋默認值的絕佳方式。畢竟,如果他們重寫默認值,他們應該是一個更復雜的用戶,他可以處理類似的問題。 – edebill 2010-01-03 16:05:06