Railsのアプリ名を変更して、GitHubのリポジトリ名を変更するまで

どうも、三町哲平です!

開発が長引くと、Railsのアプリ名を変更したいということがあると思います。
しかし、初めてアプリ名を変更するとなると、一箇所変えただけでは、不具合の原因となりエラーが発生してしまうのではないかと思ってついつい思い止まって時間だけが無駄にすぎてしまうなんてこともあると思います。

そんな、初心者の方にも必見のアプリ名のRailsのアプリ名変更方法を紹介します。

今回は、Docker-composeで開発環境も構築していますので、流れとして、

__1. Railsのアプリ名の変更方法
2. Docker-composeのアプリ名変更方法
3. GitHubのアプリ名の変更方法__

この順番で紹介します。

例えば、Docker-composeを利用していないのであれば、2.は、読み飛ばしてもらって構わないですし、GitHubを利用していないのであれば、3.を飛ばして読み進めてください。

## 1. Railsのアプリ名の変更方法

### ①gemのrenameを使用
```:Gemfile
gem 'rename'
```
```
$ bundler install
```
インストールしてください。

### ②データベースを破棄する。
不具合の原因になりますので、破棄します。

```Ruby:
$ rails db:drop
```

Docker-composeでwebという名称で構築した環境の為、下記のコードを先頭に追加した上で、

```
$ docker-compose run --rm web
```
↓

```
te_app % docker-compose run --rm web rails db:drop                
Creating te_app_web_run ... done
Dropped database 'illustration_development'
Dropped database 'illustration_test'
```

### ③renameを使用してアプリ名を変更する。

```Ruby:
$ rails g rename:into 新しいアプリ名
```
上記のソースコードを踏まえ私の開発環境だと、

#### Ⅰ. __②データベースを破棄する。__と同様に、Docker-composeで構築した環境の為、下記のコードを先頭に追加した上で、

```
$ docker-compose run --rm web
```
#### Ⅱ. アプリ名を __te_app → illustration__ に変更しています。

```:
te_app % docker-compose run --rm web rails g rename:into illustration
Creating network "te_app_default" with the default driver
Creating te_app_db_1 ... done
Creating te_app_web_run ... done
Search and replace module in...
        gsub  Dockerfile
        gsub  Gemfile
        gsub  Gemfile.lock
        gsub  README.md
        gsub  Rakefile
        gsub  babel.config.js
        gsub  config.ru
        gsub  docker-compose.yml
        gsub  entrypoint.sh
        gsub  package.json
        gsub  postcss.config.js
        gsub  yarn.lock
        gsub  スクリーンショット 2020-11-18 20.19.02.png
        gsub  スクリーンショット 2020-11-18 21.29.05.png
        gsub  config/application.rb
        gsub  config/boot.rb
        gsub  config/environment.rb
        gsub  config/environments/development.rb
        gsub  config/environments/production.rb
        gsub  config/environments/test.rb
        gsub  config/initializers/application_controller_renderer.rb
        gsub  config/initializers/assets.rb
        gsub  config/initializers/backtrace_silencers.rb
        gsub  config/initializers/content_security_policy.rb
        gsub  config/initializers/cookies_serializer.rb
        gsub  config/initializers/devise.rb
        gsub  config/initializers/filter_parameter_logging.rb
        gsub  config/initializers/inflections.rb
        gsub  config/initializers/mime_types.rb
        gsub  config/initializers/wrap_parameters.rb
        gsub  config/puma.rb
        gsub  config/routes.rb
        gsub  config/spring.rb
        gsub  config/initializers/session_store.rb
Error: No such file or directory @ rb_sysopen - /te_app/config/initializers/session_store.rb
        gsub  config/database.yml
Renaming references...
Renaming directory...Error:#<Errno::EBUSY: Device or resource busy @ rb_file_s_rename - (/te_app, /illustration)>
```
↑エラーが発生しましたが、__②データベースを破棄する。不具合の原因になりますので、破棄します。__の部分をやり忘れていた事で発生したエラーなので、データベースを破棄後、再度実行。

