📝

sudoで実行したいnpmと開発で使いたいnpmを分ける

2023/08/29に公開

https://qiita.com/items/1fec537384cf86e38d66


お詫び

Qiitaの元記事にて、区切り線を「---」で書いている場所があり、これがZennの記法に干渉して一部うまく表示できない記事がある事を認識しています。
全ての記事を精査しきれていないため、お手数ですがお見かけの際は教えていただけると大変喜びます。


考え方の話なので、rubyでも同様にできます。
ここでは書いてませんが、github_changelog_generatorと開発のrubyを分けてます。

やりたいこと

  • github-changesを実行するnpmはsudoを使う
  • 開発中のnpmのバージョンは最新にしたい
  • WSLで完結させる

結論

  • sudo su -でrootになってからnpmをインストール
    • /root/.nodenvなどにインストールしても良いし、拘らなければapt install npmでも良い
  • 別途nodenv等を使って入れたnpmにパスを通す
  • sudo which npmwhich npmの結果が異なっている

注意

コマンドに直接npmと掛ける場合は、which npmの結果がsudoとそうでない場合でパスを分ければよい、つまりrootで使えるnpmのフルパスと、ユーザーや環境ごとに使いたいnpmのフルパスを明示的に書いて分けるべきです。
なので、シンプルにnpm install パッケージとするなら$(sudo which npm) install$(which npm) installで書くべきです。[1]

今回の要件はgithub-changes内で使われているnpmを指定したいのと、開発で使っているnpmのバージョンを分ける必要があったので、運用中のsudo npm`専用のコンテナや開発のための専用コンテナなりを用意するのがベストですが、個人開発なのでわがままセットな環境を作りたかったのでこういうやり方をしてます。

前提

いつもどおり、WSLを使ってます。
開発で使うnodeと運用で使うnodeを分ける必要があったのですが、

  • 運用で使用するnodeにsudo権限が必要なパッケージがあった
  • 開発で使うためのnodeのバージョンは管理しておきたい

という要件を満たす必要があったので、これを解決する方法を探していました。

やり方

結論にも書いてます。nodenvをrootでインストールとuserでインストールの-2回分でやればいいです。
ただし、インストールする場所は当然変える必要があります。

nodenvはそれぞれの~/.nodenvに作成されるので、
ちょっと検証してみたんですが、anyenv自体のバージョンを分ける必要はないので**/opt**に置いて検証したところ共通のanyenvでそれぞれのnodenvが作られるので、anyenvを分ける必要はなさそうです。[2]

コマンド例

思いついたらちょこちょこ直しているので、Githubを貼り付けておきます

https://github.com/shimajima-eiji/Settings_Environment/blob/main/for_clean_install/WSL_setup.sh

注釈

脚注
  1. $(sudo which npm)$(which npm)】説明のために端折ってますが、正しくフルパスで書きます ↩︎

  2. 【anyenvを分ける必要はない】よく考えれば、linuxbrewを入れた時は**/home/linuxbrew**に作られ、ユーザー問わずlinuxbrew以下を参照するので、共通のanyenvを使っている事になりますね。 ↩︎

GitHubで編集を提案

Discussion