Передайте файл сценарію рубіну до консолі рейок


117

Чи є спосіб передати рубіновий файл, foo.rb на консоль рейлів . Очікувані результати будуть після того, як консоль запустить рельсове середовище для запуску файла.

Або будь-яким іншим способом, який дозволив би мені виконати файл у середовищі рейок, запускається з командного рядка.


Відповіді:


166

Насправді найпростіший спосіб - це запустити його loadвсерединіrails console

 load './path/to/foo.rb'

5
Це чудово працює. Але якщо я роблю щось не так, у вас немає доступу до об'єктів, створених всередині сценарію. Будь-який спосіб це зробити? Випадок використання - це встановити деякі об’єкти, а потім інтерактивно вивчити їх. Це можливо?
Ден Баррон

1
@DanBarron ви можете поставити в налагоджувач або обов’язковий.pry
надайте

Це подібно до Lisp REPL +1
zeitue

Довідка Noob: ./path - це шлях відносно вашого проекту рейків, де ваш файл знаходиться.
Дарпан

87

Можна використовувати

bundle exec rails runner "eval(File.read 'your_script.rb')"

ОНОВЛЕННЯ:

Те, що ми також дуже часто використовуємо останнім часом, - це завантаження рельсового середовища зсередини самого сценарію. Поміркуйте doit.rb:

#!/usr/bin/env ruby

require "/path/to/rails_app/config/environment"

# ... do your stuff

Це також працює, якщо скрипт або поточний робочий каталог не входять у каталог додатків рейлів.


Велике спасибі, що робить роботу! Я використовую Sublime Text 2, тому тепер я зможу запустити збірки рейок класів і побачити вихід безпосередньо в IDE :)
Haris Krajina

2
скрипт / runner "eval (File.read 'your_script.rb')" для рейок 2.3 :)
valk

2
ви можете використовувати аналогічну схему для запуску файлів всередині консолі: f=File.new('path/to/file')для запуску використання:f.rewind; eval f.readlines.join("\n");
напівмісний

3
FYI, тобі eval(File.read ...)частина вже не потрібна . Rails приймає файл Ruby як аргумент rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32

Оновлення відповідно до відповіді @ HarisKrajina нижче, схоже, rails r path/to/filename.rbє функціонально еквівалентною bundle exec rails runnerкоманді, згаданій вище.
Річі Томас


4
script/console --irb=pry < test.rb > test.log

простий, брудний і блокувати процес наприкінці, але він виконує роботу так, як я хотів.


4

Розглянемо створення завдання граблі.

Наприклад, для коду, який мені потрібен для створення записів або підтримки міграцій, я часто створюю подібну задачу граблі з цієї відповіді . Наприклад:

В 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
end

А потім у терміналі запустіть:

rake example:create_user

1

З цих підходів, згаданих раніше, жоден не здавався чистим та ідеальним, як ви очікували б запуску автономного сценарію (не отримуйте eval-ed чи piped через <перенаправлення), але нарешті це працює для мене ідеально:

(для рейок 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...

Звичайно, встановіть свій власний шлях до програми Rails у рядку APP_PATH.

Таким чином, я можу уникнути необхідності вводити будь-який інтерактивний irbабо rails cі можу перевірити свій script.rb з підказки оболонки, перш ніж, наприклад. планує його в кронтабі.

Він плавно підтримує параметри командного рядка і мінімізує рівні обгортки, перш ніж перейти до вашого коду.

КРЕДИТ (також показаний приклад Rails 2)

http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html


0

Ось хак, який я використовую:

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

На основі відповіді @ moritz тут. Я змінив його, оскільки робочий каталог для File.read- це корінь проекту Rails.

Я знаю, що це є якась серйозна єресь, використовуючи python для рубінового сценарію. Але я не зміг знайти relpathметод, вбудований у рубін.

Кредит: relpath()взято з @MestreLion, Перетворити абсолютний шлях у відносний шлях, заданий поточним каталогом за допомогою Bash

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.