@rescript-tauri/plugin-os¶
Tauri 2.x OS 情報プラグイン の ReScript バインディング。platform / version / arch / family の sync ゲッターと locale / hostname の async ゲッターを提供します。@tauri-apps/plugin-os v2.3.x の安定公開 API を 100% カバーし、上流の文字列リテラル共用体に対応する 4 つの polymorphic variant 型で公開します。
注釈
本パッケージは main ブランチで機能実装が完了しています。初回 npm 公開は 他のパッケージと同タイミングで予定されています。それまでは、ソースリポジトリ経由または workspace link で利用してください。
インストール¶
pnpm add @rescript-tauri/plugin-os @tauri-apps/plugin-os
@rescript-tauri/plugin-os は @rescript-tauri/core と @tauri-apps/plugin-os の両方を peerDependencies として宣言しているため、上流の各バージョンを呼び出し側で管理できます。
rescript.json の dependencies に本パッケージを追加します:
{
"dependencies": [
"@rescript-tauri/core",
"@rescript-tauri/plugin-os"
]
}
Rust 側では builder にプラグインを登録します:
# src-tauri/Cargo.toml
[dependencies]
tauri-plugin-os = "2"
// src-tauri/src/main.rs
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_os::init())
.run(tauri::generate_context!())
.expect("error while running app");
}
tauri_plugin_os::init() は設定を受け取りません。本バインディングが公開するすべての API は、デフォルトの builder で動作します。
Capability 設定¶
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default",
"windows": ["main"],
"permissions": [
"core:default",
"os:default"
]
}
os:default は 2 つの async ゲッターが必要とする allow-locale と allow-hostname の IPC 権限を許可します。7 つの sync ゲッターは IPC を 通らない ため (後述の Sync ゲッター を参照) capability を消費しません。ただし JavaScript 側のグローバル変数を初期化するために、プラグインは引き続き Rust builder に登録する必要があります。
Sync ゲッター¶
9 関数のうち 7 つは IPC を通らず呼び出し時に解決されます。上流はプラグイン初期化時に window.__TAURI_OS_PLUGIN_INTERNALS__ グローバルへ値をキャッシュし、本バインディングはそれを読み出すだけです。そのため繰り返し呼び出しても低コストですが、RescriptTauriCore.Mocks.mockIPC では インターセプトできません。ランタイムテストでは globalThis.window.__TAURI_OS_PLUGIN_INTERNALS__ を直接 stub します (packages/plugin-os/tests/runtime/plugin_os.test.mjs を参照)。
open RescriptTauriPluginOs
let dumpEnv = () => {
Console.log2("eol bytes: ", PluginOs.eol()) // "\n" or "\r\n"
Console.log2("platform: ", PluginOs.platform()) // #linux | #macos | ...
Console.log2("version: ", PluginOs.version()) // OS version string
Console.log2("family: ", PluginOs.family()) // #unix | #windows
Console.log2("osType: ", PluginOs.OsType.get()) // #linux | #windows | ...
Console.log2("arch: ", PluginOs.arch()) // #x86_64 | #aarch64 | ...
Console.log2("exeExtension: ", PluginOs.exeExtension()) // "exe" or ""
}
関数 |
戻り値 |
備考 |
|---|---|---|
|
|
OS 固有の行終端文字 (POSIX では |
|
|
デスクトップ / モバイルのすべてのターゲットをカバーする 10 ケース |
|
|
カーネル / リリース識別子。自由形式の文字列 |
|
|
POSIX 系では |
|
|
ReScript ではトップレベルで |
|
|
11 種類の CPU アーキテクチャ |
|
|
Windows では |
Async ゲッター¶
残り 2 つの関数は async です。プラグイン初期化時ではなく呼び出し時に OS から値を取得するためです。通常の Tauri IPC (plugin:os|locale と plugin:os|hostname) を経由し、promise<Nullable.t<string>> を返します。Nullable.null は OS が値を公開していないことを意味します。
open RescriptTauriPluginOs
let printIdentity = async () => {
let host = await PluginOs.hostname()
let lang = await PluginOs.locale()
Console.log2(
"hostname:",
host->Nullable.toOption->Option.getOr("(unknown)"),
)
Console.log2(
"locale: ",
lang->Nullable.toOption->Option.getOr("(unknown)"),
)
}
関数 |
戻り値 |
備考 |
|---|---|---|
|
|
BCP-47 形式の言語タグ (例: |
|
|
OS のホスト名。DNS で解決できる名前である保証はありません |
Capability 要件¶
両 async ゲッターは上記の os:default capability セットの管理下にあります。これがないと、プラグインが実行される前に IPC ブリッジが呼び出しを拒否します。Sync ゲッターは capability をチェックせず (キャッシュされたグローバルを直接読むため)、platform() / arch() 等しか使わない Tauri アプリは 理論上 os:default 無しで動かせます。実用上は os:default を許可するのが最もシンプルで、上流ドキュメントの推奨にも沿います。
Polymorphic variant¶
4 つの polymorphic variant 型が上流の文字列リテラル共用体に対応します。いずれも網羅的にパターンマッチできるため、ReScript コンパイラはビルド時に 欠落ケースを警告します。
型 |
ケース |
返却元 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
パターンマッチ例¶
platform() で分岐して実行環境のラベルを生成します:
open RescriptTauriPluginOs
let labelForPlatform = () =>
switch PluginOs.platform() {
| #macos => "macOS"
| #linux
| #freebsd
| #dragonfly
| #netbsd
| #openbsd
| #solaris => "Unix-like"
| #windows => "Windows"
| #ios => "iOS"
| #android => "Android"
}
Console.log(labelForPlatform())
将来の上流マイナーリリースで新しい platform が追加され、本バインディングがそれを取り込むと、次回ビルド時にコンパイラはこの switch を non-exhaustive と警告します。これにより、上流の暗黙的な拡張が明示的な意思決定ポイントに変わります。
注意点¶
type() は OsType サブモジュール配下¶
上流 JavaScript は OS の type を type という関数で公開します。type は ReScript モジュールのトップレベルで予約語のため、本バインディングは OsType サブモジュール経由で公開します:
let osType = PluginOs.OsType.get() // not PluginOs.type()
Sync ゲッターは IPC を通らない¶
Mocks.mockIPC は IPC コマンドしかインターセプトしません。7 つの sync ゲッターは IPC を完全にバイパスするため、戻り値をフェイクしたいテストでは内部のグローバル変数を直接 stub します:
// in a vitest setup file
globalThis.window = globalThis.window || {}
globalThis.window.__TAURI_OS_PLUGIN_INTERNALS__ = {
platform: "linux",
version: "6.5.0",
family: "unix",
os_type: "Linux",
arch: "x86_64",
exe_extension: "",
eol: "\n",
}
async の locale() / hostname() は IPC を経由するため、通常どおり Mocks.mockIPC でモックできます。
#x86_64、#powerpc64 等はそのまま使える¶
ReScript の polymorphic variant タグは _ と数字を受け付けるため、上流の "x86_64" / "powerpc64" / "riscv64" / "s390x" / "sparc64" はクオートやエスケープなしで #x86_64 / #powerpc64 / #riscv64 / #s390x / #sparc64 にそのまま対応します。
互換性¶
項目 |
対応バージョン |
|---|---|
上流 |
|
Rust |
|
|
|
ReScript |
|
|
|
対応 OS |
Linux / macOS / Windows / iOS / Android |
関連リンク¶
動作デモ:
examples/plugin-os-demoソース:
packages/plugin-os上流ドキュメント: Tauri 2.x OS プラグイン
上流 JS リファレンス: os module