Rails 使用 Heroku:如何下载由 rake 任务创建的 CSV
Rails with Heroku: How to download a CSV created by a rake task
我在 Heroku 上部署了 "Harrys Prelauncher" 并尝试进行拆解(目前只是测试)。看这里:https://github.com/harrystech/prelaunchr#teardown
在 运行 rake 任务之后...
heroku run rake prelaunchr:create_winner_csvs
...在“/lib/assets”中创建了一个 csv 文件,但我不知道如何访问该文件(它在本地开发中有效)。
如何下载或访问该文件?
Heroku 使用 "ephemeral" 文件系统,不能保证保留在运行时所做的更改 。简单地说,如果它没有被推送到 git(我假设你正在使用 git 和 heroku),它不能保证存在于你应用程序的所有实例中。它可能存在于其中之一中,但您可能没有访问该特定文件系统的简单方法。你不应该,真的。
这样做是为了让同一应用程序的多个实例可以无缝启动。当然,这需要一些纪律:在外部存储任何有意义的状态:在数据库中,在外部磁盘上,任何地方。这样做的好处是水平可扩展性:如果资源短缺,您可以启动另一个 web dyno(通常)以完全相同的方式运行。新的测功机是从 捆绑包 开始的,它们打包在 git push
上,因此不包含您可能在另一个实例中所做的任何更改。
解决方法可能是 运行 heroku run bash
,这样您最终会进入一个交互式 shell 链接到您的捆绑包的另一个实例。
然后您可以创建该文件(通过 运行 您的 rake 任务)并以您认为合理的任何方式访问其内容。可以使用 cat
将文本文件回显到控制台中,然后复制粘贴到其他任何地方。这是一种肮脏的方式。
一种更简洁的方法是操纵应用程序通过电子邮件发送有问题的文件。如果 rake 任务由 Rails 应用程序本身调用,这是为数不多的合理方法之一。
我最近在为客户开发 Prelaunchr 活动时 运行 遇到了这个问题。假设你有一个本地版本的应用程序,你可以 "pull" 你的 Heroku 数据库到你的本地机器,在 database.yml 中将其设置为你的开发数据库,然后 运行 来自你的 rake 任务本地应用程序,它现在应该具有与您的 heroku 版本相同的数据库。这是拉取数据库的命令(用你自己的替换 name_for_database & heroku_app_name):
heroku pg:pull HEROKU_POSTGRESQL_COPPER_URL name_for_database --app heroku_app_name
确保重新启动本地服务器以查看填充的新数据库信息。
我在 Heroku 上部署了 "Harrys Prelauncher" 并尝试进行拆解(目前只是测试)。看这里:https://github.com/harrystech/prelaunchr#teardown
在 运行 rake 任务之后...
heroku run rake prelaunchr:create_winner_csvs
...在“/lib/assets”中创建了一个 csv 文件,但我不知道如何访问该文件(它在本地开发中有效)。
如何下载或访问该文件?
Heroku 使用 "ephemeral" 文件系统,不能保证保留在运行时所做的更改 。简单地说,如果它没有被推送到 git(我假设你正在使用 git 和 heroku),它不能保证存在于你应用程序的所有实例中。它可能存在于其中之一中,但您可能没有访问该特定文件系统的简单方法。你不应该,真的。
这样做是为了让同一应用程序的多个实例可以无缝启动。当然,这需要一些纪律:在外部存储任何有意义的状态:在数据库中,在外部磁盘上,任何地方。这样做的好处是水平可扩展性:如果资源短缺,您可以启动另一个 web dyno(通常)以完全相同的方式运行。新的测功机是从 捆绑包 开始的,它们打包在 git push
上,因此不包含您可能在另一个实例中所做的任何更改。
解决方法可能是 运行 heroku run bash
,这样您最终会进入一个交互式 shell 链接到您的捆绑包的另一个实例。
然后您可以创建该文件(通过 运行 您的 rake 任务)并以您认为合理的任何方式访问其内容。可以使用 cat
将文本文件回显到控制台中,然后复制粘贴到其他任何地方。这是一种肮脏的方式。
一种更简洁的方法是操纵应用程序通过电子邮件发送有问题的文件。如果 rake 任务由 Rails 应用程序本身调用,这是为数不多的合理方法之一。
我最近在为客户开发 Prelaunchr 活动时 运行 遇到了这个问题。假设你有一个本地版本的应用程序,你可以 "pull" 你的 Heroku 数据库到你的本地机器,在 database.yml 中将其设置为你的开发数据库,然后 运行 来自你的 rake 任务本地应用程序,它现在应该具有与您的 heroku 版本相同的数据库。这是拉取数据库的命令(用你自己的替换 name_for_database & heroku_app_name):
heroku pg:pull HEROKU_POSTGRESQL_COPPER_URL name_for_database --app heroku_app_name
确保重新启动本地服务器以查看填充的新数据库信息。