ruby-on-rails - Foreman 在整个过程之后终止,并且不会按照 Procfile 中的定义相应地运行
问题描述
我正在将数据从基于 Web 的 CSV 导入数据库,所以我创建了一个 rake 任务,将数据导入数据库。但是,我尝试让我的 rails 应用程序运行得有点无缝,并且我集成了import rake task
和running rails server
foreman 中。
但是,当我运行时foreman start
,进程开始但在 rake 任务完成后终止。我也希望在运行之前先启动 rake 任务rails s
这是我在下面所做的:
lib/tasks/web_import.rake
require 'open-uri'
require 'csv'
namespace :web_import do
desc 'Import users from csv'
task users: :environment do
url = 'http://blablabla.com/content/people.csv'
# I forced encoding so avoid UndefinedConversionError "\xC3" from ASCII-8BIT to UTF-8
csv_string = open(url).read.force_encoding('UTF-8')
counter = 0
duplicate_counter = 0
user = []
CSV.parse(csv_string, headers: true, header_converters: :symbol) do |row|
next unless row[:name].present? && row[:email_address].present?
user = CsvImporter::User.create row.to_h
if user.persisted?
counter += 1
else
duplicate_counter += 1
end
end
p "Email duplicate record: #{user.email_address} - #{user.errors.full_messages.join(',')}" if user.errors.any?
p "Imported #{counter} users, #{duplicate_counter} duplicate rows ain't added in total"
end
end
档案
rake: rake web_import:users
server: rails s
当我运行 forman start 时,下图显示了该过程
我希望在运行命令rake
之前先运行工头中的任务。rails s
我也不希望它自行终止。我不知道做错了什么。
任何帮助表示赞赏。
解决方案
我通过重构 Procfile 解决了这个问题。我没有使用两个任务,而是将它合并到一个命令中,&&
这样我就可以确定哪个命令采用前缀,哪个命令采用后缀。
所以我将配置文件更改为:
tasks: rake web_import:users && rails s -p 3000
有了这个,我首先运行我的导入,最后运行服务器命令。
如果您注意到了,我添加了带有-p
襟翼的端口,以免确保服务器正在侦听端口 3000。请注意,添加端口是可选的。
我希望这对某人也有帮助。
推荐阅读
- python - 如何通过侧面输入将两个 Pcollections(各种大小/数据)与一个公共“键”(Street)合并?
- multithreading - 在多线程中使用 Hibernate、Spring Data JPA
- c++ - 在 C++ 中使用 new 关键字初始化成员变量
- c++ - 尝试写入文件末尾,但改写
- javascript - 基于表单输入选择的功能?
- javascript - 比较 Excel 和 JSON 文件之间的数据失败
- java - finalize 从未通过 allocateInstance(Java) 从对象中调用
- python-3.x - “未解决的导入'请求'”但代码仍然可以运行(VSCode)
- css - 想加定时器并滑出
- java - 未经身份验证无法发送电子邮件