考え方の話なので、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を貼り付けておきます