#前置き
(2019-07追記)この記事はbusterがまだ開発版でnpmがパッケージ化がされていなかったときに書かれたものです。ただしbusterリリース版のnpmは5.8.0と古いので、別途npmの新バージョンが欲しい場合には有効な記事かもしれません。(追記終わり)
Debian busterにはnodejsパッケージは収録されているのですが、npmは何故かsidかjessieにしか含まれていません。npmぐらい無いと使い物にならないので、それをインストールする方法を見るために公式サイトをあたると「node.jsインストールしたらnpmも入ってるよ」としか書かれてないわけです。また、Node.jsが推奨するインストール方法には以下のようなものが書かれています。
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
……お前、ルート権限で動かすスクリプトをネットで拾ってこさせて中身を見せる余地も与えずに実行させる気かよと。挙句にその中でパッケージを勝手にインストールされて野良リポジトリも登録されると「お前、Debian様がお護りになっている/usrを誰のお赦しを得て勝手に漁って……お前ぇぇぇ!!!!!!?!?!?」って怒りに震えませんか? 私はなる。
もう少し調べると、npmのnpmパッケージのページに単独でインストールする方法が書かれてはいましたが、こうです。
$ curl -L https://www.npmjs.com/install.sh | sh
怖いってば。
そしてこのスクリプト、仕方のないことなのですが、多様なシステムや古いランタイムを識別するといった、Debianにインストールするのに必要のない処理が多数含まれているので、簡単ですが必要なエッセンスを抜き出して記事としてまとめることにしました。
手順
インストールスクリプトであるhttps://www.npmjs.com/install.sh
がやっていることと照らし合わせながら進めていきます。
前提
- nodejsランタイムはDebian busterが提供しているものを使います。結果、
/usr
にインストールされます。 - npmは
/opt/npm
にrootでインストールします。 - 以下の作業は全てrootで行います。
nodejsインストール
# apt install nodejs
ダウンロード
# wget http://registry.npmjs.org/npm/-/npm-5.8.0.tgz
# printf '%s %s\n' 5e4bfb8c2e7ada01dd41ec0555d13dd0f446ddb2 npm-5.8.0.tgz |sha1sum -c -
スクリプトではnpmのtarballの在り処を「メタデータJSONをhttps://registry.npmjs.org/npm/latest
からダウンロードしてsedスクリプトでtarball
の値をスクレイプする」という方法で取得しています。ところで記事を書いている時点ではtarballの在り処はHTTPSではないのですが、スクリプトではメタデータにあるshasumを使ってダウンロードを検証するということはしていません(マジかよ)。shasumなどのtarball自体のメタデータはJSON Pointerでいうと/dist
に格納されていますので、上記のSHA1を信用しないなら確認しましょう。
今後npmが更新されてもこの記事を見ながらインストールする分にはバージョンは5.8.0のままで良いです。どうせすぐ後にnpm i -g npm
で更新されます。
展開・configure
# tar -xzf npm-5.8.0.tgz
# cd package
npmに含まれているconfigureスクリプトはnpmがはじめに内部で使用するnpmrcを生成するものなのですが、引数を順次npmrcに書き込んでいくという単純なものなので、cat(1)で代えています。グローバルの設定ファイルは/etc/opt/npmrc
と/etc/opt/npmignore
に、キャッシュ置き場は/var/cache/opt/npm
とします。
# cat <<_heredoc >npmrc
prefix=/opt/npm
globalconfig=/etc/opt/npmrc
globalignorefile=/etc/opt/npmignore
_heredoc
# cat <<_heredoc >/etc/opt/npmrc
cache=/var/cache/opt/npm
_heredoc
# touch /etc/opt/npmignore
# mkdir -p /var/cache/opt/npm
インストール
# export NO_UPDATE_NOTIFIER=1
# node bin/npm-cli.js install -g
NO_UPDATE_NOTIFIER=1
をしないと、npmのupdate-notifierというパッケージが/root/.config
以下に設定を作って若干ウザいです。
そしてインストールされたnpmで速攻npm自体を更新します。
# /opt/npm/bin/npm install -g npm
この時ついでにyarnも入れとくと良いんじゃないでしょうか
# /opt/npm/bin/npm install -g yarn
これでnpmのインストール自体はOKです。気分によっては、/opt/bin
にバイナリへのリンクを入れときます。
# mkdir -p /opt/bin
# cd /opt/bin
# ln -s ../npm/bin/* ./
この後各プロジェクトでPATHに/opt/npm/bin
やら/opt/bin
やらを入れるようにしておわりです。