読者です 読者をやめる 読者になる 読者になる

ぼろぼろ平原

困った

RubyGemsとGitHubに公開したgemの名前を変更する手順

前提

  • gemをGitHubRubyGemsに公開したけど、あとから名前を変えたくなった
  • bundle gemコマンドでgemを作成した
  • oldnameという名前のgemをnewnameという名前にしたい

GitHubリポジトリ名を変更する

oldnameのリポジトリ → Settings → Repository name にnewnameと入力してRename

oldname gem使用者向けに警告を表示する

oldnameというブランチをmasterから作り、そこで作業する。

$ git checkout master
$ git checkout -b oldname

以下のコードをoldname gemのどこかに書く(colorizeライブラリなどで文字色を変更して目立たせると気づかれやすい)。

warn "[DEPRECATION] This gem has been renamed to `newname` and will no longer be supported. Please switch to `newname` as soon as possible."

次に、以下のコードをoldname.gemspecに追加する。するとoldname gemのアップデート時にこのメッセージが出る。

spec.post_install_message = <<-MESSAGE
 ! The 'oldname' gem has been deprecated and has been replaced by 'newname'.
 ! See: https://rubygems.org/gems/newname
 ! And: https://github.com/YourID/newname
MESSAGE

最後にtinyバージョンを1つ上げる。

lib/oldname/version.rb

module OldName
  VERSION = "0.1.1" # 0.0.1上げる
end

newname gemの設定

newnameというブランチをmasterから作り、そこで作業する。

$ git checkout master
$ git checkout -b newname

まずはコード中のoldnameOldNameをすべてnewnameNewNameに置換する。ファイルやディレクトリ名のoldnamenewnameに置換する。その時は、mvコマンドではなくgit mvコマンドを使う。

$ git mv oldname.gemspec newname.gemspec
$ git mv lib/oldname/ lib/newname/
(省略)

newname.gemspecdescriptionsummaryに以下の文を追加する(任意)。

Formerly known as 'oldname'.

gemのリリース

まずはoldnameをRubyGemsにリリースする。masterでないブランチでreleaseするので、set-upstream(-u)する必要がある。

$ git checkout oldname
$ git push -u origin oldname
$ bundle exec rake release

次にnewnameをRubyGemsにリリースする。

$ git checkout newname
$ git push -u origin newname
$ bundle exec rake release

masterブランチの変更

masterブランチをnewnameブランチと同じにする。

$ git checkout newname
$ git branch -d master
$ git branch master

最後にGitHubにmasterをpushして完了。

$ git checkout master
$ git push -u origin master -f