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
(ホスト側)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が登録される