Azure-sdk-for-js: Installation fails on Node.js 14 due to obsolete "keytar" dependency

Created on 2 Feb 2021  路  6Comments  路  Source: Azure/azure-sdk-for-js

  • Package Name: @azure/identity
  • Package Version: 1.2.2
  • Operating system: Windows
  • [x] nodejs

    • version: 14.15.3

Describe the bug

The @azure/identity has this problematic dependency:

https://github.com/Azure/azure-sdk-for-js/blob/14ed4e758d5baef263a0bda1b0549cad12f9c647/sdk/identity/identity/package.json#L97-L99

To Reproduce

We originally encountered this with the Rush tool, because it recently picked up a dependency on @azure/identity. The downstream bug is here: https://github.com/microsoft/rushstack/issues/2467

Steps to reproduce the behavior:

  1. Start with a Windows machine that does not have Python or a C++ compiler.
  2. Use nvm-windows to select Node.js 14.15.3 (the current LTS release):

    C:\> nvm install 14.15.3
    C:\> nvm use 14.15.3
    
  3. Now try to install Rush:

    C:\> npm install --global @microsoft/rush
    

    Expected result: It should install without problems.

    Actual result: The installation fails:

> [email protected] install C:\Program 
Files\nodejs\node_modules\@microsoft\rush\node_modules\keytar > prebuild-install 
|| node-gyp rebuild

prebuild-install WARN install No prebuilt binaries found (target=14.15.3 
runtime=node arch=x64 libc= platform=win32)

C:\Program Files\nodejs\node_modules\@microsoft\rush\node_modules\keytar>if not 
defined npm_config_node_gyp (node 
"C:\Users\Owner\AppData\Roaming\nvm\v14.15.3\node_modules\npm\node_modules\npm-
lifecycle\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild )  
else (node 
"C:\Users\Owner\AppData\Roaming\nvm\v14.15.3\node_modules\npm\node_modules\node-
gyp\bin\node-gyp.js" rebuild ) gyp ERR! find Python gyp ERR! find Python Python 
is not set from command line or npm configuration gyp ERR! find Python Python is 
not set from environment variable PYTHON gyp ERR! find Python checking if 
"python" can be used gyp ERR! find Python - "python" is not in PATH or produced 
an error gyp ERR! find Python checking if "python2" can be used gyp ERR! find 
Python - "python2" is not in PATH or produced an error gyp ERR! find Python 
checking if "python3" can be used gyp ERR! find Python - "python3" is not in 
PATH or produced an error gyp ERR! find Python checking if the py launcher can 
be used to find Python 2 gyp ERR! find Python - "py.exe" is not in PATH or 
produced an error gyp ERR! find Python checking if Python is 
C:\Python27\python.exe gyp ERR! find Python - "C:\Python27\python.exe" could not 
be run gyp ERR! find Python checking if Python is C:\Python37\python.exe gyp 
ERR! find Python - "C:\Python37\python.exe" could not be run gyp ERR! find 
Python gyp ERR! find Python 
********************************************************** gyp ERR! find Python 
You need to install the latest version of Python. gyp ERR! find Python Node-gyp 
should be able to find and use Python. If not, gyp ERR! find Python you can try 
one of the following options: gyp ERR! find Python - Use the switch 
--python="C:\Path\To\python.exe" gyp ERR! find Python   (accepted by both 
node-gyp and npm) gyp ERR! find Python - Set the environment variable PYTHON gyp 
ERR! find Python - Set the npm configuration variable python: gyp ERR! find 
Python   npm config set python "C:\Path\To\python.exe" gyp ERR! find Python For 
more information consult the documentation at: gyp ERR! find Python 
https://github.com/nodejs/node-gyp#installation gyp ERR! find Python 
********************************************************** gyp ERR! find Python 
gyp ERR! configure error gyp ERR! stack Error: Could not find any Python 
installation to use gyp ERR! stack     at PythonFinder.fail 
(C:\Users\Owner\AppData\Roaming\nvm\v14.15.3\node_modules\npm\node_modules\node-
gyp\lib\find-python.js:307:47) gyp ERR! stack     at PythonFinder.runChecks 
(C:\Users\Owner\AppData\Roaming\nvm\v14.15.3\node_modules\npm\node_modules\node-
gyp\lib\find-python.js:136:21) gyp ERR! stack     at PythonFinder.<anonymous> 
(C:\Users\Owner\AppData\Roaming\nvm\v14.15.3\node_modules\npm\node_modules\node-
gyp\lib\find-python.js:225:16) gyp ERR! stack     at 
PythonFinder.execFileCallback 
(C:\Users\Owner\AppData\Roaming\nvm\v14.15.3\node_modules\npm\node_modules\node-
gyp\lib\find-python.js:271:16) gyp ERR! stack     at exithandler 
(child_process.js:315:5) gyp ERR! stack     at ChildProcess.errorhandler 
(child_process.js:327:5) gyp ERR! stack     at ChildProcess.emit 
(events.js:315:20) gyp ERR! stack     at Process.ChildProcess._handle.onexit 
(internal/child_process.js:275:12) gyp ERR! stack     at onErrorNT 
(internal/child_process.js:465:16) gyp ERR! stack     at 
processTicksAndRejections (internal/process/task_queues.js:80:21) gyp ERR! 
System Windows_NT 10.0.18363 gyp ERR! command "C:\\Program 
Files\\nodejs\\node.exe" 
"C:\\Users\\Owner\\AppData\\Roaming\\nvm\\v14.15.3\\node_modules\\npm\\
node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" gyp ERR! cwd C:\Program 
Files\nodejs\node_modules\@microsoft\rush\node_modules\keytar gyp ERR! node -v 
v14.15.3 gyp ERR! node-gyp -v v5.1.0 gyp ERR! not ok npm WARN optional SKIPPING 
OPTIONAL DEPENDENCY: [email protected] 
(node_modules\@microsoft\rush\node_modules\keytar): npm WARN optional SKIPPING 
OPTIONAL DEPENDENCY: [email protected] install: `prebuild-install || node-gyp 
rebuild` npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Exit status 1

Note that even though @azure/identity marks this dependency as "optional", the operation still fails:

  • The NPM process exit code is nonzero, causing scripts to fail
  • The above "wall of text" unambiguously communicates to end users that something went wrong

Recommended fix

  • Upgrade keytar by replacing ^5.4.0 with ^7.3.0 which hopefully ships with Node 14.x-compatible binaries; OR
  • Ideally, eliminate keytar and replace it with a different library that is not encumbered by node-gyp binary dependencies
Azure.Identity Client bug customer-reported

All 6 comments

If keytar cannot be easily upgraded or replaced, a third possibility would be to ask the keytar maintainers to publish Node 14 binaries for the 5.6.0 version series.

@octogonz - thank you for the report. Can you confirm that the build fails at this point? The keytar dependency should be optional, and I've seen it report warnings like that but the build still completed successfully.

NPM returns a nonzero exit code which the build scripts interpret as an error.

Also, the log shows ERR! like 30+ times. I wouldn't consider that a "warning". :-)

node-gyp is a complex development tool meant for package maintainers to use to make prebuilt binaries. It is invoked via "postinstall" only as a last resort when the package maintainers have neglected to provide a binary. In this case maybe because it is an obsolete version of keytar that is not being maintained.

When will PR #13564 be published?

@octogonz - it should be available now as part of the @azure/identity 1.2.3 release.

Thanks!

Was this page helpful?
0 / 5 - 0 ratings