Berikan file skrip ruby ​​ke konsol rel

117

Apakah ada cara untuk melewatkan file ruby, foo.rb ke konsol rel. Hasil yang diharapkan adalah setelah konsol memulai lingkungan rel untuk menjalankan file.

Atau cara lain yang memungkinkan saya untuk mengeksekusi file di lingkungan rel, dipicu dari command prompt.

Haris Krajina
sumber

Jawaban:

166

Sebenarnya, cara termudah adalah menjalankannya dengan loaddi dalamrails console

 load './path/to/foo.rb'
Adrian
sumber
5
Ini bekerja dengan baik. Tetapi kecuali saya melakukan sesuatu yang salah, Anda tidak memiliki akses ke objek yang dibuat di dalam skrip. Ada cara untuk melakukan itu? Kasus penggunaannya adalah menyiapkan beberapa objek, lalu menjelajahinya secara interaktif. Apakah itu mungkin?
Dan Barron
1
@DanBarron Anda dapat memasukkan debugger atau binding.pry
hibah
Ini seperti Lisp REPL +1
zeitue
Bantuan noob: ./path - adalah jalur yang berhubungan dengan proyek rails tempat file Anda berada.
Darpan
87

Kamu bisa memakai

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

MEMPERBARUI:

Apa yang juga sering kami gunakan akhir-akhir ini adalah memuat lingkungan rel dari dalam skrip itu sendiri. Pertimbangkan doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

Ini juga berfungsi jika skrip atau direktori kerja saat ini tidak ada di dalam direktori aplikasi rails.

moritz
sumber
Terima kasih banyak yang berhasil! Saya menggunakan Sublime Text 2 jadi sekarang saya akan dapat memicu build kelas rel dan melihat output langsung di IDE :)
Haris Krajina
2
script / runner "eval (File.read 'your_script.rb')" untuk rails 2.3 :)
valk
2
Anda dapat menggunakan pola yang sama untuk menjalankan file di dalam konsol: f=File.new('path/to/file')untuk menjalankan gunakan:f.rewind; eval f.readlines.join("\n");
semiomant
3
FYI Anda tidak membutuhkan eval(File.read ...)bagian itu lagi. Rails menerima file Ruby sebagai argumen untuk rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32
Perbarui- sesuai jawaban @ HarisKrajina di bawah, sepertinya rails r path/to/filename.rbsecara fungsional setara dengan bundle exec rails runnerperintah yang disebutkan di atas.
Richie Thomas
61

Sementara itu, solusi ini telah didukung.

rails r PATH_TO_RUBY_FILE

Jauh lebih sederhana sekarang.

Haris Krajina
sumber
di versi Rails yang mana?
karatedog
1
Saya pikir 3+, saya bisa konfirmasi untuk 5.
Haris Krajina
4
script/console --irb=pry < test.rb > test.log

sederhana, kotor, dan memblokir proses di bagian akhir, tetapi melakukan pekerjaan persis seperti yang saya inginkan.

hari seldon
sumber
4

Pertimbangkan untuk membuat tugas menyapu.

Untuk kode yang saya perlukan untuk membuat catatan atau mendukung migrasi, misalnya, saya sering membuat tugas menyapu seperti itu dari jawaban ini . Sebagai contoh:

Masuk 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

Dan kemudian di terminal jalankan:

rake example:create_user
Matt
sumber
1

Dari pendekatan yang disebutkan sebelumnya, tidak ada yang tampak bersih dan ideal seperti yang Anda harapkan untuk menjalankan skrip mandiri (tidak dievaluasi atau disalurkan melalui <redirection), tetapi akhirnya ini berfungsi sempurna untuk saya:

(untuk Rails 3)

Sisipkan di bagian atas skrip Anda:

#!/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...

Tentu saja, setel jalur aplikasi Rails Anda sendiri di baris APP_PATH.

Dengan cara itu, saya dapat menghindari keharusan untuk memasukkan apapun yang interaktif irbatau rails cdan dapat menguji script.rb saya dari prompt shell, sebelumnya misalnya. menjadwalkannya di crontab.

Ini dengan lancar mendukung parameter baris perintah, juga, dan meminimalkan tingkat pembungkus sebelum mendapatkan kode Anda.

CREDIT (juga menunjukkan contoh Rails 2)

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

Marcos
sumber
0

Inilah retasan yang saya gunakan:

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}')";}

Contoh:

cd ~/rails_project/app/helpers
rr my_script.rb

Berdasarkan jawaban @ moritz di sini. Saya mengubahnya, karena direktori kerja untuk File.readadalah root proyek Rails.

Saya tahu ini adalah bid'ah yang serius, menggunakan python untuk membantu skrip ruby. Tetapi saya tidak dapat menemukan relpathmetode yang dibangun ke dalam ruby.

Kredit: relpath()diambil dari @MestreLion, Ubah jalur absolut menjadi jalur relatif berdasarkan direktori saat ini menggunakan Bash

Chaim Leib Halbert
sumber