2009-12-10 5 views
57

1) 레이크 작업을위한 '최고의 장소'가 있습니까? 나는/lib/tasks에서 그것들을 보았고, * .rb와 * .rake로 쓰여진 것을 본 적이있다. 어떤 것이 있다면 (정확한지) 확실하지 않다.레이크 작업이 포함 된 보석

2) 어떻게해야 하는가? 보석이 환경에서 구성되면 응용 프로그램에서 사용할 수있게합니까?

+1

더 나은 대답을 추구해야합니다. facebooker를 작동 시키려고 할 때 벽에서 머리를 맞췄지만, 모든 레이크 작업 종속성이 기본적으로 없어 졌기 때문에 작동하지 않습니다. –

+0

이 도움이되었습니다. http://blog.nathanhumbert.com/2010/02/rails-3-loading-rake-tasks-from-gem.html – User

답변

44

레일 3에서 레일 타이를 사용합니다. 여기에 내가 방금 만든 보석을 위해 할 수있는 코드는 다음과 같습니다

class BackupTask < Rails::Railtie 
    rake_tasks do 
    Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f } 
    end 
end 

그래서 당신은 기본적으로 그 클래스 내에서 사용자가 해당 파일을로드하는 rake_tasks 블록을 가지고, 레일 :: Railtie에서 상속하는 클래스를 만듭니다. .rake 확장자를 사용하려면 require 대신에로드해야합니다.

Dir의 전체 경로를 지정해야한다는 것을 알게되었습니다 (따라서 File.join 체조). 필자가 명시 적으로 파일을 나열하기를 원한다면 "load 'tasks/foo.rake'라고 말하면서 벗어날 수있었습니다. 왜냐하면 내 보석의 lib 디렉토리가로드 경로에 있었기 때문입니다.

+2

레이크 작업을 비 레일 프로젝트에 추가하는 방법을 알고 계십니까? – lulalala

+1

레일즈 4의이 응답에 대한 +1은 [here] (http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html)에 잘 설명되어 있습니다. 비 레일의 경우 [이 게시물] (http://stackoverflow.com/questions/13858495/ruby-accessing-rake-task-from-a-gem-without-rails) – zrisher

+0

레일 4.2에서도 작동 확인 – equivalent8

31

/taskslib/tasks 중 하나가 좋습니다. 작업이 Gem 자체의 작업 또는 관리에 사용될 예정인 경우 /tasks을 사용합니다. 작업이 Gem 사용자에 의해로드되어야 할 때 lib/tasks을 사용합니다.

사용자가 lib 폴더 외부에서 루비 파일을로드하는 데 문제가있을 수 있습니다.이 파일은 Gem이 필요할 때로드 경로에 자동으로 추가됩니다.

또한 * .rake 확장자를 사용하는 것이 좋습니다. 요즘 거의 모든 IDE는 .rake 확장자를 루비 파일에 연결하고 대부분의 고급 IDE는 내용을 레이크 스크립트로 파싱 할 수도 있습니다. .rake 확장 프로그램은 개발자가 파일에 대한 내용을 즉각적으로 제공 할 수 있기 때문에 개발자에게 더 적합한 선택입니다.

두 번째 질문에 대해, 현재 Rails가 레이크 작업을로드하는 방법은 없습니다. 플러그인을 Gem으로 패키징 할 때입니다. 응용 프로그램에 레이크 파일을 포함하거나 다른 레이크 파일에 레이크 파일을 포함하거나 프로젝트의 레이크 작업을 복제해야합니다.

공급 업체 폴더에 플러그인을 설치하면 작업과 lib/tasks 디렉토리 모두에있는 *.rake 개의 파일이 자동으로 다음 두 줄에 의해 Rails 범위에로드됩니다. 레일 3 지원

Dir["#{RAILS_ROOT}/vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext } 
Dir["#{RAILS_ROOT}/vendor/plugins/*/lib/tasks/**/*.rake"].sort.each { |ext| load ext } 
+0

그리고 Dir로 시작하는 두 줄은 어디에 넣을까요? 이 답변은 Rails 4에서도 유효합니까? – Spundun

+0

이 답변의 전반부는 훌륭합니다. 후반부는 Rails 3보다 앞선 것으로 보이며 구식입니다. 레일 티를 사용하여 레일즈가 @ edebill의 대답에 설명 된 작업을로드하게하십시오. – drewish

11

, 당신의 lib 디렉토리/.rb 파일의 맨 윗줄은 다음과 같습니다

는 레일이 지원
Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake) 

, 보석 설치가 Rakefile을 편집하고 추가해야합니다 :

require 문 다음에.

참고 :

  • 실제 보석의 이름으로 대체해야합니다.
  • 내가 쉽게 아직 아무것도 발견하지 않았습니다

/모든 레일 가시 레이크 작업 lib 디렉토리/작업에 가정합니다. 코멘트?

관련 문제