2012-04-25 24 views
80

Czy istnieje sposób przekazania pliku ruby, foo.rb do konsoli szyn. Oczekiwane wyniki będą następować po uruchomieniu konsoli przez środowisko konsoli w celu uruchomienia pliku.Przekaż plik skryptu ruby ​​do konsoli szyn

Lub w jakikolwiek inny sposób, który pozwoliłby mi na uruchomienie pliku w środowisku railsowym, uruchamianym z wiersza poleceń.

+0

Możliwy duplikat [W jaki sposób uruchomić plik Ruby w środowisku Rails?] (Http: //stackoverflow.com/questions/9757261/how-do-i-run-a-ruby-file-in-a-rails-environment) –

Odpowiedz

17

W międzyczasie, to rozwiązanie zostało obsługiwane.

rails r PATH_TO_RUBY_FILE 

O wiele prostsze.

72

Można użyć

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

UPDATE:

Co my również używali dużo ostatnio jest załadowanie środowiska szyn od wewnątrz samego skryptu. Rozważmy doit.rb:

#!/usr/bin/env ruby 

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

# ... do your stuff 
+0

Wielkie dzięki, że wykonuje pracę! Używam Sublime Text 2, więc teraz będę w stanie wywoływać kompilacje klas rails i widzieć wyjście bezpośrednio w IDE :) –

+2

skrypt/runner "eval (File.read 'your_script.rb')" dla szyn 2.3 :) – valk

+2

ty może używać podobnego wzorca do uruchamiania plików wewnątrz konsoli: 'f = File.new ('path/to/file')', aby uruchomić use: 'f.rewind; eval f.readlines.join ("\ n"); ' – semiomant

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

prosty, brudny, i blokują ten proces na końcu, ale spełnia swoje zadanie dokładnie tak jak chciałem.

123

Faktycznie, najprostszym sposobem jest uruchomienie go z load wewnątrz rails console

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

Działa to świetnie. Ale chyba że robię coś źle, nie masz dostępu do obiektów utworzonych w skrypcie. Jakikolwiek sposób to zrobić? Przypadkiem użycia jest ustawienie niektórych obiektów, a następnie interaktywne ich eksplorowanie. Czy to jest możliwe? –

+0

Tak łatwo. Dzięki. – Abram

+0

@DanBarron można wstawić do debuggera lub binding.pry – grant

1

z tych metod wymienionych wcześniej, żaden wydawało się czyste i idealne jak można oczekiwać samodzielny skrypt do uruchomienia (nie dostać oceniany w ed lub rurami poprzez < przekierowania), ale w końcu działa to dla mnie idealny:

(dla Rails 3)

wstaw na początku skryptu:

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

Oczywiście należy ustawić własną ścieżkę aplikacji Rails w linii APP_PATH.

W ten sposób można uniknąć konieczności podawania jakichkolwiek interaktywną irb lub rails c i można przetestować script.rb z poleceń powłoki, zanim np. planowanie w crontab.

Płynnie obsługuje również parametry wiersza polecenia i minimalizuje liczbę owijaczy przed uzyskaniem dostępu do kodu.

kredytową (pokazuje również szyn 2 przykład)

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

0

Oto hack Używam:

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

Przykład:

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

podstawie @ Moritza odpowiedź tutaj. Zmieniłem go, ponieważ katalog roboczy dla File.read jest katalogiem głównym Rails.

Wiem, że jest to poważna herezja, używając Pythona, aby pomóc skryptowi ruby. Ale nie mogłem znaleźć wbudowanej w ruby ​​metody relpath.

kredytowe: relpath() została podjęta z @MestreLion, Convert absolute path into relative path given a current directory using Bash

1

Rozważ utworzenie zadania rake.

Dla kodu, który jest potrzebny do tworzenia rekordów lub migracji wsparcia, na przykład często utworzę takie zadanie rake'a z poziomu this answer. Na przykład:

W 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 

a następnie w perspektywie zacisk:

rake example:create_user 
Powiązane problemy