コピペコードで快適生活

明日使えるソースを自分のために

RailsEngineを作る手順メモ

RailsEngineを作る手順を雑にメモする。
Docker/Rspecを使う前提。

docker設定

Dockerfile

FROM ruby:2.6.6

ENV NODE_VERSION 10.12.0
ENV BUNDLER_VERSION 1.17.3

ENV LANG C.UTF-8

# https://stackoverflow.com/questions/55361762/apt-get-update-fails-with-404-in-a-previously-working-build
RUN sed -i '/jessie-updates/d' /etc/apt/sources.list

RUN apt-get update -qq && apt-get install -y build-essential git mariadb-client

# Node.js
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
RUN apt-get -y -qq install nodejs
RUN npm install -g phantomjs-prebuilt --unsafe-perm

RUN gem install bundler -v $BUNDLER_VERSION

RUN mkdir /app
WORKDIR /app


docker-compose.yml

version: '3'
services:
  mysql:
    image: mysql:5.7
    # volumes:
    #   - "./mysql-data:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: root
  app:
    build: .
    volumes:
      - "./:/app"
    ports:
      - "3000:3000"
    tty: true
    working_dir: "/app"

docker起動/ログイン

# docker起動
docker-compose up

# docker内に入る
docker exec -it my_engine_app_1 /bin/bash

(DOCKER内)プロジェクト作成

# railsインストール
gem install rails

# プロジェクトフォルダ作成
# ハイフン区切りだと階層化されるので注意
bundle exec rails plugin new my_engine --mountable -T --dummy-path=spec/dummy_app
cd my_engine

(ホスト側)gemspecを修正する

my_engine/my_engine.gemspec

# 略

# TODO欄を埋める
s.homepage    = "https://example.com/"
s.summary     = "概要を書く"
s.description = "説明を書く"

# 略

# 必要なgemを追加する
s.add_development_dependency "mysql2"
s.add_development_dependency "rspec-rails"
s.add_development_dependency "database_cleaner"
s.add_development_dependency "pry-rails"

# 略

(ホスト側)engineを修正する

lib/my_engine/engine.rb

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine

    # rspec使えるように追加
    config.generators do |g|
      g.test_framework :rspec
    end
  end
end

(DOCKER内)RSpec初期化

これで、spec/* ができる

bundle install
bundle exec rails g rspec:install

(ホスト側)rspecの設定ファイルを修正する

spec/rails_helper.rb

# 略

# 向き先をdummy_appに変更する
# テストはEngineをバンドルしたdummy_app内で行われる
require File.expand_path('../dummy/config/environment', __FILE__)

# 略

spec/dummy_app/config/database.yml

# dummyアプリのdbの向き先をmysqlに変更する
default: &default
  adapter: mysql2
  pool: 5
  timeout: 5000
  host: mysql
  port: 3306
  username: root
  password: root

development:
  <<: *default
  database: app_development

test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production

(DOCKER内)でコードジェネレートする

# モデル生成
bundle install
bundle exec rails g model xxx_logs

# ここでマイグレーションファイル修正する

# DB反映
bundle exec rake db:create
bundle exec rake db:migrate

(DOCKER内)テスト実行

# テストを実装しておく

# テスト実行
bundle exec rspec spec/

メインアプリに組み込む

Gemfileに参照先を設定して `bundle install` する

migrationファイルのコピー

bundle exec rake my_engine:install:migrations
bundle exec rake db:migrate

(補足)gem登録する

gem signin   # ~/.gem/credentialsができる
rake build   # pkgができる
rake release # gemが登録される