我想用我的Rakefile中的計劃任務更新Sinatra應用程序中的全局變量。請注意,該應用程序託管在Heroku上。爲了訪問這個變量,我設置了助手。從Rake任務訪問Sinatra應用程序範圍
get '/' do
@@var
end
helpers do
def get_var
return @@var
end
def set_var(value)
@@var = value
end
end
這裏是我的Rakefile任務:
task :do_something do
Sinatra::Application.set_var(get_data)
end
def get_data
# Retrieve value from external source
...
return val
end
我遇到的問題是,任務執行正常,但在西納特拉應用變量永遠不會更新。我認爲這是因爲從Rakefile中調用Sinatra::Application
實際上是從我嘗試更新的主實例創建一個單獨的應用程序實例。
我想知道他們是否是一種從Rakefile任務中訪問正在運行的Sinatra Web應用程序範圍的方法。注意:我可以將計劃任務中檢索到的值寫入數據庫,然後從Sinatra應用程序訪問它,但這樣做會過度殺傷,因爲此變量更新頻率很低,但經常檢索,所以我更喜歡將其保存在內存中以便於訪問。我已經研究過Memcache和Redis以避免轉向數據庫,但我認爲這對於單個值來說會過度。隨意不同意這一點。
編輯:關於Alexey Sukhoviy的評論,Heroku不允許寫入tmp目錄之外的文件,並且這些文件不會長時間存活以滿足應用程序的需求。
我建議你這樣的解決方案:通過rake任務將該變量的值保存到某個文件中。而不是從你的Sinatra應用程序的這個文件中讀取這個變量。 – suhovius
我很欣賞這種嘗試,但實際上這是我在開發環境中所做的工作,然後才發現在部署到Heroku時出現問題。查看我的問題編輯瞭解更多詳情。 – CalMlynarczyk