【问题标题】:Why can't I write a sitemap to a temporary directory on a Heroku stack that has a read-only file system?为什么我不能将站点地图写入具有只读文件系统的 Heroku 堆栈上的临时目录?
【发布时间】:2013-10-29 10:58:50
【问题描述】:

我正在为我的网站生成站点地图并将其临时保存到 tmp 文件夹,然后上传到我的亚马逊 AWS 账户。我正在使用站点地图生成器和雾宝石来帮助我。到目前为止,我有这个......

# In sitemap.rb

# Set the host name for URL creation
SitemapGenerator::Sitemap.default_host = "http://mycoolapp.com/"

# pick a place safe to write the files
#SitemapGenerator::Sitemap.public_path = 'tmp/'

# store on S3 using Fog
SitemapGenerator::Sitemap.adapter = SitemapGenerator::S3Adapter.new

# inform the map cross-linking where to find the other maps
SitemapGenerator::Sitemap.sitemaps_host = "http://#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com/"

# pick a namespace within your bucket to organize your maps
SitemapGenerator::Sitemap.sitemaps_path = '/'

SitemapGenerator::Sitemap.create do
  # Put links creation logic here.
  #

  add '/home'

  add '/about'

  add '/contact'
end

每当我运行heroku run rake sitemap:create 时,我都会收到以下错误...

In '/app/tmp/':
511
rake aborted!
Read-only file system - /sitemap.xml.gz

我真的不知道为什么它不起作用。我什至通过运行Rails.root.join('tmp') 作为初始化程序来确保创建 tmp 文件夹。任何解决此问题的帮助将不胜感激。

【问题讨论】:

  • 不幸的是,heroku 不允许您直接修改文件系统 - 您必须在内存中构建站点地图并将它们流式传输到 aws 而不使用临时文件。
  • 嗯,有什么链接可以帮助我继续前进吗?
  • 我以前读过这篇文章,但对我没有多大帮助。如果它告诉我我的代码应该可以工作,因为我正在将它写入 tmp,There are two directories that are writeable: ./tmp and ./log。我对什么感到困惑?

标签: ruby-on-rails heroku rake sitemap


【解决方案1】:

不要写入文件系统的根目录

Rake 很清楚错误的来源:

rake 中止!
只读文件系统 - /sitemap.xml.gz

这告诉您您的 rake 任务正在尝试将文件写入文件系统的根目录。

如果您没有使用带有ephemeral filesystem support 的堆栈,例如Celadon Cedar,则需要确保写入的是#{RAILS_ROOT}/tmp,而不是文件系统的根目录。我自己没有对此进行测试,但您可以通过将sitemaps_path 指向writable directory 来解决此问题。例如:

SitemapGenerator::Sitemap.sitemaps_path = '/app/tmp'

如果这不起作用,您将不得不追踪您的 gem 或 rake 任务将根目录定义为写入 sitemap.xml.gz 文件的位置的位置。

【讨论】:

  • 嗯,我认为 sitemaps_path 用于 AWS 路径位置?
  • @jason328 实际上是“桶命名空间”。如果更改该值没有帮助,您也可以尝试设置SitemapGenerator::Sitemap.public_path = 'tmp/',如example on the wiki 中使用的那样。您目前已将该行注释掉。如果可行,我将更新答案;如果没有,您将不得不遵循我的其余建议并追踪定义写入路径的位置。
  • 是的,它对我不起作用。我想我必须追踪写入路径。
  • 虽然除了寻找写入路径之外我仍然不知道如何解决这个问题(不知道从哪里开始),但我会给你答案。
【解决方案2】:

所以,我在尝试遵循 Heroku 和 sitemap_generator gem 上的 fog 说明时遇到了同样的问题。我最终切换到carrierwave,发现它是即插即用的。

查看文档here,如果您有任何疑问,请告诉我,因为我几个月前刚刚这样做,并且可能遇到了您可能遇到的任何障碍。

【讨论】:

  • 我最终尝试了carrierwave,但它最终没有奏效。我收到了与问题中发布的相同的错误。
  • 听起来您的应用未配置为将 sitemap_generator 发送到 S3
  • 我不知道如何解决这个问题。我按照指示进行操作。
  • 如果您想加入 SO 聊天,请告诉我,我们可以解决问题。
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 2010-12-22
  • 2013-07-16
  • 2013-02-02
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
相关资源
最近更新 更多