4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Debian busterに存在しないnpmをスクリプトを使わずにインストールする

Last updated at Posted at 2018-04-18

#前置き

(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やらを入れるようにしておわりです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?