編集の要約なし
490行目: 490行目:
<br><br>
<br><br>


== CLIバイナリのビルド (SUSE) ==
== CLIバイナリのビルド ==
OpenCode CLIバイナリをSUSE環境でソースコードからビルドすることができる。<br>
<br>
==== ビルドの前提条件 ====
==== ビルドの前提条件 ====
<center>
<center>
499行目: 497行目:
! 項目 !! 要件
! 項目 !! 要件
|-
|-
| OS ||  
| Bun || 1.3.13以上<br>(リポジトリルートの <u>package.json</u> 内の <code>packageManager</code> フィールドで <code>bun@1.3.13</code> が指定されている)
* RHEL 9 / 10
* SUSE 15 / 16
|-
|-
| Bun || 1.3.x (<u>package.json</u> 内の <code>packageManager</code> で <code>bun@1.3.9</code> を指定)
| git || 必須ではない。<br>(<u>packages/script/src/index.ts</u> 内で <code>git branch --show-current</code> が呼び出されるが、環境変数で回避可能)
|-
|-
| git || ブランチ名取得に使用 (Gitリポジトリでない場合は環境変数で回避可能)
| ネットワーク || ビルド時に https://models.dev/api.json からモデル定義を取得
|-
|-
| ネットワーク || ビルド時に https://models.dev/api.json からモデルデータを取得
| ディスク空き容量 || 約3[GB]以上 (依存パッケージ + バイナリ約150[MB])
|}
|}
</center>
</center>
<br>
<br>
===== 前提条件の確認コマンド =====
===== 前提条件の確認コマンド =====
  # Bunバージョン確認 (1.3.9が必要)
  # 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>
<br>
 
==== ビルド方式の説明 ====
==== ビルド方式の説明 ====
<center>
<center>
525行目: 520行目:
! 項目 !! 内容
! 項目 !! 内容
|-
|-
| 言語 || TypeScript (Bun ランタイム)
| 言語 || TypeScript (Bunランタイム)
|-
|-
| ビルド方式 || <code>Bun.build()</code> の <code>compile: true</code> でスタンドアロン実行ファイルを生成
| ビルド方式 || <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>
ソースディレクトリがGitリポジトリでない場合、<code>git branch --show-current</code> が失敗するため、環境変数を設定する。<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.2.14>
  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>
<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>
このプロジェクトはBunワークスペース構成のモノレポである。<br>
===== Step 4 : ビルドの実行 =====
<code>bun install</code> コマンドを実行して、ルートおよび全パッケージの依存関係がインストールされる。<br>
<br><br>
 
==== ビルドの実行 ====
ビルドスクリプトを実行する。<br>
ビルドスクリプトを実行する。<br>
<br>
  ./packages/opencode/script/build.ts --single
  ./packages/opencode/script/build.ts --single
<br>
<br>
<code>--single</code> フラグは現在のプラットフォーム向けのみビルドする。(例: linux-x64)<br>
<code>--single</code> フラグは、現在のプラットフォームのみをビルドする。(例: <u>linux-x64</u>)<br>
フラグなしで実行すると全11プラットフォーム分のクロスコンパイルを試みる。<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>
* <code>models.dev</code> からモデルデータを取得し、TypeScript スナップショットを生成
* <code>@opentui/core</code> と <code>@parcel/watcher</code> のネイティブバインディングをインストール
* <code>Bun.build()</code> で TypeScript をスタンドアロンバイナリにコンパイル
* <code>packages/opencode/dist/opencode-linux-x64/bin/opencode</code> に出力
<br><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リポジトリではない || 下記の環境変数を設定する。<br><br>OPENCODE_VERSION=<バージョン  例: 1.1.53><br>OPENCODE_CHANNEL=latest
| <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>
|-
|-
| <code>models.dev</code> に接続できない || ネットワーク制限 || 事前に <u>api.json</u> をダウンロードして、<code>MODELS_DEV_API_JSON=/path/to/api.json</code> で指定する。
| GLIBCバージョン不足 || GLIBCバージョンが古い || <code>--single</code> に加えて <code>--baseline</code> フラグを追加してビルドする。<br>または、muslビルドを検討する。
|-
|-
| GLIBCバージョン不足 || SUSEの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を参照すること。
|-
|-
| native module のビルド失敗 || C / C++ コンパイラ不足 || ビルドツールをインストールする。
| Smoke testの失敗 || バイナリの実行可能パーミッションがない、またはGLIBCバージョン不足 || <code>chmod +x</code> でパーミッションを付与する。<br>GLIBCの場合は <code>--baseline</code> フラグを試行する。
<pre>sudo zypper install gcc gcc-c++ make</pre>
|}
|}
</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>