最近、electron を学んでいます。Windows 上での electron の組み込みの通知機能が少なく、ボタンなどを追加することができません。
調べてみると、既に NodeRT
をベースにした electron-windows-notifications が存在することがわかりました。これを使用すると、electron でネイティブの通知ボックスを表示することができます。NodeRT
は、Node.js で Windows Runtime API を使用できるようにします。
そして、yarn add electron-windows-notifications
を実行しましたが、エラーが発生しました:
[4/4] Building fresh packages...
[1/5] ⠈ @nodert-win10-au/windows.applicationmodel
[2/5] ⠁ @nodert-win10-au/windows.data.xml.dom
[3/5] ⠁ @nodert-win10-au/windows.foundation
[4/5] ⠁ @nodert-win10-au/windows.ui.notifications
error SECRETPATH\node_modules\@nodert-win10-au\windows.foundation: Command failed.
Exit code: 1
Command: node-gyp rebuild
Arguments:
Directory: SECRETPATH\node_modules\@nodert-win10-au\windows.foundation
Output:
...
[SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\build\binding.vcxproj]
_nodert_generated.cpp
NodeRtUtils.cpp
OpaqueWrapper.cpp
CollectionsConverterUtils.cpp
SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\nodertutils.cpp : fatal error C1107: 未能找到程序集“Windows.winmd”: 请使用 /AI 或通过设置 LIBPATH 环境变量指定程序集搜索路径 [SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\build\binding.vcxproj]
SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\_nodert_generated.cpp : fatal error C1107: 未能找到程序集“Windows.winmd”: 请使用 /AI 或通过设置 LIBPATH 环境变量指定程序集搜索路径 [SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\build\binding.vcxproj]
win_delay_load_hook.cc
NPMPATH\node_modules\node-gyp\src\win_delay_load_hook.cc : fatal error C1107: 未能找到程序集“Windows.winmd”: 请使用 /AI 或通过设置 LIBPATH 环境变量指定程序集搜索路径 [SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\build\binding.vcxproj]
SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\opaquewrapper.cpp : fatal error C1107: 未能找到程序集“Windows.winmd”: 请使用 /AI 或通过设置 LIBPATH 环境变量指定程序集搜索路径 [SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\build\binding.vcxproj]
SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\collectionsconverterutils.cpp : fatal error C1107: 未能找到程序集“Windows.winmd”: 请使用 /AI 或通过设置 LIBPATH 环境变量指定程序集搜索路径 [SECRETPATH\node_modules\@nodert-win10-au\windows.foundation\build\binding.vcxproj]
gyp ERR! build error
ああ、懐かしい msvc ツールチェーンのエラーですね。エラーの原因は fatal error C1107: 未能找到程序集 “Windows.winmd” で、LIBPATH を使用してこのファイルの場所を指定できるとのことです。
listary を使用して自分のマシンの Windows.winmd
の場所を調べ、最初のエラーの試みで LIBPATH を設定しましたが、エラーは解決しませんでした。
以前に VS を使用したとき、正しくコンパイルするためにプロジェクトで参照するライブラリの場所を設定する必要があったことを思い出しました。その間の手探りのプロセスは省略し、解決方法を直接書きます。
node-gyp の設定#
以前に node-sass
をインストールする際に node-gyp
に触れたので、まずは node-gyp
が使用できることを確認する必要があります。
node-gyp
のリポジトリの README を確認すると、次のチュートリアルがあります:Installation On Windows
まず、Python をインストールする必要があります。ローカルにインストールされていない場合は、最も簡単な方法は Microsoft Store から直接インストールすることです。Microsoft Store を開き、インストールを検索して実行します。
Python Microsoft Store package
node-gyp
は以下の Python バージョンをサポートしています:v2.7、v3.5、v3.6、v3.7、v3.8。
方法 1(個人的にはおすすめしませんが、制御できない状況になる可能性があります)#
windows-build-tools を使用して、自動的に MsBuild と Python の環境を設定します。
管理者権限を持つ CMD または PowerShell ターミナルを開き、npm install --global --production windows-build-tools
を実行し、完了するまで待ちます。
方法 2#
手動でインストールする場合:
- Visual C++ Build 環境をインストールする:Visual Studio Build Tools(コンポーネントのインストール時に "Visual C++ build tools" を選択)またはVisual Studio 2017 Community(コンポーネントのインストール時に "Desktop development with C++" を選択)
- コマンドプロンプトを開き、
npm config set msvs_version 2017
を実行します。
プログラムを他のプロセッサプラットフォームで実行する必要がある場合は、対応するコンポーネントも選択することを忘れないでください。たとえば、ARM64 プラットフォームの場合は、「Visual C++ compilers and libraries for ARM64」と「Visual C++ ATL for ARM64」の 2 つのコンポーネントを選択する必要があります。
node-gyp
環境が正常にインストールされたかどうかは、以下のパッケージのいずれかをインストールしてみればわかります。インストールに成功した場合、node-gyp
環境が整っていることになります:
- bson
- bufferutil
- kerberos
- node-sass
- sqlite3
- phantomjs
Windows.winmd
ファイルが見つからない問題の解決#
実際の問題はコードの問題であり、この issue の説明によると、現在のバージョンの NodeRT は、.winmd
ファイルをスキャンするために C:\Program Files (x86)\Windows Kits\10\UnionMetadata
パスのみをスキャンし、依存ライブラリのディレクトリがハードコードされているとのことです(しかし、これも理にかなっています)。
したがって、解決策は、Windows.winmd
ファイルをこのフォルダに移動するだけです。通常、デフォルトでインストールされている Windows 10 SDK は、このフォルダのサブフォルダにあります。対応するバージョンの Windows.winmd
を移動させるだけです。
たとえば、私は C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.19041.0\Windows.winmd
ファイルを上の階層に移動しました。つまり、..
フォルダに移動しました。これで再度インストールすると、問題なく動作します。
これ以降、Native のパッケージングに遭遇しても、もう心配いりません!
2020/08/24 追記
electron-windows-notifications
は本当にうまくいかないですね。シンプルなトーストは表示できますが、actions
を追加すると通知が表示されなくなります。
また、このライブラリはかなり古くなっており、依存している NodeRT
のバージョンも古いため、現在は node-notifier
を使用しています。このパッケージは Windows では SnoreToast
というコンパイル済みのプログラムを使用し、このネイティブプログラムを呼び出して通知を表示します。