이상적인 루비 프로젝트 구조


125

루비 (비 레일 / 머브 / 등) 프로젝트에 이상적인 프로젝트 구조를 개관 / 설명했습니다. 나는 그것이 다음과 같아요

app/
  bin/                  #Files for command-line execution
  lib/
    appname.rb
    appname/            #Classes and so on
  Rakefile              #Running tests
  README
  test,spec,features/   #Whichever means of testing you go for
  appname.gemspec       #If it's a gem

내가 뭔가 잘못 받았 니? 어떤 부분을 놓쳤습니까?


답변:


88

나는 그것이 거의 자리에 있다고 생각합니다. 기본적으로 Rubygems는 lib 디렉토리를로드 경로에 추가하지만 $ : 변수를 사용하여 원하는 디렉토리를 푸시 할 수 있습니다. 즉

$:.push File.expand_path(File.dirname(__FILE__) + '/../surfcompstuff')

그것은 당신이 surfer.rb그 디렉토리에서 말하면 require "surfer"언제 어디서나 파일을 찾을 수 있음을 의미합니다.

또한 규칙으로 클래스와 싱글 톤은 파일을 가져오고 모듈은 디렉토리를 가져옵니다. 예를 들어 LolCatz모듈과 LolCatz::Moar클래스가 다음과 같은 경우

lib/
  appname.rb
  lolcatz/
    moar.rb

대부분의 라이브러리가 appname네임 스페이스 에 있기 때문에 lib / appname 폴더가있는 이유 입니다.

또한 명령 newgem --simple [projectname]을 실행하면 Ruby 프로젝트의 필수 요소 (및 확장으로 Ruby Gem)로 스캐 폴드를 빠르게 생성 할 수 있습니다. 이 작업을 수행하는 다른 도구가 있지만 newgem은 매우 일반적입니다. 나는 보통 TODO 파일과 모든 스크립트를 제거합니다.


1
단. 나는 newgem에 대해 몰랐다. 레일즈가 아닌 프로젝트는 종종 레일즈 구조를 반영했습니다. 이 모범 사례 팁에 감사드립니다.
berlin.ab

또 다른 중요한 파일은 "라이센스"
bluehavana

2
로드 경로 lib에 자동으로 추가되는 것으로 설명 된 동작을 얻지 못했습니다. 1.9입니까? 이를 위해 특별한 구성이 필요합니까?
Emily

5
번들을 사용하여 gem 템플릿을 생성 할 수도 있습니다. 이 의견을 제출할 당시 newgem은 (는) 9 개월 동안 노력하지 않았습니다. 명령은bundle gem gem_name
Ninjaxor


6

Rails 프로젝트 구조를 모방하려고 시도합니다. 보통 Rails를 다루는 팀이 다른 구성보다 구조를 더 잘 이해하기 때문입니다. 컨피규레이션 오버 컨벤션-레일에서 번짐.


6
일부 외부 개발자가 귀하의 코드를 살펴보면, 귀하가 보게 될 것은 귀하의 개인 협약 일뿐 입니다. 나는 중대형 프로젝트의 경우 완전히 다른 종류의 프로젝트를위한 일련의 규칙을 사용하면 더 혼란 스러울 수 있다고 생각합니다. Rails 앱입니까, 루비 앱입니까? Rails 앱처럼 설계된 이유는 무엇입니까? "뭔가 깨지기 전에 개발자와 연락하는 것이 더 좋을 것입니다 ...?" 처음부터 약간의 오버 헤드가 추가 될 것입니다.
jj_

@jj_에 동의합니다. 나는 이것이 다소 오래되었다는 것을 알고 있지만 사람들이 왜 공동체 협약이 있는지 이해하는 것이 중요하다고 생각합니다. 거리에서 누군가를 끌어 내면 프로젝트를보고 깨질 수 있습니다. 그것은 당신이 무언가를 찾고 이해할 수 있도록합니다. 도메인의 규칙을 사용하는 것이 중요하다고 생각합니다. 프로젝트 구성에 대한 도메인 규칙.
WattsInABox

2

번 들러를 사용하는 경우이 명령 bundle gem app_name을 실행 하면 동일한 디렉토리 구조가 제공됩니다.

단위 테스트 대신 rspec을 사용하려면이 명령을 실행할 수 있습니다 rspec --init ( cd app_name먼저 확인하십시오 )

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