Ruby komut dosyasını raylar konsoluna aktarın


Yanıtlar:


166

Aslında basit yolu ile çalıştırmaktır loadiçeriderails console

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

5
Bu harika çalışıyor. Ancak yanlış bir şey yapmazsam, komut dosyası içinde oluşturulan nesnelere erişiminiz olmaz. Bunu yapmanın bir yolu var mı? Kullanım örneği, bazı nesneleri ayarlamak ve ardından onları etkileşimli olarak keşfetmektir. Mümkün mü?
Dan Barron

1
Eğer bir hata ayıklayıcı veya binding.pry koyabilirsiniz @DanBarron
hibe

Bu tıpkı bir Lisp REPL +1
zeitue

Noob yardım: ./path - dosyanızın bulunduğu ray projenize göre yoldur.
Darpan

87

Kullanabilirsiniz

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

GÜNCELLEME:

Ayrıca son zamanlarda çok kullandığımız şey, ray ortamını betiğin içinden yüklemek. Düşünün doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

Bu, komut dosyası veya geçerli çalışma dizini raylar uygulamasının dizini içinde değilse de çalışır.


İşe yarayan çok teşekkürler! Sublime Text 2 kullanıyorum, bu yüzden artık ray sınıflarının oluşumlarını tetikleyebileceğim ve çıktıları doğrudan IDE'de görebileceğim :)
Haris Krajina

2
script / runner "eval (File.read 'your_script.rb')" raylar için 2.3 :)
valk

2
konsolun içindeki dosyaları çalıştırmak için benzer bir model f=File.new('path/to/file')kullanabilirsiniz: çalıştırmak için şunu kullanın:f.rewind; eval f.readlines.join("\n");
semiomant

3
Bilginize, eval(File.read ...)artık parçaya ihtiyacınız yok. Rails bir Ruby dosyasını argüman olarak kabul eder rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32

Güncelleme - @ HarisKrajina'nın aşağıdaki cevabına göre, yukarıda bahsedilen komutla rails r path/to/filename.rbişlevsel olarak eşdeğer gibi görünüyor bundle exec rails runner.
Richie Thomas


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

basit, kirli ve sonunda süreci engelliyor, ancak işi tam olarak istediğim gibi yapıyor.


4

Bir tırmık görevi oluşturmayı düşünün.

Örneğin, kayıt oluşturmam veya geçişleri desteklemem gereken kod için, genellikle bu cevaptan böyle bir komisyon görevi oluşturuyorum . Örneğin:

İçinde 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

Ve sonra terminalde çalıştırın:

rake example:create_user

1

Daha önce bahsedilen bu yaklaşımlardan hiçbiri, bağımsız bir betiğin çalışmasını beklediğiniz kadar temiz ve ideal görünmüyordu (değerlendirilmiyor veya <yeniden yönlendirme yoluyla yönlendirilmiyor), ancak nihayet bu benim için mükemmel çalışıyor:

(Raylar 3 için)

Komut dosyanızın en üstüne ekleyin:

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

Elbette, APP_PATH satırında kendi Rails uygulama yolunuzu ayarlayın.

Bu şekilde, herhangi bir etkileşimli giriş yapmak zorunda kalmayabilirimirb veya script.rb'mi kabuk isteminden rails ctest edebilirim , örn. crontab'da planlama.

Komut satırı parametrelerini de sorunsuz bir şekilde destekler ve kodunuza ulaşmadan önce sarmalayıcı düzeylerini en aza indirir.

KREDİ (ayrıca bir Rails 2 örneği gösterir)

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


0

İşte kullandığım hack:

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

Misal:

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

@ Moritz'in buradaki cevabına göre. Çalışma dizini File.readRails proje kökü olduğu için değiştirdim .

Ruby betiğine yardım etmek için python kullanmanın ciddi bir sapkınlık olduğunu biliyorum. Ama relpathRuby'de yerleşik bir yöntem bulamadım .

Kredi: relpath()@MestreLion'dan alındı, Bash kullanarak geçerli bir dizin verilen mutlak yolu göreli yola dönüştür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.