将ruby脚本文件传递给rails控制台
有没有办法将ruby文件foo.rb传递给rails控制台。 预期的结果是在控制台启动rails环境后运行文件。
或者任何其他方式,这将允许我在rails环境中执行文件,从命令提示符触发。
实际上,最简单的方法是在rails console
内运行load
load './path/to/foo.rb'
您可以使用
bundle exec rails runner "eval(File.read 'your_script.rb')"
更新:
我们最近也使用了很多,就是从脚本本身加载rails环境。 考虑doit.rb
:
#!/usr/bin/env ruby require "/path/to/rails_app/config/environment" # ... do your stuff
同时,这个解决scheme得到了支持。
rails r PATH_TO_RUBY_FILE
现在更简单了。
script/console --irb=pry < test.rb > test.log
简单,肮脏,并最终阻止这个过程,但它完成了我想要的工作。
在前面提到的这些方法中,没有一个看起来干净和理想,就像你期望独立脚本运行一样(没有通过<redirection>进行评估或pipe道),但最后这对我来说是完美的:
(对于Rails 3)
插入脚本的顶部:
#!/usr/bin/env ruby APP_PATH = File.expand_path(appdir = '/srv/staging/strat/fundmgr/config/application', __FILE__) require File.expand_path(appdir + '/../boot', __FILE__) require APP_PATH # set Rails.env here if desired Rails.application.require_environment! # your code here...
当然,在APP_PATH行中设置自己的Rails应用程序path。
这样,我可以避免必须input任何交互式irb
或rails c
并可以在shell提示符下testing我的script.rb ,例如。 在crontab中调度它。
它也可以平滑地支持命令行参数,并在获取代码之前最小化包装器的级别。
CREDIT(也显示了一个Rails 2的例子)
http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html
这里是我正在使用的黑客:
rr() { rails_root="$(bundle exec rails runner "puts Rails.root")" rp="$(relpath "$1" "$rails_root")" bundle exec rails runner "eval(File.read '$rp')" } relpath() {python -c "import os.path; print os.path.relpath('$1','${2:-$PWD}')";}
例:
cd ~/rails_project/app/helpers rr my_script.rb
基于@莫里茨的答案在这里。 我改变了它,因为File.read
的工作目录是Rails项目的根目录。
我知道这是一些严重的异端,用python来帮助一个ruby脚本。 但是我找不到在ruby中内置的relpath
方法。
Credit: relpath()
取自@MestreLion, 使用Bash将绝对path转换为给定当前目录的相对path
考虑创build一个rake任务。
例如,对于我需要创buildlogging或支持迁移的代码,我经常创build一个类似于此答案的rake任务。 例如:
在lib/tasks/example.rake
:
namespace :example do desc "Sample description you'd see if you ran: 'rake --tasks' in the terminal" task create_user: :environment do User.create! first_name: "Foo", last_name: "Bar" end
然后在terminal运行:
rake example:create_user