Rails 콘솔에 루비 스크립트 파일 전달


117

루비 파일 foo.rb 를 레일스 콘솔 에 전달하는 방법이 있습니까? 예상 결과는 콘솔이 파일을 실행하기 위해 레일스 환경을 시작한 후입니다.

또는 명령 프롬프트에서 트리거되는 레일스 환경에서 파일을 실행할 수있는 다른 방법.


답변:


166

실제로 가장 간단한 방법은 load내부에서 실행하는 것입니다 .rails console

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

5
이것은 훌륭하게 작동합니다. 그러나 내가 잘못하지 않는 한 스크립트 내부에서 생성 된 개체에 액세스 할 수 없습니다. 그렇게 할 방법이 있습니까? 사용 사례는 일부 개체를 설정 한 다음 대화식으로 탐색하는 것입니다. 가능합니까?
Dan Barron

1
@DanBarron 디버거 또는 binding.pry에 넣을 수 있습니다.
grant

이건 그냥 리스프 REPL 일처럼
zeitue

Noob help : ./path-파일이있는 rails 프로젝트에 상대적인 경로입니다.
Darpan

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

이것은 스크립트 또는 현재 작업 디렉토리가 rails 앱의 디렉토리 내에 있지 않은 경우에도 작동합니다.


일을 해주셔서 감사합니다! 저는 Sublime Text 2를 사용하고 있으므로 이제 레일 클래스 빌드를 트리거하고 IDE에서 직접 출력을 볼 수 있습니다. :)
Haris Krajina

2
스크립트 / 러너 "eval (File.read 'your_script.rb')"for rails 2.3 :)
valk

2
비슷한 패턴을 사용하여 콘솔 내부에서 파일 f=File.new('path/to/file')을 실행할 수 있습니다. 다음 을 실행합니다.f.rewind; eval f.readlines.join("\n");
semiomant

3
참고로 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위에서 언급 한 명령 과 기능적으로 동일합니다 .
Richie Thomas


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

앞서 언급 한 이러한 접근 방식 중에서 독립 실행 형 스크립트가 실행될 것으로 기대하는 것처럼 깨끗하고 이상적인 것은 없었지만 (<리디렉션을 통해 평가되거나 파이프되지 않음) 마지막으로 이것이 완벽하게 작동합니다.

(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 앱 경로를 설정하십시오.

그런 식으로, 나는 어떤 상호 작용을 입력 할 필요 피할 수 irb또는 rails c내 테스트 할 수 있습니다 script.rb을 (가) 예를 들어 전에, 쉘 프롬프트에서. crontab에서 예약하십시오.

또한 명령 줄 매개 변수도 원활하게 지원하고 코드에 도달하기 전에 래퍼 수준을 최소화합니다.

크레딧 (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 프로젝트 루트 이기 때문에 변경했습니다 .

나는 이것이 루비 스크립트를 돕기 위해 파이썬을 사용하는 심각한 이단이라는 것을 알고 있습니다. 하지만 relpath루비에 내장 된 방법을 찾을 수 없었 습니다.

크레딧 : relpath()@MestreLion에서 가져 왔습니다 . Bash를 사용하여 현재 디렉토리가 주어진 경우 절대 경로를 상대 경로로 변환

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.