再度実行で下記の結果に↓

```:
te_app % docker-compose run --rm web rails g rename:into illustration
Creating te_app_web_run ... done
[Error] Constant Illustration is already in use, please choose another name.
```
↑このエラーは、２度同じ、$ rails g rename:into illustration を実行した為に発生したエラーなので、特に問題はありません。

#### Ⅲ. Railsアプリのディレクトリ名を変更する。
![スクリーンショット 2020-11-28 1.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/91c91031-b7a2-3e27-78b1-432ffd2b63b6.png)
↓ te_appからillustrationへ
![スクリーンショット 2020-11-28 1.59.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/73c5a9a2-64fe-2d8f-1811-4ff560ee648e.png)

### ④データベースの作成→migrate
```Ruby:
$ rails db:create
```
```Ruby:
$ rails db:migrate
```
### ⑤残りの部分を修正する。
__gem 'rename'__だけでは、修正できていない、旧アプリ名の部分を検索して手動で削除します。

> アプリの名称は、ファイル名やHTML内など様々な場所で使用されることがあると思います。database周りやconfigなどのRailsの仕組みとしてアプリ名称が入ると決まっている場所はgemが一括で修正してくれますが、さすがに個別にアプリ名称を使用した場所までは修正できません。ですので、それらは探して修正していくしかありません。
引用元: [[Rails]rails newした後からアプリ名を変更する方法 - Qiita](https://qiita.com/ryoya-s/items/66e426f1a0dd5d87cd6f)

```:
$ grep -rn 古いアプリ名 . --exclude-dir={.git,tmp,log}
```

私の場合だと、

```:
illustration % grep -rn te_app . --exclude-dir={.git,tmp,log}
./config/cable.yml:10:  channel_prefix: te_app_production
./config/environments/production.rb:61:  # config.active_job.queue_name_prefix = "te_app_production"
./package.json:2:  "name": "te_app",
```
３箇所ほど__te_app__表記の箇所が出てきたので、手動で修正します。

```
$ grep -rn te_app . --exclude-dir={.git,tmp,log}
```
もう一度実行してみましたが、何も出てこなかったので、これで、Railsアプリに関しては、完成です。

## 2. Docker-composeのアプリ名変更方法
#### Ⅰ. __docker-compose.yml__と__Dockerfile__の旧アプリ名(__te_app__)の箇所を新アプリ名(__illustration__)に変更します。

##### __【docker-compose.yml】__
__変更前__

```yml:docker-compose.yml
version: '3.8'  # docker-composeのバージョン
services: # 下のハッシュにサービスを作る。命名は自由だが、通常はwebとdbと名付ける。
  db:
    image: postgres # 使用するimage（dbでPostgreSQLを指定）
    volumes: # ディレクトリのマウント設定（dbデータなどを残せる）
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
  web:
    build: . # Dockerfileなどがあるパス（基本的にカレントディレクトリ）
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 4000 -b '0.0.0.0'" # コマンド（server.pidファイルを削除してからrailsサーバー起動)
    volumes:
      - .:/te_app
    ports: # ポート番号。[ホスト：コンテナ]で設定。
      - "4000:4000"
    depends_on:
      - db # 依存関係を示していて、起動順を指定できます。ここではdb→webへと起動します。
```
↓__変更後__

```yml:docker-compose.yml
version: '3.8'  # docker-composeのバージョン
services: # 下のハッシュにサービスを作る。命名は自由だが、通常はwebとdbと名付ける。
  db:
    image: postgres # 使用するimage（dbでPostgreSQLを指定）
    volumes: # ディレクトリのマウント設定（dbデータなどを残せる）
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
  web:
    build: . # Dockerfileなどがあるパス（基本的にカレントディレクトリ）
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" # コマンド（server.pidファイルを削除してからrailsサーバー起動)
    volumes:
      - .:/illustration
    ports: # ポート番号。[ホスト：コンテナ]で設定。
      - "3000:3000"
    depends_on:
      - db # 依存関係を示していて、起動順を指定できます。ここではdb→webへと起動します。
```

##### __【Dockerfile】__
__変更前__

```dockerfile:Dockerfile
# [FROM] 使用するイメージとバージョン
FROM ruby:2.7.1
# [RUN] コマンドの実行。railsに必要なnodejsとpostgeqsqlをインストールしています
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

# yarnパッケージ管理ツールをインストール
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
      echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
      apt update && apt install -y yarn
# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
apt-get install nodejs

RUN mkdir /te_app
# [WORKDIR] 作業ディレクトリを設定
WORKDIR /te_app
# [COPY] ローカルのファイルをコンテナへコピー
COPY Gemfile /te_app/Gemfile
COPY Gemfile.lock /te_app/Gemfile.lock
RUN bundle install
COPY . /te_app

# コンテナが起動するたびに実行されるスクリプトを追加します
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
# [ENTRYPOINT] 一番最初に実行するコマンド（ここではentrypoint.shを参照）
ENTRYPOINT ["entrypoint.sh"]
# [EXPOSE] コンテナがリッスンするport番号
EXPOSE 3000

# メインプロセスを開始します
# [CMD] イメージ内部のソフトウェア実行（ここではRailsを指す）
CMD ["rails", "server", "-b", "0.0.0.0"]
```
↓__変更後__

```dockerfile:Dockerfile
# [FROM] 使用するイメージとバージョン
FROM ruby:2.7.1
# [RUN] コマンドの実行。railsに必要なnodejsとpostgeqsqlをインストールしています
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

# yarnパッケージ管理ツールをインストール
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
      echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
      apt update && apt install -y yarn
# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
apt-get install nodejs

RUN mkdir /illustration
# [WORKDIR] 作業ディレクトリを設定
WORKDIR /illustration
# [COPY] ローカルのファイルをコンテナへコピー
COPY Gemfile /illustration/Gemfile
COPY Gemfile.lock /illustration/Gemfile.lock
RUN bundle install
COPY . /illustration

# コンテナが起動するたびに実行されるスクリプトを追加します
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
# [ENTRYPOINT] 一番最初に実行するコマンド（ここではentrypoint.shを参照）
ENTRYPOINT ["entrypoint.sh"]
# [EXPOSE] コンテナがリッスンするport番号
EXPOSE 3000

# メインプロセスを開始します
# [CMD] イメージ内部のソフトウェア実行（ここではRailsを指す）
CMD ["rails", "server", "-b", "0.0.0.0"]
```
#### Ⅱ. buildし直します。

```
$ docker-compose build --no-cache
```
Dockerfileを更新したので、念のため__--no-cache__を追加しました。

## 3. GitHubのアプリ名の変更方法
Ⅰ. [GitHub](https://github.com/)の旧アプリ名で利用していたリポジトリを開き、__Settings__を選択します。
![スクリーンショット 2020-11-28 16.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/b9288abb-3712-abeb-a0ac-8bc25c06e104.png)

Ⅱ. __Repository name__を変更します。

![スクリーンショット 2020-11-28 16.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/0e73bc78-b1a1-b8a2-7e50-670b1401acee.png)

Ⅲ. 新アプリ名を入力したら、入力欄横の__Rename__をクリックします。

__↓illustration__に変更済
![スクリーンショット 2020-11-28 17.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/fd353480-5f1f-2d24-762b-3721017b870d.png)

これで、完成です。
後の操作(__git add → git commit → git push__)などは、通常通り行うことができます。


#### 参考記事
* [[Rails]rails newした後からアプリ名を変更する方法 - Qiita](https://qiita.com/ryoya-s/items/66e426f1a0dd5d87cd6f)
* [docker をキャッシュを使わないでビルドする | ハックノート](https://hacknote.jp/archives/47137/)
* [Railsのプロジェクト名と、GitHubのリポジトリ名を変更する - TechBox](https://www.techbox.jp/entry/github-namechange)