Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

첫 번째 루비 보석 추출 가이드

GitHub 기여 차트가 단색 회색입니까? 오픈 소스 프로젝트를 사용하여 작업할 수 있습니다. 그러나 처음부터 시작할 필요는 없습니다. 유용한 사이드 프로젝트를 만드는 가장 쉬운 방법은 이미 구축 중인 앱에서 프로젝트를 꺼내는 것입니다. 이것이 바로 Rails가 탄생한 방법입니다!

그러나 무엇을 추출해야 하는지 어떻게 압니까? 워크플로를 파괴하지 않고 어떻게 보석으로 만들 수 있습니까?

추출할 코드를 찾으세요.

앱 깊숙한 곳 어딘가에 속하지 않는 코드가 있습니다. 필요하지 않은 코드 귀하의 앱이 작업을 수행합니다. 어디에 있나요?

때로는 추측만 하면 됩니다. 하지만 종종 동일한 몇 곳에서 추출 가능한 코드를 찾습니다.

  • 검증

    속성에 대한 사용자 정의 유효성 검사를 작성했습니까? 그것들은 훌륭한 보석을 만들 수 있습니다.

  • Rails의 변경사항

    때때로 테스트에서 커밋 후크가 작동하거나 데이터베이스에서 NULL로 바뀌는 빈 속성을 얻기 위해 Rails를 엉망으로 만들어야 합니다. 이런 논리를 젬으로 옮길 때마다 더 안정적이고 이해하기 쉬워졌습니다.

  • 비활성 레코드 모델

    이메일 주소나 전화번호 파싱을 너무 많이 해서 자체 클래스로 옮겼습니까? 이러한 클래스는 종종 다른 앱에서 유용하며 보석으로 바꾸기가 매우 쉽습니다.

  • 모의 개체 및 사용자 지정 어설션

    사용자 지정 어설션을 사용하여 더 읽기 쉬운 테스트를 작성할 수 있습니다. 그리고 라이브러리나 패턴에 대해 작성된 좋은 사용자 지정 주장이 있으면 해당 라이브러리나 패턴을 사용하는 다른 사람에게 도움이 됩니다.

크게 생각하지 않아도 됩니다. 내가 가장 좋아하는 보석 중 일부는 단 하나의 파일입니다!

그래도 무엇을 추출할지 결정할 수 없다면 RubyToolbox에서 카테고리 목록을 찾아보고 영감을 얻으세요.

보석과 같은 디렉토리에 코드 저장

보석으로 변환할 코드를 알게 되면 해당 코드를 이동하여 앱 내부의 보석과 같은 구조에 맞춥니다.

Rails 앱에서는 lib/를 사용합니다. 보석 스테이징 영역으로 . lib/ 고유한 보석으로 변할 가능성이 있는 코드를 넣는 곳입니다. 따라서 "json_api_client"라는 gem을 생성하는 경우 Rails 앱의 lib/ 디렉토리는 다음과 같을 수 있습니다.

...
my_rails_app/lib/json_api_client.rb
my_rails_app/lib/json_api_client/associations.rb
my_rails_app/lib/json_api_client/connection.rb
...

대부분의 gem에는 lib/ 아래에 파일이 있습니다. gem의 이름을 따서 명명(lib/json_api_client.rb ) 및 해당 gem(lib/json_api_client/ 아래에 있는 모든 것)의 이름을 딴 디렉토리에 있는 많은 파일 ). 따라서 동일한 구조를 사용하여 Rails 앱 내에서 일치시킵니다. 그러면 나중에 코드를 gem으로 옮기기가 훨씬 쉬워집니다.

젬 레이아웃이 어떻게 생겼는지 혼란스럽다면 GitHub에서 좋아하는 gem 소스를 살펴보세요. 패턴을 꽤 빨리 습득할 수 있습니다.

테스트는 어떻습니까?

저는 lib/를 따르곤 했습니다. test/unit/ 내부의 의 구조 :

...
my_rails_app/test/unit/json_api_client_test.rb
my_rails_app/test/unit/json_api_client/associations_test.rb
my_rails_app/test/unit/json_api_client/connection_test.rb
...

모델과 라이브러리를 같은 폴더에 넣는 것이 조금 지저분하더라도 정상적으로 작동했습니다.

