EPGStation icon indicating copy to clipboard operation
EPGStation copied to clipboard

Windows環境 + Node.js 16 でインストールに失敗する

Open daig0rian opened this issue 2 years ago • 3 comments

連投申し訳ありません。 表題のとおりWindows + Node.js 16で直近のEPGStationのバージョンでWindows環境へのインストールがうまくいかなくなっているようでしたので報告させていただきます。

環境

  • Version of EPGStation:v.2.6.15, v.2.6.11
  • Version of Mirakurun: 3.9.0-beta.21
  • Version of Node: 16.13.0
  • Version of NPM: 8.1.0
  • OS: win32 (Windows 10 Pro / Vesion 21H1 / Builed 19043.1348)
  • Architecture: x64

Issue

Node.js 16 では、Windows 用 セットアップマニュアル の手順でインストールを試みても成功しないようです。 具体的には npm run all-install 実行中に以下のようにMirakurunがwinserにサービスを登録しにいってしまいインストールが失敗します。

> git clone https://github.com/l3tnun/EPGStation.git
> cd EPGStation
> npm run all-install
npm ERR! code 1
npm ERR! path C:\Users\daigorian\EPGStation\node_modules\mirakurun
npm ERR! command failed
npm ERR! command C:\WINDOWS\system32\cmd.exe /d /s /c node bin/postinstall.js
npm ERR! Version: [email protected] [OK]
npm ERR! Version: [email protected] [OK]
npm ERR! No rights to manage services.
npm ERR! node:child_process:867
npm ERR!     throw err;
npm ERR!     ^
npm ERR!
npm ERR! Error: Command failed: winser.cmd -i -a --startuptype auto --startcmd node.exe bin\init.win32.js --set AppPriority ABOVE_NORMAL_PRIORITY_CLASS --set Type SERVICE_WIN32_OWN_PROCESS --set AppStdout C:\Users\daigorian\AppData\Local\Mirakurun\stdout --set AppStderr C:\Users\daigorian\AppData\Local\Mirakurun\stderr --env USERPROFILE=C:\Users\daigorian --env LOCALAPPDATA=C:\Users\daigorian\AppData\Local --env USING_WINSER=1
npm ERR!     at checkExecSyncError (node:child_process:826:11)
npm ERR!     at Object.execFileSync (node:child_process:864:15)
npm ERR!     at Object.<anonymous> (C:\Users\daigorian\EPGStation\node_modules\mirakurun\bin\postinstall.js:113:19)
npm ERR!     at Module._compile (node:internal/modules/cjs/loader:1101:14)
npm ERR!     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
npm ERR!     at Module.load (node:internal/modules/cjs/loader:981:32)
npm ERR!     at Function.Module._load (node:internal/modules/cjs/loader:822:12)
npm ERR!     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
npm ERR!     at node:internal/main/run_main_module:17:47 {
npm ERR!   status: 1,
npm ERR!   signal: null,
npm ERR!   output: [ null, null, null ],
npm ERR!   pid: 2484,
npm ERR!   stdout: null,
npm ERR!   stderr: null
npm ERR! }

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\daigorian\AppData\Local\npm-cache\_logs\2021-11-18T14_52_56_342Z-debug.log

2021-11-18T14_52_56_342Z-debug.log

EPGStation v.2.6.11でも試みてみましたが同様のエラーとなりました。 [email protected][email protected][email protected]

こちらはワークアラウンド手順を見つけることができませんでした。。

よろしくお願いいたします。

daig0rian avatar Nov 18 '21 18:11 daig0rian

調べてみましたが、これは epgstation の問題ではなく、Mirakurun をクライアントとしてインストールする際に発生する問題のようです。

windows + node v16.13.0 + npm v8.1.0 の環境にて以下のように確認できます。

mkdir example
cd example
npm init 
npm install --save mirakurun

詳しく調査していませんが、おそらく下記部分が install 時にうまく動作せず、`winser`でサービスの登録を行おうとしているのだと思います。

動いていないであろう部分↓ https://github.com/Chinachu/Mirakurun/blob/9952d7c0bfb64c9a519e27b81ee131a6aeb0137d/bin/postinstall.js#L18-L20

↑が動かないので実行されてしまっている処理 https://github.com/Chinachu/Mirakurun/blob/9952d7c0bfb64c9a519e27b81ee131a6aeb0137d/bin/postinstall.js#L93-L134

そのため、Mirakurun側で修正が必要かと思います。

l3tnun avatar Nov 21 '21 07:11 l3tnun

@l3tnun @daig0rian 私もこの状態に遭遇してしまったので、調査結果と回避策を記しておきます。 環境は Windows 10 Pro + Node.js 14.18.2 + npm 7.24.2 です。

この事象は Node.js 16 の問題ではなく、もとを正せばおそらく npm 側の仕様変更が原因だと思われます。 具体的には、以前までは npm のパッケージをインストールする際にグローバルインストールかどうかに関わらず npm_config_global という環境変数が一時的に定義されていたようなのですが、少なくともローカルインストールの場合はこの環境変数が定義されなくなってしまいました。グローバルインストールの際に npm_config_global が定義されているのかは確認できていません。

そして、Mirakurun の postinstall.js では Docker からインストールするケースなども勘案してか、npm_config_global が定義されていない場合は後続の処理を実行するようになっています。 以前はローカルインストールの場合は npm_config_globalfalse に設定されていたためここで処理を終了できていましたが、npm_config_global 自体が定義されなくなってしまったため、ローカルインストールにも関わらず後続の処理を実行してしまいます。 さらに Mirakurun を Windows サービス化する際に使われている winser は、同じ名前のサービスを重複して作成しようとすると上書きされずにエラーになってしまうようです。winser のコマンドが失敗すると mirakurun のインストール全体が失敗した事になってしまうため、ドミノ倒し的にすべてのパッケージの npm install がうまくいかなくなる、というのが一連の流れです。

npm 側の仕様変更という説が正しければ、Linux でも一定バージョン以上の npm を使っている場合は postinstall.js が実行されてしまうはずです。ただ、pm2 のインストール処理は重複した場合でも実行できてしまうのかもしれませんし、たまたま顕在化していないだけな気もします。

回避策ですが、npm_config_global の環境変数が定義されていないのなら、自前で定義してしまえばいいわけです。 npm all-install を実行する前に PowerShell 上で $env:npm_config_global = 'false' と実行しておけば、Mirakurun も含めたすべてのパッケージのインストールが正常に完了します。 実際にこの回避策を試してみましたが、途中でエラーになる事なく EPGStation v2.6.20 にアップグレードすることができました。

tsukumijima avatar Jan 19 '22 22:01 tsukumijima

私も EpgStation を試してみたいと考えていましたが、この状態に陥ってしまったので調査してみました。 Win11 + Node.js 16.13.2 + npm 8.4.0 の環境です。

大筋としては今までの流れのものですが、 npm_config_global の件については npm 7 での仕様変更 が原因のようです。 上記の Issue にて Mirakurun さん側で対応をして頂きました。

EPGStation 側への副作用の確認・テストは完全に行っていませんが、 npm i [email protected] (あるいはこれ以降のバージョンなど) で Mirakurun を最新にして頂ければこの Issue も解決出来る状態になったと思います。

yuta2k avatar Feb 04 '22 16:02 yuta2k

v2.7.0にて Mirakurun の更新行いますが、同時に Windows のサポートも切りますので、この issue もクローズします。

l3tnun avatar Jul 29 '23 07:07 l3tnun