LoginSignup
0
0

More than 1 year has passed since last update.

archlinuxに異なるバージョンのパッケージを同居させたい

Posted at

はじめに

本記事は、archlinuxで異なるバージョンのパッケージを同居させる手順(備忘録)です。
※元作業の関係上、基本的にルートユーザーで作業を行っています。

背景・やったこと

  • archlinuxを使う中で古いバージョンのパッケージを使う必要が出てきた(nodejs)
  • それにあたって関連パッケージもバージョンを落とす必要が出た(npm, icu)
  • しかし最新版がないと動かないモジュールもあった(→ icuは最新版も必要)

本記事では nodejs, npm, icu の3つのパッケージが登場しますが、やったこととしては以下の通りです。

  • icuの複数バージョンを同居させた ←タイトルの件
  • nodejs, npmは古いバージョンにした

バージョンを落とすためのモジュールを導入

archlinuxでは「基本的にパッケージは最新版を使う」という思想があるらしく、pacmanなどではバージョンを落とすことができません。
そのため、downgradeというモジュールをgit経由でインストールします。

gitのインストール

pacman -S --noconfirm git

downgradeのインストール

# 作業用ディレクトリの作成
mkdir /work
chmod 777 /work

# 後続のmakepkgコマンドがrootで実行できないため、一般ユーザーにスイッチ
su - arch
# git clone
cd /work
git clone https://aur.archlinux.org/downgrade.git

# downgradeパッケージのインストール
cd /work/downgrade
makepkg -si
(ユーザーのパスワードを入力したり、Yの入力をする)

# ルートユーザーに戻る
exit

ダウングレードと複数バージョンの同居

nodejs, npmの最新版をインストール

# nodejsのインストール
pacman -S --noconfirm nodejs npm

nodejs, npmをダウングレード

先ほどインストールしたdowngradeを使ってパッケージのバージョンを落とします。

# nodejsをダウングレード
downgrade nodejs
16.6.1
(Proceed with installation? [Y/n] には Yとしておき、
  add nodejs to IgnorePkg? [y/N] にも yとしておく)

# npmをダウングレード(nodejs16.6.1に対応するのが7.20.3だった)
downgrade npm
7.20.3
(Proceed with installation? [Y/n] には Yとしておき、
  add nodejs to IgnorePkg? [y/N] にも yとしておく)

# nodeのバージョン確認を行うと、libicui18n.so.69 がないというエラーが出る
node --version
node: error while loading shared libraries: libicui18n.so.69: cannot open shared object file: No such file or directory

libicuiをダウングレードする

最終的に最新版も入れますが、一旦downgradeを使って同居させたいバージョンまで落とします。

# icuをダウングレード
downgrade icu
69.1
(Proceed with installation? [Y/n] には Yとしておき、
  add nodejs to IgnorePkg? [y/N] には Nとしておく)

古いバージョンのファイルを退避

このままではバージョン更新で上書きされてしまうので、古いパッケージの置き場を作り移動します。

# 古いパッケージが入ったことを確認し、old用のフォルダへ移動する
## 69.1のバージョンが入っていることを確認する
ls -l /usr/lib/libicu*

# 古いバージョンを退避するディレクトリ作成
mkdir -p /usr/lib_old

# libicuから始まるパッケージを退避する
ls -l /usr/lib/libicu* | grep '^-' | while read line; do
   org_path=$(echo $line | awk '{print $9}')
   file_name=$(echo $org_path | awk -F '/' '{print $NF}')
   cp -p $org_path /usr/lib_old/$file_name
   echo "copy $file_name"
done

# 退避したファイルの確認
ls -l /usr/lib_old

libicuiを最新化する

# ダウングレード&ignoreの設定の解除
# downgradeした際に、icuが自動更新をしない設定になっている場合は解除する
grep 'IgnorePkg =' /etc/pacman.conf

# pacman.confの変更
vim /etc/pacman.conf
>>> vim変更内容 >>>
# IgnorePkg の設定からicuを削除(ある場合)
<修正後サンプル>
IgnorePkg = nodejs npm
<<< vim変更内容 <<<

# icuを最新化
pacman -Syu --noconfirm icu

退避した古いバージョンのicuファイルにリンクを貼る

archlinuxのライブラリの使用上、/usr/lib/配下にリンクが貼ってあれば動く様なので先ほど退避したファイルへのリンクを貼ります。

# 現在のlibicuのリンク確認
ls -l /usr/lib/libicu*

# 退避した古いicuファイル
ls -l /usr/lib_old/libicu*

# リンクを貼る
ls -l /usr/lib_old/libicu* | grep '^-' | while read line; do
   old_path=$(echo $line | awk '{print $9}')
   file_name=$(echo $old_path | awk -F '/' '{print $NF}')
   ln -s $old_path /usr/lib/$file_name
   echo "create link to $file_name"
done

# 貼ったリンクの確認
ls -l /usr/lib/libicu*

# パスの読み込み直し
ldconfig

nodeコマンドが実行できることを確認する

node --version

本記事のやり方が正解かは分かりませんが、目的は達成できたので良しとします。

以上

関連記事

0
0
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
0
0