Nuxt で作成したアプリケーションを WinSer でWindowsサービス化しようとしたらいろいろはまったので備忘録として対処を残しておく。
#背景
nodejs で作成したアプリケーションを Windows環境でサービス化するためのツールとして、 WinSer がある。
start コマンドとして「node index.js」のように node.exe を直接叩く場合は特に設定をする必要はないが、 NuxtJS のような専用の起動コマンドが存在するような場合に、npm や yarn からは起動できてもWindowsサービスとして起動できないということが発生する。
#対策
WinSer (で使用される nssm)は絶対パスか、パスが通ったコマンド出なければ実行できない(ように見える)。また「.cmd」拡張子のファイルは拡張子込みで記述する必要がある。
##1. WinSer をインストールする
npm に上がっている WinSer はバグっているので修正されたものを拾う。
yarn add winser "git+https://github.com/LiberisLabs/winser.git"
##2. パスを通す
yarn へのパスを通す。
以下がもしないなら、サービスを実行するユーザーの環境変数の Path に追加する。そのユーザーで yarn をグローバルインストールしてあることが前提。
C:\Users\<username>\AppData\Roaming\npm
Local System アカウントで実行するなら、システム環境変数に追加する。
##3. package.json に winser 要のタスクを追記する
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start",
"generate": "nuxt generate",
"install-service": "winser -i -a --startcmd \"yarn.cmd nuxt start\" --set \"ObjectName .\\appuser password\"",
"uninstall-service": "winser -r -x"
}
WinSer は標準では start をもとにサービスを作成するが、それでは動かないため --startcmd で start の代わりの実行コマンドを記述する。さらに、 --set で実行ユーザーとパスワードを指定する(Local System で実行するなら不要)。
やっていることは nuxt.cmd を叩いているだけだが、直接見つけられないため、yarn を叩くことで
nuxt.cmd を見つけている。
サービス化した場合、サービスの起動停止を自動化したくなる。UACを無効化したくなるが、その必要はなく、特定ユーザーにサービスに係る権限を与える方法はこの辺りを参照する。
2020/05/12追記
nodejs 14 にアップデートしたせいか? nssm から yarn を通して起動できないという状況が発生。npm からなら起動できる。
npm から起動するなら、そもそも --startwithnpm を指定すればよし。
node .\node_modules\winser\bin\winser -i --startwithnpm --set "ObjectName .\username password"