動かざることバグの如し

近づきたいよ 君の理想に

Ubuntuで特定のレポジトリを除外してインストールする方法

ここでいうリソースってのはhttp://ap-northeast-1.ec2.archive.ubuntu.com/ubuntuみたいなやつのことを指す リソースのほうが正しいかも?

何がやりたいか

例えばnginxをインストールしようってなったときに、

# apt-cache madison nginx
     nginx | 1.14.0-1~bionic | https://nginx.org/packages/ubuntu bionic/nginx amd64 Packages
     nginx | 1.14.0-0ubuntu1 | http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
     nginx | 1.14.0-0ubuntu1 | http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/main Sources
     nginx | 1.14.0-1~bionic | https://nginx.org/packages/ubuntu bionic/nginx Sources

って状況のUbuntuで、公式レポジトリのhttp://ap-northeast-1.ec2.archive.ubuntu.com/ubuntuを無視してhttps://nginx.org/packages/ubuntuからのみのインストールに限定したいとき用

発端

システムの関係上、Ubuntu 18.04にNodejsのバージョン6をインストールすることになった。

2018年7月17日現在では10が一番新しい安定版になているが、ありがたいことに6.xのパッケージがNodeSourceから公開されている。

早速レポジトリを追加

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
apt install nodejs

インストール完了 見てみるか

# node -v
v8.10.0

は?????

原因

これ、一見nodesourceのバグかと思うけどnodesource側は何も悪くなくて、利用可能なパッケージを見てみると

# apt-cache madison nodejs
    nodejs | 8.10.0~dfsg-2 | http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
    nodejs | 6.14.1-1nodesource1 | https://deb.nodesource.com/node_6.x bionic/main amd64 Packages
    nodejs | 8.10.0~dfsg-2 | http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu bionic/universe Sources

とでる。つまりUbuntu的には8.10 > 6.14となり公式レポジトリの8.xが優先されてインストールされてしまった。ということ(至極当然の判断

が、今回はあくまで6系の最新版をインストールしたかった

解決策1

apt install時にバージョンを指定する。今回の場合だと

apt install nodejs=6.14.1-1nodesource1

で6がインストールされる。が、毎回バージョンを確認しないといけないのもダルいし、次にapt upgradeすると結局8がインストールされてしまう。

解決策2

Debian系にはApt-Pinningという機能があって、指定したパッケージのバージョン固定とかインストールの管理ができるようになっている。

今回はこの機能を使って公式が出している側のNodejsレポジトリを無効化した

/etc/apt/preferences.d/nodejs.pref を以下作成

Package: nodejs
Pin: release c=universe
Pin-Priority: -1 

release cコンポーネント名を指定する。c=コンポーネント名で今回無効化したいのは↑一覧よりbionic/universeなのでuniverseと記述

で、apt updateしたのちにapt install nodejs

これで

# node -v
v6.14.1

やったぜ