`rake db : seed`의 처리 흐름을 쫓았다.

개요



표제대로.

경위



Rails 앱으로 개발시 초기 투입하는 처리를 db/seeds.rb에 썼다. 그 때, 특정의 환경하 이외에서는 동작하지 않게 이하와 같이 조기 return 하는 처리를 쓰고 있었지만, return 그렇다면 움직이지 않고 exit 라면 정상적인 처리 종료 플로우를 타지 않고서 나빴기 때문에, 원래 태스크의 정의 개소로부터 처리를 쫓아 보았다.

seeds.rb
if !Rails.env.development?
  p "Nothing to do."
  exit
end  

흐름



1. activerecord 내에 있는 railties/databases.rake


db:seed 태스크는 다음 위치에서 정의된다.
htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / 5-1-s ta ぇ / 아 c ゔ ぇ 레코 rd / ぃ b / 아 씨 ゔ ぇ _ 레코 rd / 라이 l 치에 s / 다바바 세s. 쓰다

railties내의 tasks/engine.rake 에도 app:db:seed 하지만 정의되고 있습니다만, 이것은 별개일까...?

2. ActiveRecord::Tasks::DatabaseTasks.load_seed



module DatabaseTasks 에 정의된 seed_loader.load_seed 를 call 하고 있지만, seed_loader 란 무엇인가.
htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / 5-1-s ta ぇ / 아 c ゔ ぇ 레코 rd / ぃ b / 아 씨 ゔ ぇ _ 레코 rd / 타 sks / 달팽이 _ sks. rb#L268-L276
seed_loader는 function으로 module에 정의되어 있습니다.
인스턴스 변수인 @seed_loader에 값을 cache하면서 Rails.application를 반환합니다.
htps : // 기주 b. 코 m / 라이 ls / 라이 ls / b ぉ b / 5-1-s ta ぇ / 아 c ゔ ぇ 레코 rd / ぃ b / 아 씨 ゔ ぇ _ 레코 rd / 타 sks / 달팽이 _ sks. rb#L102-L104

요점은 seed_loader.load_seedRails.application.load_seed 를 가리킨다.

3. Rails.engine.load_seed


Rails.applicationRails.engine 를 확장합니다. Rails.application.load_seed 의 실체는 Rails.engine 에 정의된 Rails.engine.load_seed 이다.
htps : // 기주 b. 이 m/라이 ls/라이 ls/bぉb/5-1-s타 bㅇ/라이 l치에 s/ぃb/라이 ls/엔기네. rb#L543-L550

이 function 안에서, 가장 가까운 db/seeds.rb 의 path 를 해결해 Kernel.load 로 그 파일을 읽어들이고 있다.

4. Kernel.load



첫 번째 인수 file에 입력된 경로를 따라 파일을 로드하는 built-in function.
htps : // / cs. 루 by ぁん g. 오 rg / 그럼 / ㅁ st / 어 d / r r l / m / 아 d. HTML

Kernel.load로 읽은 스크립트로 조기 return하는 방법?



결국 이건 잘 모르겠어...
로드하는 Ruby 스크립트에 블록을 준비하고 그 안에 처리를 정의해 갈 수밖에 없다...? (별로 잘 모르겠어요)

결론



결국 에서하고 싶은 것은 실현되었습니다.

참고


  • module function Kernel.#load (Ruby 2.4.0)
  • 환경에 맞게 rake db:seed 실행하기 - how to code something
  • 좋은 웹페이지 즐겨찾기