하지만 이제 Rails는 test/models/를 사용합니다. test/unit/ 대신 . 그리고 lib/ 저장 test/models/ 내부의 테스트 큰 의미가 없습니다. 나는 아직 이것에 대한 대회를 결정하지 않았습니다. 제안 사항이 있습니까?

종속성 해제

코드가 gem 안에 있으면 앱에 의존할 수 없습니다. 즉, lib/에 넣은 코드를 살펴봐야 합니다. , 앱에 특정한 클래스, 객체 또는 동작에 의존하는 위치를 찾으세요.

이러한 종속성을 발견하면 이를 해제해야 합니다. 종속성을 끊는(또는 주입하는) 방법에 대한 훌륭한 글이 많이 있으므로 지금은 자세히 다루지 않겠습니다.

보석 만들기

나는 bundle gem을 사용합니다. 내 보석을 만들 수 있습니다. 특히 bulk_cache_fetcher라는 gem을 생성하려면 :

bundle gem bulk_cache_fetcher -t minitest

-t gem의 Rakefile에 테스트 도우미 파일과 테스트 작업을 추가합니다. .

다음에는 .gemspec 작성과 같은 일부 정리 작업을 수행해야 합니다. , README 작성 , LICENSE 선택 , 그 모든 것.

그리고 나서 Rails 앱의 lib/에 이미 gem의 코드가 있기 때문에 폴더에서 해당 코드와 해당 테스트를 lib/로 이동할 수 있습니다. 및 test/ 새 gem의 폴더

많은 경우에, 당신이 놓쳤거나 잊은 것, 또는 gem 내부에서 사실이 아닌 앱에 대한 것을 가정하는 코드가 있을 것입니다. 따라서 계속 진행하기 전에 gem으로 이동한 테스트를 실행하고 모두 통과하는지 확인하세요.

앱에서 새로운 gem 사용

이제 보석이 생겼으니 사용하고 싶죠? 하지만 Rails 앱 내에서 gem에 대한 변경 사항을 테스트하는 것은 빠르게 성가시게 될 수 있습니다. 다음을 수행해야 합니다.

  1. 보석을 바꾸세요
  2. 보석 제작
  3. 시스템에서 gem의 모든 흔적을 제거하거나 버전을 업데이트하십시오.
  4. 젬 설치
  5. 서버 다시 시작

정말 끔찍합니다. 다행히 번들러는 더 쉬운 방법을 제공합니다. ~/Source/bulk_cache_fetcher에서 gem을 생성했다고 가정해 보겠습니다. . gem 변경 사항을 테스트하는 동안 Rails 앱의 Gemfile 안에 이것을 작성할 수 있습니다. :

젬 파일
gem "bulk_cache_fetcher", path: "~/Source/bulk_cache_fetcher"

다음으로 bundle install를 실행합니다. , 그리고 마치 해당 코드가 앱의 lib/에 있는 것처럼 gem을 변경할 수 있습니다. 폴더.

마지막으로 path:를 제거했는지 확인하세요. 코드를 체크인하기 전에! 그 경로는 다른 시스템의 올바른 위치를 가리키지 않을 수 있으므로 컴퓨터를 제외한 다른 곳에서는 작동하지 않을 가능성이 있습니다.

만들고, 배송하고, 즐기세요!

보석이 준비되면 세상에 보낼 수 있습니다.

따라서 RubyGems 계정에 아직 가입하지 않았다면 가입하고 변경 사항을 확인하고 rake release를 실행하세요. . 축하합니다. 이제 보석 작성자가 되셨습니다! 그리고 그 보석을 github에 푸시하면 오늘의 멋진 녹색 사각형을 얻을 수 있습니다.

추출 가능한 것으로 보이는 자체 앱의 일부가 있습니까? 좋은 보석이 될 수 있다고 생각하는 것이 있습니까? 그것에 대해 듣고 싶습니다. 아래에 댓글을 남겨주세요.

을 배우고 싶다면 Ruby 보석 생성, 관리 및 유지 관리에 대해 자세히 알아보려면 Brandon Hilkert의 Build Ruby Gem을 강력히 추천합니다 . 그의 책이 따르는 과정은 이것에 매우 가깝고 훨씬 더 많은 것을 다루고 있습니다.