mcpField
R
rust-npm-publish

rust-npm-publish

github.com/onsager-ai開発761 回インストール2 週間前に更新
リポジトリ

rust-npm-publish について

Rust npm Publishingは、Rustバイナリのnpm配布を設定・トラブルシューティングするスキルです。プラットフォーム別のオプションパッケージ、バージョン同期、公開手順を扱い、スクリプトとテンプレートも含みます。

主な機能

  1. 01プラットフォーム別npmパッケージの設定
  2. 02ラッパーとパッケージマニフェストの生成
  3. 03npmとCargoのバージョン同期
  4. 04順序に沿った公開パイプラインの実行
  5. 05公開時の問題の診断

活用シーン

  1. 01Rust CLIのnpm配布の設定
  2. 02プラットフォームパッケージ公開失敗の調査
  3. 03ワークスペースとCargoのバージョン統一

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/onsager-ai/dev-skills --skill rust-npm-publish

インストール後、Claude Code で/rust-npm-publishを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

examples/
clawden.config.ts
lean-spec.config.ts
references/
platform-matrix.md
publish-pipeline.md
troubleshooting.md
version-strategy.md
workspace-protocol.md
templates/
add-platform-deps.ts
bump-dev-version.ts
copy-platform-binaries.sh
generate-platform-manifests.ts
prepare-publish.ts
publish-main-packages.ts
publish-platform-packages.ts
restore-packages.ts
sync-versions.ts
types.ts
validate-no-workspace-protocol.ts
validate-platform-binaries.ts
templates/scripts/
.gitkeep
templates/wrapper/
bin.js
package.json

詳細

Rust npm 公開

optionalDependencies のプラットフォームパッケージパターンを使用して、Rust バイナリを npm で配布します。

このスキルを使用するタイミング

次のいずれかに該当する場合に有効化します。

  • Rust バイナリを npm で公開する場合、または公開パイプラインの失敗をデバッグする場合
  • publish.config.ts、bin.js、またはプラットフォームパッケージのマニフェストを設定する場合
  • ワークスペースパッケージと Cargo.toml のバージョン同期を管理する場合
  • workspace:* プロトコルまたは prepare/restore スクリプトを扱う場合
  • *publish*、*platform*、*version*、または *sync* に一致するスクリプトが存在する場合

判断ツリー

What does the user need?

Setting up publishing for the first time?
  → The Pattern section + Configuration + Templates

Running the publish pipeline?
  → Publish Pipeline section
  → Full details: references/publish-pipeline.md

Adding a new platform?
  → Adding a New Platform section
  → Platform reference: references/platform-matrix.md

Version sync / bump?
  → Versioning section
  → Full strategy: references/version-strategy.md
  → workspace:* details: references/workspace-protocol.md

Debugging a failure?
  → references/troubleshooting.md

パターン

@scope/my-tool                    ← main package (thin JS wrapper + bin.js)
├── optionalDependencies:
│   ├── @scope/my-tool-darwin-arm64   ← macOS ARM (M-series)
│   ├── @scope/my-tool-darwin-x64     ← macOS Intel
│   ├── @scope/my-tool-linux-x64      ← Linux x86_64
│   └── @scope/my-tool-windows-x64    ← Windows x86_64

各プラットフォームパッケージに含まれるのは、そのターゲット向けにコンパイル済みのバイナリのみです。npm は、インストール時にユーザーの OS/CPU に一致するものだけをインストールします。

SWC、Turbopack、esbuild などで使われているものと同じアプローチです。

設定

各リポジトリには publish.config.ts が用意されています(examples/ を参照)。

export default {
  scope: '@myorg',
  binaries: [{ name: 'my-cli', scope: 'cli', cargoPackage: 'my-cli-rs' }],
  platforms: ['darwin-x64', 'darwin-arm64', 'linux-x64', 'windows-x64'],
  mainPackages: [{ path: 'packages/cli', name: 'my-cli' }],
  cargoWorkspace: 'Cargo.toml',
  repositoryUrl: 'https://github.com/myorg/my-project',
};

公開パイプライン

sync-versions → generate-manifests → add-platform-deps → copy-binaries
→ validate-binaries → prepare-publish → validate-workspace → publish-platforms
→ wait-propagation → publish-main → restore-packages

重要な順序:メインパッケージはプラットフォームパッケージを optionalDependencies として参照するため、メインパッケージより先にプラットフォームパッケージを公開し、反映させる必要があります。

手順の詳細は references/publish-pipeline.md を参照してください。

メインパッケージのラッパー(bin.js)

