メインコンテンツへ移動
AIチュートリアル

Node.js不要でDeepSeek HarnessをWindows単一ファイルインストーラーにパッケージ化する

このチュートリアルでは、DeepSeek Harness Easy-Setupを使用してdshとポータブル版Node.jsをWindows単一ファイルインストーラーにパッケージ化し、インストール、起動、テスト、ログのトラブルシューティング、バージョン設定を行う方法を説明します。

Node.js不要でDeepSeek HarnessをWindows単一ファイルインストーラーに

プロジェクト概要

DeepSeek Harness Easy-Setupは、Windows向けのパッケージ化プロジェクトです。@deepseek-ai/dshコマンドラインプログラム、ポータブル版Node.jsランタイム、ランチャー、終了ツールを1つのインストーラーに統合します。

エンドユーザーは、Node.js、npm、その他の依存関係を事前にインストールする必要がありません。インストール後は、デスクトップまたはスタートメニューのショートカットからdsh webを起動でき、サービスの準備が完了するとブラウザーが自動的に開きます。

インストール後の機能

  • デスクトップとスタートメニューに、それぞれ「DeepSeek Harness」ショートカットを作成します。
  • 実行中のサービスを終了する「DeepSeek Harnessを終了」ショートカットを作成します。
  • ランチャーはdsh webを実行し、サービスの起動後にブラウザーを自動的に開きます。
  • スタートメニューにアンインストール項目を追加し、Windowsの「アプリ」一覧にも表示されます。
  • dshフロントエンドに付属するクジラのfaviconをアプリアイコンとして使用します。
  • 現在のユーザー向けにインストールするため、UACによる昇格は発生しません。

デフォルトのインストール先は次のとおりです。

%LOCALAPPDATA%\Programs\DeepSeekHarness

インストールウィザードで別のディレクトリを選択することもできます。

プロジェクトディレクトリを理解する

ビルドを開始する前に、主要なディレクトリの用途を確認しておくと便利です。

  • build\build.ps1:dshの取得、ポータブル版Node.jsのダウンロード、アイコンの生成、ランチャーと終了ツールのコンパイル、インストーラーの作成を担当するビルドのエントリーポイントです。
  • build\fetch-nsis.ps1:ポータブル版NSIS 3.11をダウンロードし、SourceForgeミラーが利用できない場合は別のミラーを試します。
  • src\Launcher.cs:ランチャーのソースコードです。コンパイル後にDeepSeekHarness.exeが生成されます。
  • src\Stopper.cs:終了ツールのソースコードです。コンパイル後にDeepSeekHarnessStop.exeが生成されます。
  • src\installer.nsi:NSISインストールスクリプトです。
  • src\icon\build-icon.js:dshに付属するsharpを使用して、クジラのSVGを複数サイズのICOに変換します。
  • test\test-install.ps1:サイレントインストール、ファイル確認、起動、停止、HTTP確認、アンインストールのテストを実行します。
  • work\:Node.jsアーカイブ、NSIS、ステージングなどの中間ファイルを保存します。削除しても構いませんが、保持すると次回以降のビルドを高速化できます。
  • out\:最終的な単一ファイルインストーラーを保存します。

ビルド環境を準備する

ビルドマシンは次の条件を満たす必要があります。

  • Windows 10またはWindows 11 x64。
  • PowerShell 5.1。
  • .NET Framework 4.x。
  • Node.jsがインストールされ、node.exeをPATHから検出できること。または、ビルド時にパスを明示的に指定できること。
  • nodejs.orgとSourceForgeにアクセスできること。

プロジェクトでは、システム付属のC#コンパイラーを使用して2つの実行ファイルをコンパイルします。デフォルトのパスは次のとおりです。

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe

システムにNSIS 3.xがインストールされていない場合、ビルドスクリプトはポータブル版をwork\nsisに自動ダウンロードします。

重要:プロジェクトのパスには空白を含めないでください。makensisのコマンドライン定義パラメーターは、空白を含むパスを正しく処理できません。

