electron v7 以降は Raspberry Pi にデフォルトでインストールできない
Raspberry Pi で electron をインストールしようとすると以下のように落ちてしまいました。
> electron@7.1.2 postinstall /home/pi/test/node_modules/electron > node install.js (node:5861) UnhandledPromiseRejectionWarning: HTTPError: Response code 404 (Not Found) at EventEmitter.<anonymous> (/home/pi/test/node_modules/got/source/as-stream.js:35:24) at EventEmitter.emit (events.js:210:5) at module.exports (/home/pi/test/node_modules/got/source/get-response.js:22:10) at ClientRequest.handleResponse (/home/pi/test/node_modules/got/source/request-as-event-emitter.js:155:5) at Object.onceWrapper (events.js:300:26) at ClientRequest.emit (events.js:215:7) at ClientRequest.origin.emit (/home/pi/test/node_modules/@szmarczak/http-timer/source/index.js:37:11) at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:583:27) at HTTPParser.parserOnHeadersComplete (_http_common.js:115:17) at TLSSocket.socketOnData (_http_client.js:456:22) (node:5861) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:5861) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. npm WARN saveError ENOENT: no such file or directory, open '/home/pi/test/package.json' npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN enoent ENOENT: no such file or directory, open '/home/pi/test/package.json' npm WARN test No description npm WARN test No repository field. npm WARN test No README data npm WARN test No license field. + electron@7.1.2 added 87 packages from 91 contributors and audited 104 packages in 22.813s found 0 vulnerabilities
対策
先に対処方法を書いておくと、以下のように --arch=armv7l
を指定してインストールすれば大丈夫。
$ npm install --arch=armv7l electron |
もしくは、~/.npmrc
に以下を追加しておけばOK。
1 | arch=armv7l |
参考
原因
install.js
の中でリリースファイルをダウンロードしているのですが、ここで process.arch
を使っています。この値は arm
になるので、
https://github.com/electron/electron/releases/download/v7.1.2/electron-v7.1.2-linux-arm.zip
というファイルをダウンロードしようとします。
しかし、アップロードされているファイルは electron-v7.1.2-linux-armv7l.zip
です。(arm
ではなく armv7l
)
electron 7.1.2
31 32 33 34 35 36 37 38 | downloadArtifact({ version, artifactName: 'electron' , force: process.env.force_no_cache === 'true' , cacheRoot: process.env.electron_config_cache, platform: process.env.npm_config_platform || process.platform, arch: process.env.npm_config_arch || process.arch }).then((zipPath) => extractFile(zipPath)). catch ((err) => onerror(err)) |
electron v6 ではどうだったかと言うと、以下のように process.arch
を使っていません。
electron 6.1.4
30 31 32 33 34 35 36 37 38 39 | // downloads if not cached download({ cache: process.env.electron_config_cache, version: version, platform: process.env.npm_config_platform, arch: process.env.npm_config_arch, strictSSL: process.env.npm_config_strict_ssl === 'true' , force: process.env.force_no_cache === 'true' , quiet: process.env.npm_config_loglevel === 'silent' || process.env.CI }, extractFile) |
process.env.npm_config_arch
が undefined
の場合、download()
の中で process.arch
を getNodeArch()
という関数で変換します。
以下のように、arm
は 適切なアーキテクチャに変換されるため、v6 までは正しく動いていたようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 | function getNodeArch(arch) { if (arch === 'arm' ) { switch (process.config.variables.arm_version) { case '6' : return uname(); case '7' : return 'armv7l' ; default : break ; } } return arch; } |
参考
0 件のコメント:
コメントを投稿