@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.jsondependencies に本パッケージを追加します:

{
  "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-localeallow-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 ""
}

関数

戻り値

備考

eol()

string

OS 固有の行終端文字 (POSIX では "\n"、Windows では "\r\n")

platform()

platform バリアント

デスクトップ / モバイルのすべてのターゲットをカバーする 10 ケース

version()

string

カーネル / リリース識別子。自由形式の文字列

family()

family バリアント

POSIX 系では #unix、それ以外は #windows

OsType.get()

osType バリアント

ReScript ではトップレベルで type が予約語のためサブモジュール経由で公開

arch()

arch バリアント

11 種類の CPU アーキテクチャ

exeExtension()

string

Windows では "exe"、それ以外は ""

Async ゲッター

残り 2 つの関数は async です。プラグイン初期化時ではなく呼び出し時に OS から値を取得するためです。通常の Tauri IPC (plugin:os|localeplugin: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)"),
  )
}

関数

戻り値

備考

locale()

promise<Nullable.t<string>>

BCP-47 形式の言語タグ (例: "en-US")

hostname()

promise<Nullable.t<string>>

OS のホスト名。DNS で解決できる名前である保証はありません

Capability 要件

両 async ゲッターは上記の os:default capability セットの管理下にあります。これがないと、プラグインが実行される前に IPC ブリッジが呼び出しを拒否します。Sync ゲッターは capability をチェックせず (キャッシュされたグローバルを直接読むため)、platform() / arch() 等しか使わない Tauri アプリは 理論上 os:default 無しで動かせます。実用上は os:default を許可するのが最もシンプルで、上流ドキュメントの推奨にも沿います。

Polymorphic variant

4 つの polymorphic variant 型が上流の文字列リテラル共用体に対応します。いずれも網羅的にパターンマッチできるため、ReScript コンパイラはビルド時に 欠落ケースを警告します。

ケース

返却元

platform

#linux / #macos / #ios / #freebsd / #dragonfly / #netbsd / #openbsd / #solaris / #android / #windows (10)

platform()

osType

#linux / #windows / #macos / #ios / #android (5)

OsType.get()

arch

#x86 / #x86_64 / #arm / #aarch64 / #mips / #mips64 / #powerpc / #powerpc64 / #riscv64 / #s390x / #sparc64 (11)

arch()

family

#unix / #windows (2)

family()

パターンマッチ例

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 にそのまま対応します。

互換性

項目

対応バージョン

上流 @tauri-apps/plugin-os

^2.0.0 (peer)

Rust tauri-plugin-os

2.x

@rescript-tauri/core

^0.1.0 (peer)

ReScript

>=12.0.0

@rescript/core

>=1.6.0

対応 OS

Linux / macOS / Windows / iOS / Android

関連リンク