手順1:dshをインストールする

ビルドスクリプトは、デフォルトでグローバルnpmディレクトリから@deepseek-ai/dshを読み込みます。まず、ビルドマシンで次を実行します。

npm i -g @deepseek-ai/dsh

デフォルトのパッケージディレクトリは次のとおりです。

%APPDATA%\npm\node_modules\@deepseek-ai\dsh

dshが別の場所にある場合は、後で-DshSourceパラメーターを使用して指定できます。

手順2:単一ファイルインストーラーをビルドする

プロジェクトのルートディレクトリに移動し、次を実行します。

powershell -ExecutionPolicy Bypass -File build\build.ps1

スクリプトは、dshファイル、ポータブル版Node.js、アプリアイコン、C#ランチャー、終了ツール、NSISインストーラーを順に準備します。デフォルトの生成物は次のようになります。

out\DeepSeekHarness-Setup-0.1.1.exe

READMEに記載されているサンプルインストーラーのサイズは約44 MBです。

よく使うビルドパラメーター

  • -DshSource <ディレクトリ>:dshパッケージのディレクトリを指定します。
  • -NodeExe <パス>:ビルドマシン上のnode.exeを指定します。
  • -AppVersion <バージョン>:インストーラーのバージョン番号を上書きします。
  • -WorkDir <ディレクトリ>:中間ファイルのディレクトリを変更します。
  • -OutDir <ディレクトリ>:インストーラーの出力先を変更します。

カスタムのdshパス、Node.jsパス、バージョン番号を使用する例:

powershell -ExecutionPolicy Bypass -File build\build.ps1 -DshSource C:\dev\dsh -NodeExe C:\nodejs\node.exe -AppVersion 0.1.1 -OutDir C:\dsh-output

デフォルトでは、バージョン番号はdshのpackage.jsonから取得されます。プレリリース版はベースバージョンに変換されます。たとえば、0.1.1-rc.2は0.1.1として生成されます。

work\内のファイルは保持され、再利用されます。Node.jsアーカイブのダウンロード完了後は再ダウンロードされず、展開済みのNSISディレクトリも引き続き使用されます。

手順3:インストールと基本操作

ビルドが完了したら、out\ディレクトリ内のインストーラーをダブルクリックし、ウィザードに従ってインストールします。現在のユーザー向けのインストール方式を採用しているため、通常はUACによる昇格プロンプトは表示されません。

  1. デスクトップまたはスタートメニューの「DeepSeek Harness」をダブルクリックします。
  2. ランチャーがdsh webを実行します。
  3. サービスが利用可能になると、デフォルトのブラウザーが対応するページを自動的に開きます。
  4. サービスを停止するには、「DeepSeek Harnessを終了」を実行します。
  5. プログラムを削除するには、スタートメニューのアンインストール項目またはWindowsの「アプリ」一覧からアンインストールします。

デフォルトのディレクトリへサイレントインストールすることもできます。

out\DeepSeekHarness-Setup-0.1.1.exe /S

手順4:自動テストを実行する

プロジェクトには、インストール全体をカバーするテストスクリプトが用意されています。

powershell -ExecutionPolicy Bypass -File test\test-install.ps1

テストスクリプトは次の処理を実行します。

  1. プロジェクト配下のtestinstall\にサイレントインストールします。
  2. インストールファイルとショートカットを項目ごとに確認します。
  3. モックのエントリーポイントを使用して、ランチャーと終了ツールの動作を検証します。
  4. インストールディレクトリ内のポータブル版Node.jsを使用して、dsh webを実際に1回起動します。
  5. デフォルトのテストポート3999でHTTP 200レスポンスを確認し、一般的な3080ポートの使用を避けます。
  6. アンインストールを実行して結果を確認します。

出力には、###で始まる確認メッセージが複数表示されます。最後の行は次のようになるはずです。

ALL CHECKS PASSED

テストに失敗した場合は、最後に失敗項目の数が表示されます。