メインの npm パッケージは薄い JS ラッパーです。bin.js がプラットフォームバイナリを解決し、起動します。テンプレートについては templates/wrapper/ を参照してください。

主なポイント:

  • process.platform が返すのは windows ではなく win32 です。win32-x64 を @scope/cli-windows-x64 にマッピングします。
  • require.resolve('pkg/package.json') を使用してプラットフォームパッケージを探し、次に main を読み込んでバイナリ名を取得します。
  • execFileSync を使用し、Rust プロセスの終了コードを引き継ぎます。
  • メインパッケージには os/cpu フィールドがありません。どこにでもインストールされます。これらのフィールドを使用するのはプラットフォームパッケージのみです。

プラットフォームパッケージのマニフェスト

各プラットフォームパッケージには、os/cpu フィールドと chmod 用の postinstall.js が必要です。

{
  "name": "@scope/cli-darwin-arm64",
  "os": ["darwin"],
  "cpu": ["arm64"],
  "main": "my-cli"
}

プラットフォームマトリックス

プラットフォームRust ターゲットoscpuバイナリ拡張子
darwin-arm64aarch64-apple-darwindarwinarm64(なし)
darwin-x64x86_64-apple-darwindarwinx64(なし)
linux-x64x86_64-unknown-linux-gnulinuxx64(なし)
windows-x64x86_64-pc-windows-msvcwin32x64.exe

プラットフォームの追加方法については、references/platform-matrix.md を参照してください。

新しいプラットフォームの追加

  1. publish.config.ts の platforms 配列に追加します
  2. Rust ターゲットを追加します:rustup target add <target-triple>
  3. 公開ワークフローの CI マトリックスに追加します
  4. マニフェストを再生成します:pnpm tsx scripts/generate-platform-manifests.ts

バージョン管理

ルートの package.json が唯一の信頼できる情報源です。他の場所でバージョンを手動編集しないでください。

root package.json (version: "0.2.15")
  ├── packages/cli/package.json  → 0.2.15  (via sync-versions.ts)
  ├── Cargo.toml                 → 0.2.15
  └── platform-packages/*/      → 0.2.15  (via generate-manifests)
バージョン同期の流れ
npm version patch                     # Bump root: 0.2.15 → 0.2.16
pnpm tsx scripts/sync-versions.ts     # Propagate to all packages + Cargo.toml
開発ビルド

CI では次のように計算されます:0.2.15 → 0.2.16-dev.{github_run_id}。--tag dev を指定して公開します。インストール方法:npm install my-cli@dev

開発ビルドでは Cargo.toml をベースバージョン(0.2.15)のままにします。Cargo のプレリリース処理は npm と異なるためです。

バージョン更新ガイド
変更コマンド例
互換性を損なう API 変更npm version major1.0.0 → 2.0.0
新機能npm version minor0.2.0 → 0.3.0
バグ修正npm version patch0.2.15 → 0.2.16
CI/テスト自動(CI)0.2.15 → 0.2.16-dev.123
workspace:* プロトコル

pnpm は開発中の内部依存関係に workspace:* を使用します。公開前に置換し、公開後に元に戻します。

pnpm tsx scripts/prepare-publish.ts                  # Replace workspace:* → real versions
pnpm tsx scripts/validate-no-workspace-protocol.ts   # Safety gate
npm publish
pnpm tsx scripts/restore-packages.ts                 # Restore workspace:*

詳細は references/workspace-protocol.md を参照してください。戦略の全容については references/version-strategy.md を参照してください。

トラブルシューティングの早見表

問題考えられる原因解決方法
Unsupported platformbin.js にプラットフォームが登録されていませんプラットフォームのキーとマッピングを追加します
プラットフォームのパッケージが npm で見つからないレジストリへの反映が遅れていますしばらく待ち、公開ログを確認します
公開済みパッケージに workspace:* が含まれているprepare-publish が実行されませんでしたprepare-publish.ts を実行します
バイナリに実行権限がないpostinstall が実行されませんでしたバイナリに chmod +x を実行します
バージョンが一致しない同期を忘れていますsync-versions.ts を実行します

詳しい診断については、references/troubleshooting.md を参照してください。

テンプレート

ディレクトリ内容
templates/scripts/公開パイプラインの全 11 スクリプト
templates/wrapper/bin.js とメインパッケージの package.json
examples/利用側プロジェクトの実際の publish.config.ts

セットアップと有効化

npx skills add -g onsager-ai/dev-skills --skill rust-npm-publish -a claude-code -y

次の場合に自動で有効になります:publish.config.ts が存在する、*publish* または *platform* に一致するスクリプトが存在する、ユーザーが「publish」「platform packages」「version sync」に言及する。

コメント