Arch系Linuxでの各言語パッケージ管理

専門

UbuntuでAPTを使っていたときは気にならなかったが、Arch系Linux(ここではPACMANでパッケージ管理するLinuxを指す)では少々気を付けなければならない点がいくつか存在する。

各言語のパッケージ管理ツールとの衝突

Pythonにはpip, Node.jsにはnpmというパッケージ管理ツールが存在する。

これらの言語用パッケージの導入をする場合、多くのWEBサイトでは

pip install <PACKAGE>
npm install -g <PACKAGE>
と書かれていることが多い。
しかし、pipやnpmをPACMANを用いてインストールしていた場合、パッケージのインストール先もグローバル環境になるため、管理者権限が必要になる。
sudo  [上記のコマンド]
この方法でパッケージの導入はできるのだが、実はPACMANでも同様のパッケージが存在していた場合に後々エラーが発生する可能性がある。
ファイルは既に存在しています
PACMANを用いてインストールしようとしたパッケージが他のパッケージ管理ツールで導入済のパッケージに依存していた場合、PACMANで該当のパッケージをインストールしようとする。(PACMANでは管理されていないため、依存関係を処理できない)
しかし、実際は既に導入されているためにファイルが存在し、書き込みに際してエラーが発生する。

対策1 グローバル環境のパッケージ管理はPACMANで一括管理

上記の問題は複数のパッケージ管理ツールを用いて行ったことが原因である。

そのため、管理者権限を要するパッケージ管理はPACMANに統一すればよい。

例えば、pipの新しいバージョンが存在していた場合、

python -m pip install –upgrade pip
というコマンドでの更新を促されるが、pip自体はPACMANで管理されているため、
sudo pacman -Syu
として更新した方がベターである。(PACMANでは依存関係処理のために全パッケージの同時更新を行い、パッケージ単体の更新には非対応)
この手法では全体更新を行うため、単一パッケージのバージョン更新は不可能であるため、「パッケージ単体での更新をしたい」といった場合は次の対策2,3を行う。

対策2 パッケージをユーザーフォルダ下で管理する

言語パッケージ及びパッケージ管理ツールをPACMAN非依存でユーザーフォルダ下にインストールした場合は、パッケージの導入に管理者権限を必要としない。

しかし、PACMANでは管理されていないために依存パッケージが導入済であっても重複してインストールされる。(インストール場所はもちろん異なるが…)

また、ローカル環境にインストールしてパスを通す、といった方法であれば各言語用パッケージ管理ツールを用いても依存関係のエラーは起こりにくい。

pip install –user <PACKAGE>
※npmはプロジェクトごとに管理を行う仕様のため、ローカル環境にインストールしてもパスを通さなければ一般に使用できない

余談ではあるが、Rustのパッケージ管理ツールCargoは標準で~/.cargoにパッケージを導入するので便利だと思う。

対策3 プロジェクト, 仮想環境単位でのパッケージ管理を行う

方針としては対策2と同様である。

python -m venv [env_name]
npm init

しかし、各仮想環境内で用いる同一パッケージはグローバル環境にインストールした方が便利であるため、適宜手法の取捨選択が必要となる。

PACMAN管理のパッケージのバージョン依存

基本的にPACMANでは最新のパッケージを導入する。

利用したいパッケージが以前のバージョンでしか使えないといった問題に度々直面する。

対策 PACMANでの管理を止める

バージョン関係の依存が多い場合は、言語ごとのパッケージ管理ツールを用いてプロジェクト/仮想環境単位で管理するべきである。

この問題に直面した場合は、該当パッケージをPACMANで削除して、各言語のパッケージ管理ツールでインストールし直せばよい。

# example

# PACMAN管理のパッケージの削除
sudo pacman -Rs <PACKAGE>

# (仮想環境の作成)
python -m venv venv

# 仮想環境へのアクティベート
source .venv/bin/activate

# パッケージの導入
pip install <PACKAGE>

 「ファイルが存在します」が直らない

上記とは逆で、PACMANでの管理に変更したい場合に「ファイルが存在します」といったエラーで導入できないケースが存在する。

これは他のパッケージ管理ツールでファイルを削除しきれなかったことに起因する。

対策 PACMANでファイルを上書きする

最終手段ではあるが、PACMANでは--overwrite "*"というオプションをつけることで存在するファイルの上書きが可能である。

他のパッケージ管理ツールで管理されている場合は別の問題が発生する可能性があるが、該当パッケージ/ファイルが独立している時に限って上書きするのもひとつの手である。

sudo pacman -S <PACKAGE> –overwrite “*”

記事の修正に関して

本記事は筆者の実経験から執筆したものであるが、経験/知識不足から適さない手法を紹介してしまっている可能性もある。

もし間違っている部分があったならば、本記事のコメント欄ないしは本ブログのTwitterアカウントにDMを送って頂けると有難い。その場合は早急に修正を行う所存である。

コメント

タイトルとURLをコピーしました