注意:テストで作成されるショートカット名は正式なインストール時と完全に同じです。そのため、テストの実行中は現在のユーザーのデスクトップとスタートメニューのショートカットが一時的にtestinstall\を指し、アンインストール時に削除されます。テスト完了後に正式なインストールを復元するには、インストーラーのサイレントインストールコマンドを再度実行してください。

実行ログとトラブルシューティング

実行中の重要な状態ファイルは次の場所に保存されます。

%LOCALAPPDATA%\DeepSeekHarness\pid.txt
%LOCALAPPDATA%\DeepSeekHarness\run.log
  • pid.txtには実行中のdshプロセスIDが保存され、終了ツールはこれを使用して対象プロセスを特定します。
  • run.logにはdshの標準出力と標準エラーが保存されます。

起動に失敗すると、ランチャーはポップアップでrun.logの場所を通知します。トラブルシューティングでは、まずこのログを確認し、ポートの使用状況、依存関係の読み込み、サービス起動エラーを確認してください。

高度なヒントと実装上の注意点

Node.jsのバージョンとネイティブモジュールを一致させる

dshの依存関係には、node-pty、sharp、koffiなどのネイティブモジュールが含まれています。ポータブル版Node.jsはこれらのモジュールと互換性がなければなりません。そのため、ビルドスクリプトはデフォルトでビルドマシンと同じNode.jsバージョンを選択します。-NodeExeを変更する場合は、インストーラーが正常に起動できることを改めて確認してください。

サービスの二重起動を防ぐ

デフォルトの3080ポートでdshがすでに実行されている場合、ランチャーを再度ダブルクリックしても2つ目のインスタンスは作成されません。ランチャーはpidファイルのプロセスがまだ生存しているかを確認し、既存のサービスページを直接開きます。

ランチャーを早期終了させない

ランチャーはdshを起動した後もホストプロセスとしてバックグラウンドに残り、dshが終了するまで標準出力と標準エラーをrun.logに継続して書き込みます。ランチャーがすぐに終了すると出力パイプが切断され、dshが後からログを書き込む際にEPIPEが発生する可能性があります。

NSISのアンインストール完了を正しく待機する

NSISアンインストーラーは、まず自身を%TEMP%にコピーしてから一時ディレクトリで処理を続行し、元のアンインストールプロセスはすぐに終了します。そのため、自動化スクリプトでは元のプロセスの終了だけを待つことはできません。インストールディレクトリが消えるまでポーリングする必要があります。プロジェクトのtest-install.ps1には、その実装がすでに用意されています。

インストールスクリプトのエンコーディングに注意する

installer.nsiはUTF-8 BOMまたはUTF-16LEで保存する必要があります。そうしないとNSISがBad text encodingを報告します。リポジトリ内のソースファイルはBOMなしのUTF-8であり、build.ps1がmakensisの呼び出し前にUTF-16LEへ変換します。

インストーラーのサイズを抑える

パッケージ化の過程で、Windows x64環境では読み込まれないファイルが削除されます。これにはnode-ptyのDarwin、Linux、ARM64向けプリコンパイルファイルと、sharpのWASM版が含まれます。READMEによると、この処理で約30 MB節約できます。

ライセンス

dsh本体はMITライセンスで提供されており、詳細はdshパッケージ内のLICENSEで確認できます。本プロジェクトのインストーラースクリプトもMITライセンスで公開されています。クジラのアイコンはdshのフロントエンドリソースに由来し、著作権はDeepSeekに帰属します。

まとめ

DeepSeek Harness Easy-Setupは、dsh、ポータブル版Node.js、Windows用の起動・停止プログラム、NSISインストール処理を統合します。環境を準備した後、dshをグローバルにインストールしてbuild\build.ps1を実行するだけで、対象マシンにNode.jsを事前インストールする必要のない単一ファイルインストーラーを生成できます。公開前には、完全なテストスクリプトを実行し、ログ、Node.jsのバージョン互換性、ショートカットの復元状況を重点的に確認することをおすすめします。