package.json に自分のリポジトリの URL を書いて難を逃れた話
定かではないが 2020 年くらいの話である.思い出したので記事にした.
状況がピンポイントすぎるため 99.9% の人には役立たないだろう.
状況
-
ハッカソンで開発していたアプリケーションにライブラリを組み込んだらバグを踏んで動作しなかった.
-
issue を立てたが,ハッカソンの終了には修正が間に合うはずもないので気合いでなんとかした.
前提
-
ライブラリのバグ及びライブラリの開発者を批判するつもりは一切ない.
-
筆者はプロダクトにはバグがつきものだと考えているし,ライブラリを使用する際には開発者に敬意を払うべきと考えている.
-
今回のような場合は使用者がなんとかすべきであるし,開発者に対してバグの報告はしても急ぎの対応などを強いてはならない.
状況
ハッカソンに参加し,個人でプロダクト(フロントは React,サーバは Node.js)を開発していた.
その際,フロント側に必要な機能をちょうどよく提供してくれるライブラリを見つけたため使うこととした.ライブラリは更新もそれなりの頻度で継続しており,ダウンロード数も当時で 200,000 以上であったため採用した.
開発が佳境に差し掛かり,最後の重要な機能を実装しようとしたらエラーが発生した.ライブラリのとあるメソッドが定義されていない旨のエラーで.インストールしたソースコードを見ても確かに該当するメソッドが定義されていなかった.
すぐにライブラリのリポジトリに issue を立てたが,ハッカソンの発表会 2 日前なので開発者の修正が間に合う可能性はほぼ 0 である.これはさすがに詰んだと思った.
原因
リポジトリの issue を確認すると過去に似た問題があり,リポジトリのコードを確認すると該当するメソッドが記述されていた.どうやら GitHub リポジトリに push されていたコードと npm に公開されているコードが異なっていたようだ.
-
GitHub のコード:今回ハマったバグ修正済み.ブラウザから確認すると修正が確認できる.
-
npm のコード:バグ未修正.自分がインストールしたのはこちらのコード.バージョンの番号は GitHub のコードと同様となっていた.
解決策
issue を立てたので,開発者が修正してくれるのと待つのが基本となる.事実,数日後に修正された.
しかし時はハッカソン終盤,修正を待たずになんとかしなければならない.ググりまくって情報を集めた結果,とった手法は以下.
-
ライブラリのコードを自分のリポジトリにフォークする.
-
自分でコードを修正してビルドし,push する.
-
React の
package.json
に自分のリポジトリの URL を記述してコードをインストールする.
3 の手法はこのときはじめて知った.バージョン指定はよく行っていたが,それ以外にも様々な指定のしかたが存在する.
↓ 例えばこんな感じらしい.
{
"dependencies": {
"foo": "1.0.0 - 2.9999.9999",
"bar": ">=1.0.2 <2.1.2",
"baz": ">1.0.2 <=2.3.4",
"boo": "2.0.1",
"qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
"asd": "http://asdf.com/asdf.tar.gz",
"til": "~1.2",
"elf": "~1.2.3",
"two": "2.x",
"thr": "3.3.x",
"lat": "latest",
"dyl": "file:../dyl"
}
}
↓ ドキュメントに書いてある.ちゃんと読め過去の我.
https://docs.npmjs.com/cli/v9/configuring-npm/package-json#dependencies
ビルドしたコードを push する際のディレクトリ構成で少し手間取ったが,無事最新のコードをインストールして動作させることができた.
↓ packsge.json
にはこんな感じに書いた.
"@hogehoge/api": "git+https://github.com/taroosg/hogehoge-api.git",
感想
過去最高レベルに焦ったハマり方だったが「自分でなんとかする」「必要とあらば無理にでも動かす」力は間違いなくアップしたので良い経験となった.
-
package.json
には URL を書ける.ライブラリだろうがなんだろうが,最悪自分で修正して読み込めば動かすことができる. -
対症療法なので,公開しているプロダクトなどでは大人しく iisue を立てて開発者の修正を待つのが吉.
-
そして多分誰もハマらない.
以上だ( `・ω・)b
Discussion