野声

Hey, 野声!

谁有天大力气可以拎着自己飞呀
twitter
github

WindowsでNodeRTをインストールする際の問題点

最近、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#

手動でインストールする場合:

  1. Visual C++ Build 環境をインストールする:Visual Studio Build Tools(コンポーネントのインストール時に "Visual C++ build tools" を選択)またはVisual Studio 2017 Community(コンポーネントのインストール時に "Desktop development with C++" を選択)
  2. コマンドプロンプトを開き、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 というコンパイル済みのプログラムを使用し、このネイティブプログラムを呼び出して通知を表示します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。