最短2週間で著名OSSのメンテナになる方法

意味がよくわからないタイトルですね。私もよく分かりません。

ある意味ではこの記事の続きです：[貢献チャンスの探し方](https://qiita.com/umireon/items/cbf27deea6ff96d79c1d)

## TL;DR

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">anyone who completes a PR with a test becomes a maintainer.</p>&mdash; Zoltan Kochan (@ZoltanKochan) <a href="https://twitter.com/ZoltanKochan/status/1428413144335110151?ref_src=twsrc%5Etfw">August 19, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## pnpmについて

https://github.com/pnpm/pnpm

GitHubスター数12.5k越えの超巨大OSS、で説明は十分でしょう。

## メンテナになって変わった事

変わったことといえば某F○rkwellにてこの2週間で21件スカウトが来たくらいで、特に何も生活は変わっていません。
ポートフォリオに公開できないプロジェクトの概要を書くよりはインパクトがあるんじゃないでしょうか？

## メンテナになる流れ

### Twitterで最新ソフトウェアの情報を仕入れる（初日）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">pnpm 6.12.0リリース。<br>`pnpm env use --global &lt;version&gt;`でNode.jsをインストールして利用できるように。<br>Node.jsのバージョン管理ツールとしてpnpmを利用できるように &quot;Release v6.12.0 · pnpm/pnpm&quot; <a href="https://t.co/TGl0cqME4J">https://t.co/TGl0cqME4J</a> <a href="https://twitter.com/hashtag/npm?src=hash&amp;ref_src=twsrc%5Etfw">#npm</a> <a href="https://twitter.com/hashtag/ReleaseNote?src=hash&amp;ref_src=twsrc%5Etfw">#ReleaseNote</a></p>&mdash; azu (@azu_re) <a href="https://twitter.com/azu_re/status/1424001461906640904?ref_src=twsrc%5Etfw">August 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これ見て、pnpmでnvm代替できるんじゃないかって思いました。

### パッケージマネージャ上のソフトウェアの定義を最新にする（初日）

https://github.com/Homebrew/homebrew-core/blob/28e1ff9d1bc6828faa06957abb9f0b1ab1db9413/Formula/pnpm.rb

```ruby
class Pnpm < Formula
  require "language/node"

  desc "📦🚀 Fast, disk space efficient package manager"
  homepage "https://pnpm.io/"
  url "https://registry.npmjs.org/pnpm/-/pnpm-6.11.5.tgz"
  sha256 "8eb5380d696c7e5ff8d7f58e31d453fca02363991e6162fee872bd08dac5c10f"
  license "MIT"

  livecheck do
    url "https://registry.npmjs.org/pnpm/latest"
    regex(/["']version["']:\s*?["']([^"']+)["']/i)
  end

  bottle do
    sha256 cellar: :any_skip_relocation, arm64_big_sur: "5e39cef7fd1b8e8715d678470b119052843d59fd7421c407fcdff24af3011044"
    sha256 cellar: :any_skip_relocation, big_sur:       "cbb69e29ac9cd2b924e9e1e8768a22798465e35ec48e0da244df1c8d57d4ddf6"
    sha256 cellar: :any_skip_relocation, catalina:      "cbb69e29ac9cd2b924e9e1e8768a22798465e35ec48e0da244df1c8d57d4ddf6"
    sha256 cellar: :any_skip_relocation, mojave:        "cbb69e29ac9cd2b924e9e1e8768a22798465e35ec48e0da244df1c8d57d4ddf6"
    sha256 cellar: :any_skip_relocation, x86_64_linux:  "5e39cef7fd1b8e8715d678470b119052843d59fd7421c407fcdff24af3011044"
  end

  depends_on "node"

  def install
    system "npm", "install", *Language::Node.std_npm_install_args(libexec)
    bin.install_symlink Dir["#{libexec}/bin/*"]
  end

  test do
    system "#{bin}/pnpm", "init", "-y"
    assert_predicate testpath/"package.json", :exist?, "package.json must exist"
  end
end
```

当時はHomebrew上のpnpmのバージョンが6.11.5だったので、`brew bump-formula-pr`を実行してバージョンを上げようとしました。

### 環境固有の問題を見つける（初日〜1週間目）

早速、新しい定義のpnpmをインストールして`pnpm env use -g 16`してみました。最初はうまく動きましたが、消したり入れたりしているうちにNode.js関連のプログラムが何も動かなくなってしまいました。調べたところ、pnpmがHomebrewが管理している`/usr/local/bin`以下を書き換えてしまっていることが判明したのでHomebrewのメンテナに報告しました。

https://github.com/Homebrew/homebrew-core/pull/82892#issuecomment-894664509

Running pnpm env use --global 16 (a new feature of pnpm) replaces /usr/local/bin/node with the following script:

```bash
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

case `uname` in
    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac

"$basedir/../../../Users/umireon/.pnpm/nodejs/16.6.1/bin/node"   "$@"
exit $?
```

pnpm and npm continue to work after this replacement, but upgrading node by Homebrew may not work.

```
% brew reinstall node
--- snip ---
==> Pouring node--16.6.1.big_sur.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/node
Target /usr/local/bin/node
already exists. You may want to remove it:
  rm '/usr/local/bin/node'

To force the link and overwrite all conflicting files:
  brew link --overwrite node

To list all files that would be deleted:
  brew link --overwrite --dry-run node

Possible conflicting files are:
/usr/local/bin/node
==> Summary
🍺  /usr/local/Cellar/node/16.6.1: 2,504 files, 48.3MB
```

Having a caveat for those who want to use pnpm env would be great.

Reference: https://github.com/pnpm/pnpm/releases/tag/v6.12.0

余談ですが、Homebrewのメンテナにはいつもボコボコにされています。

### アップストリームの課題の解決に手を貸す（1週間目）

pnpmのことを色々調べているうちにpnpmのとある課題にたどり着きました。

https://github.com/pnpm/pnpm/issues/3633

この課題によると、pnpmの中心人物はHomebrewに収録されているpnpmの形式をnpmを介したものからバイナリに変更したいようでした。なので、Homebrewへのプルリクのゴールをバージョンアップからバイナリへの以降に急に変更しました（本来やってはいけないことですが、元々あった問題を報告した形になったのでHomebrewのメンテナは許してくれました　）。

https://github.com/Homebrew/homebrew-core/pull/82892#issuecomment-894762489

The pnpm author wants to use binary edition of pnpm for package managers.
pnpm/pnpm#3633

### アップストリームへ貢献（1週間目〜2週間目）

Homebrewに適切な形で取り込んでもらうためにpnpmにガンガンプルリクを出しました。

- https://github.com/pnpm/pnpm/pull/3654
- https://github.com/pnpm/pnpm/pull/3658

課題でもどんどんディスカッションしました。

- https://github.com/pnpm/pnpm/issues/3633#issuecomment-900804281
- https://github.com/pnpm/pnpm/issues/2574#issuecomment-901133296

ついでに、ポータブルなインストール用シェルスクリプトを書きたいらしかったので、それに必要な環境を提供しました。

- https://github.com/pnpm/pnpm/issues/3633#issuecomment-900467264
- https://github.com/pnpm/get/pull/3
- https://github.com/pnpm/get/pull/5
- https://github.com/pnpm/get/pull/6
- https://github.com/pnpm/get/pull/7
- https://github.com/pnpm/get/pull/8

### ついにメンテナに…！（2週間目）

5本プルリクを通した後、突然それは来ました。

![Invitation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35580/a3588dcf-0a5f-e4a6-5b56-2b4f43d9db07.png)

## 結論

私は貢献チャンスをものにしました。誰にでもできることが立証されました😃