はじめに
今回の記事の目的
npm install
をいつもどおり実行したところ下記のエラーが出た。
解決するまでに実施したことを紹介する。
同じエラーが起きた人の参考になれば幸いです。
発生事象
APIで値を取得するHTTP クライアントaxios
をインストールしたくて、npm install axios
を実行したところエラーとなった。
実行コマンド:
$ npm install axios
The operation was rejected by your operating system.
「あなたのOSから拒否されました」と言われてしまった。
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
解決策
最終的に実施しうまくいったのは
node_modules
とyarn.lock
の削除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ファイル](https://zenn.dev/nekoniki/articles/ec5bb4d16ef20a)
ロックファイルとして、yarnを利用する場合はyarn.lock
を、npmを利用する場合はpackage-lock.json
をlockファイルとして利用する。
npm installとyarn addの両方を使っていると、どちらか片方を使った方がよいといった旨の警告が出ます。 なぜかというとnpmはpackage-lock.jsonを、yarnはyarn.lockを参照するため、人によっては異なったバージョンがインストールされる可能性があるからです。
参考: 【npm,yarn】今さら聞けないlockファイル
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
オプションを追加したこと。
追記:権限不足の可能性もあり
※2022/4/7追記
移行前のブログにて、以下のコメントをいただきました。
今更ではあるので原因見つかったかと思いますが… Permittedされてないということなので権限不足っぽいですね。 同様のエラーが出てた時はroot権限で実行すると出来ました。
私はroot権限で試しても解決しなかった記憶がありますが、人によっては権限が原因の可能性もあると思うので、試してみてください。
おわりに
根本原因は不明な点も多いが、今後はnpm
を使っているのかyarn
を使っているのか意識することにする。
参考記事
package-lock.jsonについて調べたので別記事にまとめました。