sudoで実行したいnpmと開発で使いたいnpmを分ける
お詫び
Qiitaの元記事にて、区切り線を「---」で書いている場所があり、これがZennの記法に干渉して一部うまく表示できない記事がある事を認識しています。
全ての記事を精査しきれていないため、お手数ですがお見かけの際は教えていただけると大変喜びます。
考え方の話なので、rubyでも同様にできます。
ここでは書いてませんが、github_changelog_generatorと開発のrubyを分けてます。
やりたいこと
- github-changesを実行するnpmはsudoを使う
- 開発中のnpmのバージョンは最新にしたい
- WSLで完結させる
結論
-
sudo su -
でrootになってからnpmをインストール-
/root/.nodenvなどにインストールしても良いし、拘らなければ
apt install npm
でも良い
-
/root/.nodenvなどにインストールしても良いし、拘らなければ
- 別途nodenv等を使って入れたnpmにパスを通す
-
sudo which npm
とwhich 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を貼り付けておきます
Discussion