🔧

bunでパッケージにpatchをあててみた

2024/09/05に公開

こんにちは〜 NITICのこうちゅけです。
以前にクラスメイトの@れおはかせBunでパッチを当てるためにpatch-packageを動かす方法という記事を執筆していました。
この記事はbun patchコマンドが実装される前に執筆されていて、patch-packageをbunで動かすためにpatch-packagepatch-packageにpatchを当てるということをした、という記事でした。
現在はbun patchが実装され、bunだけでpatchが当てられるようになったので実際に使ってみた、という記事です。

bunの公式ページ
https://bun.sh/docs/install/patch

0. 環境

この記事では以下の環境で開発、コード提案を行なっています。

❯ bun -v
1.1.26

1. パッチを当てるパッケージを準備する

今回、patchを当てるパッケージはElysiaJSというWebフレームワークのOpenAPI用のドキュメントを生成してくれるelysia-swaggerというパッケージです。
patchの対象パッケージは基本的にどれでも大丈夫だと思います。

# パッケージのインストール
bun add @elysiajs/swagger@1.1.1

パッケージがインストールできたら、以下のコマンドを実行します。

bun patch <pkg>

今回の場合:(pathが長いので置き換えています。)

bun patch @elysiajs/swagger@1.1.1

出力結果:

To patch @elysiajs/swagger, edit the following folder:

  /your/dir/node_modules/@elysiajs/swagger

Once you're done with your changes, run:

  bun patch --commit '/your/dir/node_modules/@elysiajs/swagger'

patchコマンドの引数でパッケージを指定するのですが、以下のような指定方法があるらしいです。

対象パッケージ 今回の場合だと
パッケージ名 @elysiajs/swagger
パッケージ名@バージョン @elysiajs/swagger@1.1.1
パス /your/dir/node_modules/@elysiajs/swagger

今回はバージョン込みの指定方法で行っています。
コマンドの実行後、パッケージがある場所のpathと、patchを反映するためのコマンドが出力されます。

2. コードを変更する

さて、下準備が終わったので実際にコードを書き換えていきましょう。
記述方法は何でもいいんですが自分はVSCodeで開いて書き換えました。

code /your/dir/node_modules/@elysiajs/swagger
index.mjs
// ...

// src/utils.ts
- import path from "path";
+ import path from "node:path";


// node_modules/@sinclair/typebox/build/esm/type/symbols/symbols.mjs
var TransformKind = Symbol.for("TypeBox.Transform");
var ReadonlyKind = Symbol.for("TypeBox.Readonly");
var OptionalKind = Symbol.for("TypeBox.Optional");
var Hint = Symbol.for("TypeBox.Hint");
var Kind = Symbol.for("TypeBox.Kind");

// ...

終わったらきちんと変更を保存しましょう。

3. 変更を反映する

コードの変更を反映するために以下のコマンドを実行します。
これは最初に実行したコマンドの出力にあったコマンドです。

bun patch --commit <path or pkg>

今回の場合だと:

bun patch --commit '/your/dir/node_modules/@elysiajs/swagger'

そうすると変更を加えたパッケージに.bun-tag-<hash値>というファイルが生成されます。
また、プロジェクトのrootにpatchesというフォルダが生成され、その中に@elysiajs%2Fswagger@1.1.1.patchというファイルが作成されます。

@elysiajs%2Fswagger@1.1.1.patch
diff --git a/dist/index.mjs b/dist/index.mjs
index c421da0e95452e80b8fa74c02af601dc85337bde..37eff454ce1b722acda9b7fdf2f8be8f6d96c099 100644
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -274,7 +274,7 @@ var ScalarRender = (version, config, cdn) => `<!doctype html>
 </html>`;
 
 // src/utils.ts
-import path from "path";
+import path from "node:path";
 
 // node_modules/@sinclair/typebox/build/esm/type/symbols/symbols.mjs
 var TransformKind = Symbol.for("TypeBox.Transform");

さらに、プロジェクトのpackage.jsonpatchedDependenciesというフィールドが作成されます。

package.json
{
  ...
  "patchedDependencies": {
    "@elysiajs/swagger@1.1.1": "patches/@elysiajs%2Fswagger@1.1.1.patch"
  }
}

たったこれだけでパッチを当てることができます。

4. おわりに

今回、bun patchコマンドを使用してpatchをあててみましたが、意外と簡単にpatchをあてれてびっくりしました。
今後どんどん使用していこうかなと思いました。

GitHubで編集を提案

Discussion