編集の要約なし |
|||
| 490行目: | 490行目: | ||
<br><br> | <br><br> | ||
== CLIバイナリのビルド | == CLIバイナリのビルド == | ||
==== ビルドの前提条件 ==== | ==== ビルドの前提条件 ==== | ||
<center> | <center> | ||
| 499行目: | 497行目: | ||
! 項目 !! 要件 | ! 項目 !! 要件 | ||
|- | |- | ||
| | | Bun || 1.3.13以上<br>(リポジトリルートの <u>package.json</u> 内の <code>packageManager</code> フィールドで <code>bun@1.3.13</code> が指定されている) | ||
|- | |- | ||
| | | git || 必須ではない。<br>(<u>packages/script/src/index.ts</u> 内で <code>git branch --show-current</code> が呼び出されるが、環境変数で回避可能) | ||
|- | |- | ||
| | | ネットワーク || ビルド時に https://models.dev/api.json からモデル定義を取得 | ||
|- | |- | ||
| | | ディスク空き容量 || 約3[GB]以上 (依存パッケージ + バイナリ約150[MB]) | ||
|} | |} | ||
</center> | </center> | ||
<br> | <br> | ||
===== 前提条件の確認コマンド ===== | ===== 前提条件の確認コマンド ===== | ||
# Bunバージョン確認 (1.3. | # Bunバージョン確認 (1.3.13以上が必要) | ||
bun --version | bun --version | ||
# ネットワーク接続の確認 | # ネットワーク接続の確認 | ||
curl -s https://models.dev/api.json | head -c 100 | curl -s https://models.dev/api.json | head -c 100 | ||
<br> | <br> | ||
==== ビルド方式の説明 ==== | ==== ビルド方式の説明 ==== | ||
<center> | <center> | ||
| 525行目: | 520行目: | ||
! 項目 !! 内容 | ! 項目 !! 内容 | ||
|- | |- | ||
| 言語 || TypeScript ( | | 言語 || TypeScript (Bunランタイム) | ||
|- | |- | ||
| ビルド方式 || <code>Bun.build()</code> の <code>compile | | ビルド方式 || <code>Bun.build()</code> の <code>compile</code> オプションでスタンドアロン実行ファイルを生成 | ||
|- | |- | ||
| ビルドスクリプト || <u>packages/opencode/script/build.ts</u> | | ビルドスクリプト || <u>packages/opencode/script/build.ts</u> | ||
|- | |- | ||
| 出力 || Bunランタイムを内蔵した単一バイナリ (<code>opencode</code>) | | 出力 || Bunランタイムを内蔵した単一バイナリ (<code>opencode</code>) | ||
|- | |||
| 出力先 || <u>packages/opencode/dist/opencode-linux-x64/bin/opencode</u> | |||
|- | |||
| バイナリサイズ || 約150MB (Bunランタイム、TypeScriptコード、Web UIアセットを含む) | |||
|} | |} | ||
</center> | </center> | ||
<br> | <br> | ||
==== 環境変数の設定 ==== | ネイティブモジュール (<code>@opentui/core</code>、<code>@parcel/watcher</code>) は、ビルドスクリプトが各プラットフォーム向けの <u>事前ビルド済みバイナリ</u> をダウンロードするため、<br> | ||
CLIビルドではC/C++のソースコードからのコンパイルは発生しない。<br> | |||
このため、CLIのビルドにおいては、デスクトップアプリビルドのようなGCC 10以降の要件はない。<br> | |||
<br> | |||
==== ビルド手順 ==== | |||
===== Step 1 : 環境変数の設定 ===== | |||
ソースディレクトリがGitリポジトリでない場合 (tarballから展開しただけの場合等) は、<u>packages/script/src/index.ts</u> 内で <code>git branch --show-current</code> が実行されて失敗するため、環境変数を設定する。<br> | |||
<syntaxhighlight lang="sh"> | <syntaxhighlight lang="sh"> | ||
export OPENCODE_VERSION=<バージョン 例 : 1. | export OPENCODE_VERSION=<バージョン 例 : 1.14.41> | ||
export OPENCODE_CHANNEL=latest | export OPENCODE_CHANNEL=latest | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br> | ||
環境変数 <code>OPENCODE_VERSION</code> に <code>0.0.0-</code> で始まらない値を指定すると、<code>git</code> コマンドの呼び出しが回避される。<br> | |||
==== 依存パッケージのインストール ==== | 環境変数 <code>OPENCODE_CHANNEL</code> はビルド成果物の <code>--version</code> 表示およびユーザエージェント文字列に使用される。<br> | ||
<br> | |||
===== Step 2 : Bunのlinker設定 ===== | |||
デスクトップアプリビルドのセクションと同様に、リポジトリルートの <u>bunfig.toml</u> に <code>linker = "hoisted"</code> を追加する。<br> | |||
<br> | |||
vi /path/to/opencode-<バージョン>/bunfig.toml | |||
<br> | |||
<syntaxhighlight lang="toml"> | |||
[install] | |||
exact = true | |||
linker = "hoisted" | |||
[test] | |||
root = "./do-not-run-tests-from-root" | |||
</syntaxhighlight> | |||
<br> | |||
CLI単体のビルドではViteは使用されないため、isolated linkerでも動作する可能性がある。<br> | |||
<u>ただし、OpenCode Desktopのビルドと環境を共有する場合は、整合性を保つためhoistedモードを推奨する。</u><br> | |||
<br> | |||
===== Step 3 : 依存パッケージのインストール ===== | |||
リポジトリルートで依存パッケージをインストールする。<br> | |||
このリポジトリはBunワークスペース構成のモノレポであるため、ルートでの <code>bun install</code> 実行で全パッケージの依存関係がインストールされる。<br> | |||
<br> | |||
isolated linkerからhoistedに切り替えた直後、または、過去のnode_modulesが残存している場合は、全てのnode_modulesディレクトリを削除してから再インストールする。<br> | |||
<br> | |||
cd /path/to/opencode-<バージョン> | cd /path/to/opencode-<バージョン> | ||
rm -rf node_modules packages/*/node_modules packages/*/*/node_modules | |||
bun install | bun install | ||
<br> | <br> | ||
===== Step 4 : ビルドの実行 ===== | |||
==== ビルドの実行 ==== | |||
ビルドスクリプトを実行する。<br> | ビルドスクリプトを実行する。<br> | ||
<br> | |||
./packages/opencode/script/build.ts --single | ./packages/opencode/script/build.ts --single | ||
<br> | <br> | ||
<code>--single</code> | <code>--single</code> フラグは、現在のプラットフォームのみをビルドする。(例: <u>linux-x64</u>)<br> | ||
フラグなしで実行すると、全12プラットフォーム分のクロスコンパイルを試みる。<br> | |||
(<u>linux-x64</u>、<u>linux-arm64</u>、<u>darwin-x64</u>、<u>darwin-arm64</u>、<u>win32-x64</u>、<u>win32-arm64</u>、各baselineおよびmuslバリアント)<br> | |||
<br> | |||
ビルドスクリプトの処理内容を以下に示す。<br> | |||
<br> | |||
# <u>packages/opencode/script/generate.ts</u> が <code>https://models.dev/api.json</code> からモデルデータを取得して、<u>packages/opencode/src/provider/models.ts</u> 等のスナップショットを生成する。 | |||
# Web UI (<u>packages/app</u>) を <code>vite build</code> でビルドして、生成されたアセットを単一バイナリに埋め込む。 | |||
# <code>@opentui/core</code> および <code>@parcel/watcher</code> の全プラットフォーム向けプリビルドバイナリをインストールする。(<code>bun install --os="*" --cpu="*"</code>) | |||
# <code>Bun.build()</code> の <code>compile</code> オプションでTypeScriptをスタンドアロンバイナリにコンパイルして、<u>packages/opencode/dist/opencode-linux-x64/bin/opencode</u> に出力する。 | |||
# 自動Smoke testとして、生成されたバイナリの <code>--version</code> を実行して、出力を確認する。 | |||
<br> | <br> | ||
==== 動作確認 ==== | ==== 動作確認 ==== | ||
ビルドが完了した後、バイナリが生成されたかどうかを確認する。<br> | |||
ls -la packages/opencode/dist/opencode-linux-x64/bin/opencode | ls -la packages/opencode/dist/opencode-linux-x64/bin/opencode | ||
<br> | |||
バージョンを表示する。<br> | |||
./packages/opencode/dist/opencode-linux-x64/bin/opencode --version | |||
<br> | |||
ヘルプを表示する。<br> | |||
./packages/opencode/dist/opencode-linux-x64/bin/opencode --help | ./packages/opencode/dist/opencode-linux-x64/bin/opencode --help | ||
<br> | |||
TUIを起動する。<br> | |||
./packages/opencode/dist/opencode-linux-x64/bin/opencode | |||
<br><br> | <br><br> | ||
===== システムへのインストール ===== | |||
ビルドしたバイナリを <u>/usr/local/bin/</u> にコピーすると、システム全体で <code>opencode</code> コマンドとして使用できる。<br> | |||
<br> | |||
sudo cp packages/opencode/dist/opencode-linux-x64/bin/opencode /usr/local/bin/opencode | |||
sudo chmod +x /usr/local/bin/opencode | |||
<br> | |||
ユーザディレクトリにのみインストールする場合は、<u>~/.local/bin/</u> 等にコピーする。<br> | |||
mkdir -p ~/.local/bin | |||
cp packages/opencode/dist/opencode-linux-x64/bin/opencode ~/.local/bin/opencode | |||
chmod +x ~/.local/bin/opencode | |||
<br> | |||
==== トラブルシューティング ==== | ==== トラブルシューティング ==== | ||
<center> | <center> | ||
| 579行目: | 623行目: | ||
! 問題 !! 原因 !! 対策 | ! 問題 !! 原因 !! 対策 | ||
|- | |- | ||
| <code>git branch --show-current</code> 失敗 || ソースがGitリポジトリではない || | | <code>git branch --show-current</code> 失敗 || ソースがGitリポジトリではない || 環境変数を設定する。<br><br><code>export OPENCODE_VERSION=1.14.41</code><br><code>export OPENCODE_CHANNEL=latest</code> | ||
|- | |||
| <code>models.dev</code> に接続できない || ネットワーク制限またはプロキシ環境 || 事前に <u>api.json</u> をダウンロードしておき、環境変数 <code>MODELS_DEV_API_JSON=/path/to/api.json</code> で指定する。<br>詳細は、後述の[[#オフライン環境でのビルド|オフライン環境でのビルド]]を参照すること。 | |||
|- | |||
| <code>This script requires bun@^X.X.X, but you are using bun@X.X.X</code> || Bunのバージョンが古い || Bunをアップグレードする。<br><pre>bun upgrade</pre> | |||
|- | |- | ||
| | | GLIBCバージョン不足 || GLIBCバージョンが古い || <code>--single</code> に加えて <code>--baseline</code> フラグを追加してビルドする。<br>または、muslビルドを検討する。 | ||
|- | |- | ||
| <code>error: File not found ".../packages/sdk/js/node_modules/cross-spawn"</code> || isolated linker時代の壊れたシンボリックリンクが残存している || 全ての <u>node_modules</u> を削除して、再インストールする。<br>詳細は、Step 3を参照すること。 | |||
|- | |- | ||
| | | Smoke testの失敗 || バイナリの実行可能パーミッションがない、またはGLIBCバージョン不足 || <code>chmod +x</code> でパーミッションを付与する。<br>GLIBCの場合は <code>--baseline</code> フラグを試行する。 | ||
< | |||
|} | |} | ||
</center> | </center> | ||
| 592行目: | 639行目: | ||
===== オフライン環境でのビルド ===== | ===== オフライン環境でのビルド ===== | ||
ネットワークに接続できない場合、モデルデータを事前にダウンロードしておく必要がある。<br> | ネットワークに接続できない場合、モデルデータを事前にダウンロードしておく必要がある。<br> | ||
オンライン環境で事前にダウンロードする。<br> | |||
<br> | |||
curl -o api.json https://models.dev/api.json | curl -o api.json https://models.dev/api.json | ||
<br> | |||
ビルド時にローカルファイルを指定する。<br> | |||
<br> | |||
export MODELS_DEV_API_JSON=/path/to/api.json | export MODELS_DEV_API_JSON=/path/to/api.json | ||
./packages/opencode/script/build.ts --single | ./packages/opencode/script/build.ts --single | ||
<br | <br | ||
===== baselineビルド ===== | ===== baselineビルド ===== | ||
CPUがAVX2命令セットをサポートしていない場合、<code>--baseline</code> フラグを追加する。<br> | CPUがAVX2命令セットをサポートしていない場合、<code>--baseline</code> フラグを追加する。<br> | ||
./packages/opencode/script/build.ts --single --baseline | ./packages/opencode/script/build.ts --single --baseline | ||
<br> | |||
baselineビルドの出力先は <u>packages/opencode/dist/opencode-linux-x64-baseline/bin/opencode</u> となる。<br> | |||
<br> | |||
===== 全プラットフォーム向けクロスコンパイル ===== | |||
<code>--single</code> フラグを外して実行すると、全12プラットフォーム向けのバイナリを生成する。<br> | |||
<br> | |||
./packages/opencode/script/build.ts | |||
<br> | |||
ただし、Smoke testは現在のプラットフォーム向けのバイナリのみで実行される。<br> | |||
他プラットフォーム向けのバイナリは、対象プラットフォーム上で別途動作確認する必要がある。<br> | |||
<br><br> | <br><br> | ||