エンジニアを目指す日常ブログ

日々勉強したことのメモ。間違っていたらコメント等で教えてください。

npm installでのパッケージインストールが上手くいかないときにやったことメモ

はじめに

今回の記事の目的

APIで値を取得するHTTP クライアントaxiosをインストールしたくて、npm install axiosを実行したところエラーとなった。解決した方法のメモ。

発生事象

npm install axiosを実行するとこんなエラー。

npm WARN deprecated @hapi/bourne@1.3.2: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/hoek@8.5.1: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/address@2.1.4: Moved to 'npm install @sideway/address'
npm WARN deprecated @hapi/topo@3.1.6: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated sane@4.1.0: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated core-js@2.6.12: core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.
npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN deprecated @types/anymatch@3.0.0: This is a stub types definition. anymatch provides its own type definitions, so you do not need this installed.
npm WARN deprecated flatten@1.0.3: flatten is deprecated in favor of utility frameworks such as lodash.
npm WARN deprecated babel-eslint@10.1.0: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.
npm WARN deprecated querystring@0.2.1: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated chokidar@2.1.8: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN deprecated rollup-plugin-babel@4.4.0: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.
npm WARN deprecated @hapi/joi@15.1.1: Switch to 'npm install joi'
npm WARN rm not removing /app/node_modules/.bin/jest as it wasn't installed by /app/node_modules/jest
npm WARN rm not removing /app/node_modules/.bin/rimraf as it wasn't installed by /app/node_modules/rimraf
npm WARN rm not removing /app/node_modules/.bin/uuid as it wasn't installed by /app/node_modules/uuid
npm WARN rm not removing /app/node_modules/.bin/semver as it wasn't installed by /app/node_modules/semver
npm WARN rm not removing /app/node_modules/.bin/mkdirp as it wasn't installed by /app/node_modules/mkdirp
npm WARN rm not removing /app/node_modules/.bin/json5 as it wasn't installed by /app/node_modules/json5
npm WARN rollback Rolling back param-case@3.0.4 failed (this is probably harmless): ETXTBSY: text file is busy, rmdir '/app/node_modules/param-case/node_modules'
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^2.1.2 (node_modules/jest-haste-map/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^2.1.2 (node_modules/jest-haste-map/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^2.1.3 (node_modules/react-scripts/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/watchpack-chokidar2/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/webpack-dev-server/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.15.4 requires a peer of @babel/core@^7.13.0 but none is installed. You must install peer dependencies yourself.

npm ERR! code EPERM
npm ERR! syscall rename
npm ERR! path /app/node_modules/param-case
npm ERR! dest /app/node_modules/.param-case.DELETE
npm ERR! errno -1
npm ERR! Error: EPERM: operation not permitted, rename '/app/node_modules/param-case' -> '/app/node_modules/.param-case.DELETE'
npm ERR!  [OperationalError: EPERM: operation not permitted, rename '/app/node_modules/param-case' -> '/app/node_modules/.param-case.DELETE'] {
npm ERR!   cause: [Error: EPERM: operation not permitted, rename '/app/node_modules/param-case' -> '/app/node_modules/.param-case.DELETE'] {
npm ERR!     errno: -1,
npm ERR!     code: 'EPERM',
npm ERR!     syscall: 'rename',
npm ERR!     path: '/app/node_modules/param-case',
npm ERR!     dest: '/app/node_modules/.param-case.DELETE'
npm ERR!   },
npm ERR!   errno: -1,
npm ERR!   code: 'EPERM',
npm ERR!   syscall: 'rename',
npm ERR!   path: '/app/node_modules/param-case',
npm ERR!   dest: '/app/node_modules/.param-case.DELETE',
npm ERR!   parent: 'app'
npm ERR! }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/node/.npm/_logs/2021-09-27T08_36_43_225Z-debug.log

The operation was rejected by your operating system.と言っているが何故。

解決策

いろいろと試したがうまくいかず、最終的に実施したのは

  • node_modulesの削除
  • npmではなくyarnでインストールする

の2点。

node_modulesの削除

node_modulesフォルダを削除。

$ rm -rf node_modules/

yarn.lockの削除

yarn.lockファイルも削除。

$ rm yarn.lock

yarn.lockとは

そもそもyarnとは、npmの後継となるパッケージマネージャ。
create-react-appのコマンドは、yarnがインストールされている場合はでnpmではなくyarnを利用するとのこと。

yarn.lockファイルは、パッケージのバージョンを管理するためのlockファイル。

lockファイルは 「依存関係まで含めて、実際にどのバージョンがインストールされているか」 を管理します。 それぞれのライブラリのversionの項目がそれにあたります。 パッケージマネージャーは基本的に、lockファイルがあればそちらの記載に従うので、lockファイルを共有することで 「誰がインストールしても同じバージョンがインストールされる」 ことを担保することができます。 【npm,yarn】今さら聞けないlockファイル

yarnを利用する場合はyarn.lockを、npmを利用する場合はpackage-lock.jsonをlockファイルとして利用する。

npm installとyarn addの両方を使っていると、どちらか片方を使った方がよいといった旨の警告が出ます。 なぜかというとnpmはpackage-lock.jsonを、yarnはyarn.lockを参照するため、人によっては異なったバージョンがインストールされる可能性があるからです。【npm,yarn】今さら聞けないlockファイル

今後はパッケージのインストールの際はyarnを使ったほうが良いのかもしれない。

nodeの再インストール

yarnを使ってnodeを再インストールした。

$ yarn install

axiosのインストール

yarnを利用してインストール。

$ yarn add axios

axiosをインストールできた。

考察

過去のプロジェクトフォルダを確認すると、yarn.lockファイルではなくpackage-lock.jsonが配置されていた。 今のプロジェクトだけはyarn.lockが配置されていたので、yarnでインストールが必要だったと思われる。

過去のプロジェクトの違いで思い当たるのは、過去プロジェクトでは create-react-appコマンドでプロジェクトを作成していたが、今のプロジェクトはTypeScriptを利用するため--template typescriptオプションを追加したこと。

おわりに

根本原因は不明な点も多いが、今後はnpmを使っているのかyarnを使っているのか意識することにする。